1,bean的自动装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中自动寻找,并自动给装配属性
在Spring中由3种装配方式
在xml中显示配置
在java中显示配置
隐式的自动装配bean(重要 )
1.1 环境搭建测试
实体类
public class Dog { public void shout(){ System.out.println("wang~"); } } public class Cat { public void shout(){ System.out.println("miao~"); } } public class People { private Cat cat; private Dog dog; private String name; }
xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="cat" class="com.king.pojo.Cat"/> <bean id="dog" class="com.king.pojo.Dog"/> <bean id="people" class="com.king.pojo.People"> <property name="name" value="king"/> <property name="cat" ref="cat"/> <property name="dog" ref="dog"/> </bean> </beans>
单元测
@Test public void test1(){ ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); People people = context.getBean("people",People.class); people.getCat().shout(); people.getDog().shout(); System.out.println(people.getName()); }
1.2 自动装配(autowire)
<bean id="cat" class="com.king.pojo.Cat"/> <bean id="dog11" class="com.king.pojo.Dog"/> <!-- byName:会自动在容器上下文中查找,和自己对象set方法中形参对应的beanid! 弊端:名字必须是能对应上的 byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean! 弊端:类型必须唯一不能重复 --> <bean id="people" class="com.king.pojo.People" autowire="byType"> <property name="name" value="king"/> </bean>
小结:
byname:需要保证所有的bean的id唯一,并且这个bean需要和自动注入的属性的set方法值一样
byType:要保证所有bean的id的类型是唯一的,并且这个bean需要和自动注入的属性一致
2,注解实现自动装配
jdk1.5支持的注解,spring2.5开始支持注解
The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML
使用注解须知:
1,导入约束,context约束(xmlns:context="http://www.springframework.org/schema/context")
2,配置注解的支持
<?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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config/> </beans>
@Autowired,直接在属性上使用即可!也可以在ser方法使用
使用@Autowired可以省略掉set方法,(智能的,可用byType也可用byName)
科普:
@Nullable 字段标记这个注解,说明这个字段可以为null
也可以
//两种不同注解实现自动配置 //此注解常用 @Autowired @Qualifier(value = "cat2") private Cat cat; //byName的,也可以通过自定义名去找 @Resource(name = "dog3") private Dog dog; private String name;
小结:
@Resource和@Autowired区别
都是自动装配的注解,都可以放在属性字段上
@Autowired 默认byType方式实现,如果没有在走byName,而且必须要求这个对象存在 【常用】
@Resource默认通过byname的方式实现的,如果找不到名字,则按byType的方式实现,如果两个都找不到的情况下,就报错【常用】
执行顺序不同