SpringBoot原理解析(三)- Bean的属性注入方式
文章目录
- [SpringBoot原理解析(三)- Bean的属性注入方式](#SpringBoot原理解析(三)- Bean的属性注入方式)
属性注入是指将需要注入的属性值设置到Bean实例中的操作。Bean的属性可以是基本类型、引用类型,甚至是其他Bean实例。
属性注入通常是在对象创建过程中完成的,Spring容器会在Bean实例化之后,检查Bean定义中的注入配置,将配置的属性值注入到Bean中。通过属性注入,我们可以方便地将外部配置文件的值或其他Bean的引用注入到目标Bean中,从而实现组件之间的关联和依赖
Spring提供了多种方式来进行Bean的属性注入,包括构造器注入、Setter方法注入、字段注入等。可以选择适合自己需求的注入方式,并根据具体情况配置相应的注入元数据,例如XML配置、注解或者Java配置。
1.XML配置
通过配置文件 application.xml
进行属性注入。
1.1.基本类型注入
xml
<bean id="beanA" class="org.ahao.project.bean.BeanA">
<property name="name" value="beanA"></property>
</bean>
1.2.引用类型注入
xml
<bean id="beanC" class="org.ahao.project.bean.BeanC">
<property name="beanA" ref="beanA"></property>
</bean>
1.3.集合类型注入
xml
<bean id="beanA" class="org.ahao.project.bean.BeanA">
<property name="name" value="beanA"></property>
<property name="list">
<!-- 数组类型:<array>,List集合:<list>,Set集合:<set>,Map集合:<map>-->
<list>
<value>123</value>
<value>456</value>
<value>789</value>
<!-- 如果是引用类型,使用ref元素
<ref></ref>
-->
</list>
</property>
</bean>
2.@Value
注解@Value
用于实现属性的值注入。它提供了一个简单而灵活的方式,可以将配置文件中的值注入到Bean的属性中。
2.1.基本类型注入
java
/**
* 使用`${}`表达式来获取配置文件中的属性值
*/
@Value("${myBean.name}")
private String name;
/**
* 使用SpEL表达式来动态计算属性的值。
*/
@Value("#{T(java.lang.Math).random() * 100}")
private Double aDouble;
2.2.引用类型注入
java
@Value("#{beanA}")
private BeanA beanA;
2.3.集合类型注入
配置文件application.xml
yml
myBean:
name: ceshi
list: 1,2,3
java
@Value("${myBean.list}")
private List<String> list;
对于Map类型会有一点特殊,见以下说明。
1.json字符串格式
yml
myBean:
map: "{'a':'1','b':'2'}"
java
@Value("#{${myBean.map}}")
private Map<String,Integer> map;
2.正常的配置格式
yml
myconfig:
map:
a: 1
b: 2
java
@Data
@Configuration
// 通过`prefix`属性指定配置文件中属性的前缀
@ConfigurationProperties(prefix = "myconfig")
public class MyConfig {
private Map<String,Integer> map;
}
3.@Autowire
@Autowire
通过类型匹配自动装配一个或多个Bean。
3.1.根据类型注入
java
@Autowired
private BeanA beanA;
3.2.根据类型+名称注入
结合@Qualifier
注解,用于指定具体要注入的Bean的名称。
java
@Autowired
@Qualifier("beanInf1")
private BeanInf beanInf;
3.3.集合类型注入
java
@Autowired
private List<BeanInf> beanInf;
3.4.setter方法
@Autowire
还可以作用于setter方法,但是不是通常意义上的setter方法,其实只要方法参数类型均为Bean类,并且能找到唯一的那个Bean实例。
java
@Autowired
public void setBeanInf(List<BeanInf> beanInf) {
this.beanInf = beanInf;
}
// 通过"非setter方法注入"
// @Autowired
// public void ssssetBeanInf(List<BeanInf> beanInf) {
// this.beanInf = beanInf;
// }
4.@Resource
@Resource
是一个JavaEE的标准注解,可以用于依赖注入和资源查找。
@Resource
注解默认通过名称进行查找和注入,如果名称无法匹配到对应的Bean则会根据类型进行匹配。也可以通过name
属性来指定具体的名称,但是这种方式下如果名称无法匹配到对应的Bean或资源,会报错。
java
@Resource
private BeanA beanInf;
// 这种会报错,不存在名称为beanInf的BeanA类型的bean
@Resource("beanInf1")
private BeanA beanInf1;
5.构造器注入
在Spring中,构造器注入是一种常用的依赖注入方式,它通过构造器来实现对类的依赖关系进行注入。构造器注入可以确保依赖的实例在创建对象时已经被注入,从而使对象在创建后处于完全可用的状态。
需要注意的是,构造器注入是一种强制性的注入方式,即如果没有提供正确的依赖项,将无法创建所需的实例。
5.1.注入单个Bean
java
@Data
@Component
public class BeanC {
private BeanA beanA;
public BeanC(BeanA a){
beanA = a;
System.out.println("属性beanA:"+a);
}
}
5.2.注入多个Bean
java
@Data
@Component
public class BeanC {
private BeanA beanA;
private BeanB beanB;
public BeanC(BeanA a, BeanB b){
beanA = a;
System.out.println("属性beanA:"+a);
beanB = b;
System.out.println("属性beanB:"+b);
}
}
5.2.注入Bean集合
java
@Data
@Component
public class BeanC {
private List<BeanInf> beanInfList;
public BeanC(List<BeanInf> beanInfList){
this.beanInfList = beanInfList;
System.out.println("属性beanInfList:"+beanInfList);
}
}
6.Aware接口注入
Aware接口是Spring框架提供的一种特殊机制,可以实现在Bean中注入Spring框架提供的相关对象,比如ApplicationContext
、BeanFactory
等。通过实现Spring中的Aware接口,可以在Bean中获取到Spring框架的相关资源,进行更灵活的操作。
java
@Component
public class AwareTest implements ApplicationContextAware {
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
}