Spring中bean有三种装配机制
- 一、在xml中显示装配
- 二、 在java中显式装配,都需要在Config配置类重写
- 三、自动装配
- 1. xml方式自动装配
- 2. 使用注解
装配等于依赖关系注入,即一个Bean作为属性,装配到另一个Bean。
一、在xml中显示装配
<!--1. 类装配-->
<!--csBean类有两个属性:title和author-->
<bean name="cdBean" class="com.my.spring.bean.CDBean">
<property name="title" value="The World!!"/>
<property name="author" value="Mr.D"/>
</bean>
<!--csPlayer类有一个属性:cdBean-->
<!--对csPlayer的属性csBean进行依赖注入,称为Bean装配,或者依赖关系注入-->
<bean name="cdPlayer" class="com.my.spring.service.impl.CDPlayerImpl">
<property name="cdBean" ref="cdBean"/>
</bean>
二、 在java中显式装配,都需要在Config配置类重写
- 实体类
@Component
public class User {
private String name;
public String getName() {
return name;
}
@Value("黑心白莲") //属性注入值
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
- 配置类
// @Configuration代表这是一个配置类,就和我们之前看的beans.xml
@Configuration
@ComponentScan
public class KuangConfig {
/*
@bean == bean标签
方法名字 == bean标签中id属性
方法返回值 == bean标签中的class属性
*/
@Bean
public User user(){
return new User();
}
}
- 测试类
public class MyTest {
public static void main(String[] args) {
//如果完全使用了配置类方式去做,我们就只能通过 AnnotationConfig 上下文来获取容器,通过配置类的class对象加载!
ApplicationContext context = new AnnotationConfigApplicationContext(KuangConfig.class);
User user = context.getBean("user", User.class);
System.out.println(user.getName());
}
}
三、自动装配
1. xml方式自动装配
1.1、byName: 会自动在容器上下文查找,和自己对象set方法后面的值对应的bean id(通过id匹配)
//实体类
@Data
public class Pepole {
private String name;
private Books books;
private Hobbies hobbies;
<bean id="books" class="com.lmy.pojo.Books"/>
<bean id="hobbies" class="com.lmy.pojo.Hobbies"/>
<bean id="pepole" class="com.lmy.pojo.Pepole" autowire="byName">
<property name="name" value="zhangSan"/>
</bean>
1.2、byType:会自动在容器上下文中查找,和自己对象属性类型相同的bean(通过class匹配)
注意:使用autowire byType首先需要保证:同一类型的bean对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。
<bean id="books" class="com.lmy.pojo.Books"/>
<bean id="hobbies" class="com.lmy.pojo.Hobbies"/>
<bean id="pepole" class="com.lmy.pojo.Pepole" autowire="byType">
<property name="name" value="zhangSan"/>
</bean>
2. 使用注解
注解开发注意事项
2.1、@Autowied装配方式
按类型装配(默认使用的装配方式)。
按名称装配(结合@Qualifier注解使用)。
public class Pepole {
private String name;
//1. 通过名字装配
@Autowired
@Qualifier("books1")
private Books books;
//2. 通过类型装配
@Autowired
private Hobbies hobbies;
}
<!--开启属性注解支持!-->
<context:annotation-config/>
<bean id="books2" class="com.lmy.pojo.Books"/>
<bean id="books1" class="com.lmy.pojo.Books"/>
<bean id="hobbies" class="com.lmy.pojo.Hobbies"/>
<bean id="pepole" class="com.lmy.pojo.Pepole"/>
2.2、@Resource装配方式
@Resource指定按type自动装配
@Resource(type = Books.class)
private Books books;
@Resource指定按name自动装配:
@Resource(name = "books")
private Books books;
2.3、@Autowired与@Resource区别