一、创建一个spring项目
- 为了使用Spring的原生api,首先要创建一个只基于Spring的项目.
- 创建maven项目
- 引入spring依赖(不要使用6版本以上的,6的最低兼容jdk为jdk17)
- 创建spring配置文件
-
这个配置文件的名称固定,但是必须是xml文件,建议命名为spring-config.xml
-
这个配置文件必须放在Resource目录下
-
配置文件的基本内容为
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"></beans>
-
二、在配置文件中配Bean对象
-
首先要明确的是:
什么是Bean对象?
答:Bean对象就是往Spring容器中装入的对象,和一般的类对象没有什么不同,只是因为这些对象的创建使用销毁都有Spring管理,为了区分就把它们叫做Bean对象。- 如何添加对象得到Spring容器中?
-
在配置文件中配置Bean标签,标签的class属性的值就是Bean对象类的路径,id属性就是bean对象的名称,在读取Bean对象时,需要用到id。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><bean id="user" class="com.java.demo.enity.User"></bean> </beans>
-
使用注释(五大类注释和一个方法注释)并添加配置文件
- @Component,@Controller,@Service,@Repository,@Configuration,这就是五大类注解,只要在类定义的前面加上任何一个注解,这个类对象就会被存入一份到Spring容器中
- @Bean,这是方法注解,只要在有返回值的方法前面加上这个注解,就可以直接将返回的对象装入Spring容器中,@Bean的方法必须是在类注释下的类里面的方法
- 要想Spring容器正确识别注释从而获取Bean对象,需要对Spring容器进行配置,base-package的路径就是Spring容器扫描的根路径,Spring会扫描这个路径下的所有类,检查是否有类注释和方法注释。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:content="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><content:component-scan base-package="com.java.demo"></content:component-scan> </beans>
-
- 如何添加对象得到Spring容器中?
-
启动Spring容器
-
经过上面的配置,Spring容器已经被指定了要装入哪些Bean对象,但是不将Spring容器启动,这个配置终究只是一个Spring的蓝图而已。
此时,需要一个main方法作为程序启动点,并且在main方法内调用Spring容器的启动方法。
有两个接口可以启动Spring容器,分别是ApplicationContext和BeanFactory,实例化这两个接口就能启动Spring容器,上面的配置文件就是实例化这两个类的参数。- BeanFactory获取Spring容器(老版本,不推荐)
BeanFactory factory=new XmlBeanFactory(new ClassPathResource("spring-config1.xml"));
- ApplicationContext获取Spring容器(新版本,推荐)
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
这两种方式获取Spring容器都要将配置文件的名字传参。
每创建一个这个对象,就是启动了一个spring容器,在一个程序中,创建多个对象,每个对象传入不同的配置文件,每个对象都只会根据配置文件去启动不同spring容器,并且每个容器的bean都是独立的,不共享的。
BeanFactory和ApplicationContext的区别是:
(1)ApplicationContext是一创建对象就立马将spring配置文件中的所有Bean对象全部加载到容器中,BeanFactory是使用到这个Bean对象时,才会加载到容器中。
(2)ApplicationContext是BeanFactory的子类,它继承了BeanFactory的所有方法,并且还拓展了一些功能。 - BeanFactory获取Spring容器(老版本,不推荐)
-
通过启动后的spring容器来取出Bean对象(三种方式,只传类,只传id值,传类又传id值)
-
只传类对象(根据类型在容器中查找对应Bean对象,容器中没有这个类型,或者有多个这个类型就会报错)
context.getBean(BeanLife.class);
-
只传id值(根据id值在spring容器中查找对象,获取到的bean是一个Object对象,需要强转成想要的类型,没有这个id或者有多个id就会报错)
context.getBean("beanLife");
-
即传id值又传类对象(根据id值和class对象去查找bean对象)
context.getBean("beanLife", BeanLife.class);
此时如果容器中有两个Bean的id和class都相同,获取到的Bean是优先级低的那个,可以再添加类注解的地方再加上@Order(int)来设置优先级,int越小的,越先被加载进入容器,也就会被覆盖。
此时问题就来了
使用注解加入Spring容器的对象的id名是啥?
答:默认id是类名的大驼峰形式改成小驼峰(类名首字符小写),但是当类名的前两个字母都是大写时,id默认是原类名,方法注释获取的对象,默认id名称就是方法名。并且使用类注释添加Bean对象时,可以再添加的时候设置value属性来设置Bean的名称,在使用方法注释添加Bean对象时,可以使用name属性来设置别名,方法注释的name属性可以设置多个名称,用String数组表示。
注意:
1. 当设置了别的名字后,默认的名字就不能用了
2. 当有两个方法注释获取到的Bean对象的id一样,class也一样时,最后从Spring中获取到的Bean只有其中一个,谁先加载,谁就被覆盖了。可以使用@order(int值)来设置加载优先级,数越小,优先级越高,越快被加载,也就是被覆盖的那个。
3. @Bean获取的方法不能有参数 -
-