您的位置:首页 > 娱乐 > 八卦 > SpringBoot原理解析(三)- Bean的属性注入方式

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

2024/10/6 12:13:26 来源:https://blog.csdn.net/qq_51513626/article/details/140914587  浏览:    关键词:SpringBoot原理解析(三)- Bean的属性注入方式

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

@Component
public class AwareTest implements ApplicationContextAware {private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext;}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com