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