在Spring Boot
框架中,注入实体Bean
是几乎每一个Java程序员都能遇到的事情,因为Spring Boot
采用约定优于配置的策略,去除了原来在Spring MVC
中通过Xml进行注入的方式,全部通过Java Configuration的编码方式进行实体Bean
的注入,
因此我们在开发中,对于外部组件、自己封装的业务SDK等等都需要开发者自行将实体Bean注入到Spring
的容器中,然后通过注解在Spring
的框架中方便的进行使用
那么,在Spring Boot
框架中,我们在注入实体Bean
时,如何优雅的进行注入呢?或者我们在注入实体Bean
的同时,我们应该注意什么?
常规注入
常规注入很简单,通过使用@Bean
注解即可完成简单的实体Bean注入,如下示例:
@Configuration
public class AdminKernelConfig {
@Bean
public DynamicWechatRoute dynamicWechatRoute(){
return new DynamicWechatRoute();
}
}
在常规注入时,假如我们要注入的Bean是通过构造函数来创建的,此时主要有2中方式进行构造
通过@Autowired
注解引入外部依赖Bean,然后传递进行构造,如下代码:
@Configuration
public class AdminKernelConfig {
@Autowired
Environment environment;
@Bean
public DynamicWechatRoute dynamicWechatRoute(){
return new DynamicWechatRoute(environment);
}
}
另外也可以通过参数传递直接引用,代码如下:
@Configuration
public class AdminKernelConfig {
@Bean
public DynamicWechatRoute dynamicWechatRoute(Environment environment){
return new DynamicWechatRoute(environment);
}
}
配置注入
很多时候我们创建的实体类都是需要通过外部传参进行构造的,通过基础类型参数或者封装的实体Property类进行构造,一般外部参数是通过写在Spring Boot的配置中
通过@Value
注解引入外部变量进行实体Bean构造,如下:
@Configuration
public class AdminKernelConfig {
@Value("${signKey}")
String signKey;
@Bean
public DynamicWechatRoute dynamicWechatRoute(){
return new DynamicWechatRoute(signKey);
}
}
上面这种是很常规简单的做法,我们构造的实体类只需要一个基础String类型即可完成构造
但通常情况下,外部参数通常都很多,这种情况我们通常会单独写一个配置属性类进行封装,然后在实体类中通过该配置属性类进行参数构造,通过@EnableConfigurationProperties
和@ConfigurationProperties(prefix = "your.prefix")
这两个注解配合使用实现效果
@ConfigurationProperties
注解作用于我们的配置属性类上,配置一个前缀属性即可,例如:
@ConfigurationProperties(prefix = "test")
public class TestProperties {
private String accessKeyId;
private String accessKeySecret;
//getter & setter
}
配上属性前缀test
,此时我们可以在application.yml
的配置文件中进行配置,代码如下:
test:
accessKeyId: abc
accessKeySecret: cdeeeeeeeeeeeee
配置好后,我们在我们的JavaConfiguration配置类即可进行引用注入,如下:
@Configuration
@EnableConfigurationProperties(TestProperties.class