文章目录
前言
自动装配是spring满足bean依赖的一种方式。
spring会通过在上下文寻找匹配,实现bean的自动装配。
注意:我们这里指的是引用数据类型的属性实现自动装配
spring中的三种装配的方式:
- 在xml中显式的配置
- 在Java中配置
- 在xml中隐式的配置【**】
环境搭建:
school:
public class School {
public void getName(){
System.out.println("济南市第一中学");
}
}
family:
public class Family {
public void getNums(){
System.out.println("爸爸、妈妈、爷爷、奶奶");
}
}
person:
public class Person {
private String name;
private School school;
private Family family;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
public Family getFamily() {
return family;
}
public void setFamily(Family family) {
this.family = family;
}
}
一.使用xml文件实现自动装配
在xml中的< bean >中使用autowire
1.在xml中通过byName进行自动装配
使用byName进行自动装配时候的注意事项
- bean的id必须与被装配的实体类中的setXXX()中的参数名相同
- 在beans中的bean的id必须具有唯一性。
beans.xml文件:
<bean id="school" class="com.sdpei.beans.School"/>
<bean id="family" class="com.sdpei.beans.Family"/>
<bean id="person" class="com.sdpei.beans.Person" autowire="byName">
<property name="name" value="寒江"/>
</bean>
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getName());
person.getFamily().getNums();
person.getSchool().getName();
}
2.在xml中通过byType进行自动装配
使用byType进行自动装配时候的注意事项:
- bean的class必须与被装配的实体类中的setXXX()中的参数类型相同
- 在beans中的bean的class必须具有唯一性。
beans.xml文件:
<bean id="school" class="com.sdpei.beans.School"/>
<bean id="family" class="com.sdpei.beans.Family"/>
<bean id="person" class="com.sdpei.beans.Person" autowire="byType">
<property name="name" value="寒江"/>
</bean>
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getName());
person.getFamily().getNums();
person.getSchool().getName();
}
二.使用注解@Autowired实现自动装配
好处:
1.结构清晰
2.无需响应的setXxx() 方法
导入约束:
<?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:通过byType进行装配.
@Autowired(required = false):表示被注解标记的对象可以为null.
@Autowired+@Qualilier(value="xxx "):value为bean的id.
@Resource:先通过byName进行装配,再通过byType进行装配.
@Resource(value=" xxx"):value为bean的id.
创建并配置beans.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"
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>
<bean id="school" class="com.sdpei.beans.School"/>
<bean id="family" class="com.sdpei.beans.Family"/>
<bean id="person" class="com.sdpei.beans.Person">
<property name="name" value="寒江"/>
</bean>
</beans>
</beans>
1.使用@Autowired进行自动创配
当时用@Autowired时,会根据byType进行装配。
所以,要确保在beans中的bean的class必须具有唯一性。
代码:
public class Person {
private String name;
@Autowired
private School school;
@Autowired
private Family family;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public School getSchool() {
return school;
}
public Family getFamily() {
return family;
}
}
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans2.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getName());
person.getFamily().getNums();
person.getSchool().getName();
}
2.使用@Autowired+@Qualilier(value="xxx ")进行自动创配
当beans中的class不存唯一性的时候,我可以使用@Autowired+@Qualilier(value="xxx ")的组合,通过bean的id来实现自动装配。
xml文件:
<beans>
<bean id="school" class="com.sdpei.beans.School"/>
<bean id="school2" class="com.sdpei.beans.School"/>
<bean id="family" class="com.sdpei.beans.Family"/>
<bean id="family2" class="com.sdpei.beans.Family"/>
<bean id="person" class="com.sdpei.beans.Person">
<property name="name" value="寒江"/>
</bean>
</beans>
代码:
public class Person {
private String name;
@Autowired
@Qualifier(value = "school2")
private School school;
@Autowired
@Qualifier(value = "family2")
private Family family;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public School getSchool() {
return school;
}
public Family getFamily() {
return family;
}
}
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans2.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getName());
person.getFamily().getNums();
person.getSchool().getName();
}
3.使用@Resource进行自动创配
默认使用byName的方式实现自动装配,若通过byName找不到,那么会使用byType的方式进行自动化装配
xml文件:
<beans>
<bean id="school" class="com.sdpei.beans.School"/>
<bean id="school2" class="com.sdpei.beans.School"/>
<bean id="family" class="com.sdpei.beans.Family"/>
<bean id="family2" class="com.sdpei.beans.Family"/>
<bean id="person" class="com.sdpei.beans.Person">
<property name="name" value="寒江"/>
</bean>
</beans>
代码:
import javax.annotation.Resource;
/**
* @author huxuehao
* @create 2021-06-27-13:26
*/
public class Person {
private String name;
@Resource
private School school;
@Resource
private Family family;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public School getSchool() {
return school;
}
public Family getFamily() {
return family;
}
}
测试:
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans2.xml");
Person person = context.getBean("person", Person.class);
System.out.println(person.getName());
person.getFamily().getNums();
person.getSchool().getName();
}
补充:比较@Autowired与@Resource的比价
- 二者都是 用来实现自动装配的,都是作用域属性的字段上。
- @Autowired是通过byType的方式进行自动装配的,要求beans中的class的唯一性。
- @Resource默认使用byName的方式实现自动装配,若通过byName找不到,那么会使用byType的方式进行自动化装配