文章目录
概念
Spring中有三种装配方式:
1.xml中显式配置
2.java中显式配置
3.隐式自动装配。自动装配是Spring满足bean依赖的一种方式,Spring会在上下文中自动寻找并自动给bean装配属性
自动装配方式
-
no(default):不自动装配,需使用ref参数注
-
byName:根据名称自动装配
-
byType:根据类型自动装配
-
constructor:根据构造函数自动装配
示例
①使用xml方式装配
1.新建两个实体类Bond和User,Bond被User依赖引用
public class Bond {
public void price() {
System.out.println("rise");
}
}
public class User {
private Bond bond;
private String name;
//自动生成set、get、toString方法
}
2.编写Spring配置文件ApplicationContext.xml,使用参数ref注入bean
<bean id="bond" class="com.xia.pojo.Bond"/>
<bean id="user" class="com.xia.pojo.User">
<property name="bond" ref="bond"/>
<property name="name" value="张三"/>
</bean>
3.测试
public class Test1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
User user = (User) context.getBean("user");
user.getBond().price();
}
}
1.使用byName方式自动装配
修改配置文件ApplicationContext.xml,添加参数autowire=“byName”,省去ref参数注入bean,自动注入对象必须要有set 方法。
使用byName方式后,会自动在容器上下文查找和自己bean对象类中set方法里的值所对应的bean id,若配置文件中注册的bean id相同,则自动配置,保证bean的id唯一且bean和自动注入的属性的set方法中的值一致即可
<bean id="bond" class="com.xia.pojo.Bond"/>
<bean id="user" class="com.xia.pojo.User" autowire="byName">
<property name="name" value="张三"/>
</bean>
2.使用byType方式自动装配
修改配置文件ApplicationContext.xml,添加参数autowire=“byType”,自动注入对象必须要有set 方法。
使用byName方式后,会自动在容器上下文查找和自己bean对象属性类型相对应的bean,若bean类型相同,则自动配置。不需要保证bean id相对应,bean id甚至可以省略,但必须保证该类型全局唯一,否则报错
<bean id="bond" class="com.xia.pojo.Bond"/>
<bean id="user" class="com.xia.pojo.User" autowire="byType">
<property name="name" value="张三"/>
</bean>
3.使用constructor自动装配
修改配置文件ApplicationContext.xml,添加参数autowire=“constructor”,需要自动注入的Bean对象类中可以省去set方法。
<bean id="bond" class="com.xia.pojo.Bond"/>
<bean id="user" class="com.xia.pojo.User" autowire="constructor">
<property name="name" value="张三"/>
</bean>
②使用注解自动装配
注解使用前提
1.在Spring配置文件的命名空间中导入context约束
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
2.开启注解支持【重点!易忘】
<context:annotation-config/>
完整配置文件即
<?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自动装配
修改配置文件,bean中的依赖等属性不需再进行配置
<bean id="bond" class="com.xia.pojo.Bond"/>
<bean id="user" class="com.xia.pojo.User"/>
在需要自动注入的对象类属性或者set方法上添加注解@Autowired,也可以省去set方法,前提是该自动装配的属性在IoC容器中存在,注意配置文件中id要和对象类属性名称相同,规则类似于byName,根据名称查询
public class User {
@Autowired
private Bond bond;
private String name;
//自动生成set、get、toString方法
}
@Autowired存在一个属性required,若配置**@Autowired(required=false)** ,则说明该对象可以为null;默认required为true,即必须存在对象,不可为空值。使用注解@Nullable同样可以标记该方法/字段/参数允许为null
public class User {
@Autowired(required=false)
private Bond bond;
private String name;
//自动生成set、get、toString方法
}
若@Autowired自动装配环境较为复杂,单独一个注解@Autowired不可正常自动装配,即同时注册了多个相同类型bean,不再满足byName规则时,可以配合使用注解@Qualifier来指定一个bean id进行注入
public class User {
@Autowired
@Qualifier(value = "bond")
private Bond bond;
private String name;
//自动生成set、get、toString方法
}
使用注解@Resource自动装配
java的注解实现Bean注入。与注解@Autowired使用方法类似,在对象属性上添加注解@Resource即可使用,同样配置中不需手动写入值
<bean id="bond" class="com.xia.pojo.Bond"/>
<bean id="user" class="com.xia.pojo.User"/>
public class User {
@Resource
private Bond bond;
private String name;
//自动生成set、get、toString方法
}
注解@Resource默认先通过byName的方式查找,若找不到则通过byType的方式实现。两个都找不到就会报错。
与注解@Autowired搭配@Qualifier类似,在自动装配环境复杂导致难以满足byName或byType的规则时,可以通过设置@Resource的属性name来指定一个bean id来进行自动装配
public class User {
@Resource(name = "bond")
private Bond bond;
private String name;
//自动生成set、get、toString方法
}
@Autowired与@Resource的异同
- 都可通过在对象属性上添加注解进行自动装配
- @Autowired默认通过byType的规则装配,要求该对象必须存在不为空(但可以设置required属性为false使之允许为空),若想使用名称装配可以结合@Qualifier注解进行使用
- @Resource先通过byName的规则查找,找不到名称相对应的就通过byType的规则实现,都找不到就报错(但可以通过设置name属性指定bean id实现)