@Inject 用法说明
属性 | 说明 |
---|---|
value | |
required | 必需的 |
autoRefreshed | 自动刷新(配置注入时有效,且单例才有自动刷新的必要) |
- 可注入到 “类字段”、“静态字段”、“组件构造参数”、“@Bean 方法参数”(不支持属性注入)
- 可支持 “Bean”、“配置”、“环境变量” 注入
1、注入Bean
注入时,如果目标 bean 已存于容器中,则直接注入。如果未存在则进行订阅注入,即当目标 bean 注册时,会自动完成注入;否则字段保持初始值不变。
根据类型注入 bean
@Component
public class UserService{
}
@Controller
public class Demo{
@Inject
UserService userService;
}
根据名字注入 bean
@Component("userService")
public class UserService{
}
@Controller
public class Demo{
@Inject("userService")
UserService userService;
}
注入一批 Bean
@Component
public class DemoService{
@Inject
private List<EventService> eventServices;
@Inject
private Map<String, EventService> eventServiceMap;
}
@Configuration
public class DemoConfig{
@Bean
public void demo1(@Inject List<EventService> eventServices){ }
@Bean
public void demo2(@Inject Map<String, EventService> eventServiceMap){ }
}
2、注入配置
配置注入时,没有找到相应的属性时会报异常(可通过 required = false 关掉),如果后期会动态修改属性且需要自动刷新时(可通过 autoRefreshed = true 开启)。主要配置格式有:
${xxx}
注入属性${xxx:def}
注入属性,如果没有提供 def 默认值。 //只支持单值接收(不支持集合或实体)${classpath:xxx.yml}
注入资源目录下的配置文件 xxx.xml
为字段注入
@Component
public class Demo{
@Inject(value = "${user.name}", autoRefreshed=true) //可以注入单个值,顺带演示自动刷新(非单例,不要启用)
String userName;
@Inject("${user.config}") //可以注入结构体
UserConfig userConfig;
}
为参数注入。仅对 @Bean 注解的函数有效
@Configuration
public class Config{
@Bean
public UserConfig config(@Inject("${user.config}") UserConfig uc){
return uc;
}
}
为结构体注入,并交由容器托管。仅对 @Configuration 注解的类有效
//@Inject("${classpath:user.config.yml}") //也可以注入一个配置文件
@Inject("${user.config}")
@Configuration
public class UserConfig{
public String name;
public List<String> tags;
...
}
//别处可以注入复用
@Inject
UserConfig userConfig;
3、注入环境变量
当使用如此注入配置时,不存在配置,且名字全为大写时。则尝试获取环境变量并注入
${XXX}
注入属性${XXX:def}
注入属性,如果没有提供 def 默认值。 //只支持单值接收(不支持集合或实体)
@Configuration
public class Config{
@Bean
public void test(@Inject("${JAVA_HOME}") String javaHome){
}
}
4、将配置转为 Bean 注入时的处理说明
- 如果有 Properties 入参的构造函数,会执行这个构建函数 new(Properties)
- 如果没有,new() 之后按字段名分别注入配置
5、关于 Bean 以接口形式注入的说明
- 组件的一级实现接口,可以被注入
案例分析:
public interface DemoService{}
public class BaseDemoService : DemoService{}
@Component
public class DemoServiceImpl extends BaseDemoService{}
此时 “DemoService” 是不能注入的
@Component
public class DemoTest{
@Inject
DemoService demoService;
}
需要调整一下,增加实现 “DemoService” 接口
@Component
public class DemoServiceImpl extends BaseDemoService implements DemoService{}
- 或者以接口返回构建的 Bean
public class DemoConfig{
@Bean
public DemoService demo1(){
return new DemoServiceImpl();
}
@Bean
publi DataSource demo2(){
return new ...;
}
}