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;
    }
}
相关推荐
儿时可乖了5 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol7 分钟前
java基础概念37:正则表达式2-爬虫
java
xmh-sxh-131423 分钟前
jdk各个版本介绍
java
XINGTECODE37 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码42 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构
程序猿进阶43 分钟前
堆外内存泄露排查经历
java·jvm·后端·面试·性能优化·oom·内存泄露
FIN技术铺1 小时前
Spring Boot框架Starter组件整理
java·spring boot·后端
小曲程序1 小时前
vue3 封装request请求
java·前端·typescript·vue
凡人的AI工具箱1 小时前
15分钟学 Go 第 60 天 :综合项目展示 - 构建微服务电商平台(完整示例25000字)
开发语言·后端·微服务·架构·golang
陈王卜1 小时前
django+boostrap实现发布博客权限控制
java·前端·django