Bean的自动装配
自动装配是spring满足bean依赖一种方式
spring会在上下文中自动寻找,并自动给bean装配属性
在spring中有三种装配的方式
1,在xml中显示的配置
2,在Java中显示配置
3,隐式的自动装配bean【重要】
byName自动装配
<!--
byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid!
-->
<bean id="people" class="com.tan.pojo.People" autowire="byName">
<property name="name" value="枫叶"/>
</bean>
byType自动装配
<!--
byName:会自动在容器上下文中查找,和自己对象set方法后面的值对应的beanid!
byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean!
-->
<bean id="people" class="com.tan.pojo.People" autowire="byType">
<property name="name" value="枫叶"/>
</bean>
小结:
byNmame的时候,需要保证所有bean的id唯一,并且这个需要和自动注入的属性的set方法的值一致
byType的时候,需要保证所有bean的class唯一,并且这个需要和自动注入的属性的类型一致
使用注解实现自动装配
基于注释的配置的引入提出了一个问题,即这种方法是否比 XML“更好”。简短的回答是“视情况而定”。长答案是,每种方法都有其优缺点,通常,由开发人员决定哪种策略更适合它们。
要使用注解须知:
1,导入context约束
2,配置注解的支持<context:annotation-config/>
@Autowired
直接在属性上使用即可!也可以在set方式上使用!
使用Autowired我们可以不用编写set方法了,前提是你这个自动装配的属性IOC(Spring)容器中存在,且符合名字byName
科普:
@Nullable 字段标记了这个注解,说明这个字段可为Null
public @interface Autowired {
/**
* Declares whether the annotated dependency is required.
* <p>Defaults to {@code true}.
*/
boolean required() default true;
}
测试代码:
public class People {
//如果显示的定义了Autowired的required属性为false,说明这个对象可以为null,否则不能为空
@Autowired(required = false)
private Cat cat;
@Autowired
private Dog dog;
private String name;
小结:
@Resource和@Autowired的区别:
都是用来自动装配的,都可以放在属性字段上
@Autowired通过byType的方式实现,而且必须要求这个对象存在【常用】
@Resource默认通过byName方式实现,如果找不到名字,则通过byType实现!都找不到就报错【常用】
执行顺序不同:
@Autowired通过byType的方式实现,@Resource默认通过byName方式实现