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框架提供的相关对象,比如ApplicationContextBeanFactory等。通过实现Spring中的Aware接口,可以在Bean中获取到Spring框架的相关资源,进行更灵活的操作。

java 复制代码
@Component
public class AwareTest implements ApplicationContextAware {
    
    private ApplicationContext context;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
}
相关推荐
阿伟*rui6 分钟前
配置管理,雪崩问题分析,sentinel的使用
java·spring boot·sentinel
XiaoLeisj2 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
paopaokaka_luck2 小时前
【360】基于springboot的志愿服务管理系统
java·spring boot·后端·spring·毕业设计
dayouziei2 小时前
java的类加载机制的学习
java·学习
码农小旋风4 小时前
详解K8S--声明式API
后端
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
Yaml44 小时前
Spring Boot 与 Vue 共筑二手书籍交易卓越平台
java·spring boot·后端·mysql·spring·vue·二手书籍
小小小妮子~4 小时前
Spring Boot详解:从入门到精通
java·spring boot·后端
hong1616884 小时前
Spring Boot中实现多数据源连接和切换的方案
java·spring boot·后端
aloha_7895 小时前
从零记录搭建一个干净的mybatis环境
java·笔记·spring·spring cloud·maven·mybatis·springboot