SpringBoot原理解析(三)- Bean的属性注入方式

SpringBoot原理解析(三)- Bean的属性注入方式

属性注入是指将需要注入的属性值设置到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: ceshi
  list: 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: 1
    b: 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框架提供的相关对象,比如ApplicationContextBeanFactory等。通过实现Spring中的Aware接口,可以在Bean中获取到Spring框架的相关资源,进行更灵活的操作。

@Component
public class AwareTest implements ApplicationContextAware {
    
    private ApplicationContext context;
    
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        context = applicationContext;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值