属性注入方式:
- @Value 注解
- 从配置文件中读取
- 自动装配
@Value 注解
@Value 注解支持如下的属性注入:
- 字面量:字面量的类型必须与属性的类型一致
- 属性占位符:即通过 ${} 从环境变量、配置文件中获取值
- SpEL 表达式:#{}
从配置文件中读取
从配置文件中取值:
- @PropertySource 注解:使用该注解读取外部配置文件中的 k/v 对保存到运行的环境变量中,注意该注解只能作用在配置类上
- 读取:加载完配置文件后,有两种方法取出配置文件中的值
- 使用 @Value 注解的 ${} 运算符从上下文环境中通过 key 获取 value 的值
- 使用 applicationContext.getEnvironment().getProperty(“key”) 方法 ```java // 配置文件:user.properties user.name=里斯 user.subject=数学
// 用户类 @Component public class User{ @Value(“${user.name}”) private String username; @Value(“${user.subject}”) private String subject; }
// 配置类 @Configuration @ComponentScan(basePackages = {“com.example.entity”}) @PropertySource({“classpath:user.properties”}) public class DemoConfig { }
<a name="BQEq4"></a>
#### 自动装配
自动装配:Spring 利用依赖注入(DI),完成IOC容器中各个组件的依赖关系赋值
- @Autowired:自动注入
- 默认优先按照**类型**去容器中查找对应的组件,相当于 context.getBean(xx.class),找到就赋值
- 如果找到**多个相同类型的组件**,再将**属性的名称**作为组件的 id 去容器中查找
- @Qualifier():指定需要装配的组件的 id,而不是属性名进行查找
- 自动装配默认一定要将属性赋值好,否则会报错,通过 @Autowired(required = false) 设置该装配不是必须的
- @Primary:让 spring 在进行自动装配的时候,默认使用首选的 bean,同样可以使用@Qualifier 进行指定需要装配的 bean 的 id
- @Resource 和 @Inject :Java 规范
- @Resource(name=""):JSR 250注解,默认按照**组件名称**进行装配,不支持@Primary 和 @required = false 功能
- @Inject:JSR 330注解,需要导入依赖 javax.inject,和 @Autowired 的功能一样,只是没有 required = false 功能
- 通过 AutowiredAnnotationBeanPostProcessor 后置处理器实现
@Autowired 的位置:
```java
// 1.标注在属性上
public class UserController{
@Autowired
private UserService userService;
}
// 2.标注在set方法上
public class UserController{
private UserService userService;
// 标注在set方法上,spring容器创建对象,就会调用方法,完成赋值
@Autowired
public void setUserService(UserService userService){
this.userService = userService;
}
}
// 3.标注在构造方法上
// 默认加载ioc容器中的组件,容器启动时会调用无参构造器创建对象,再进行初始化赋值等操作
// 如果组件中只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动装配(从容器中获取)
public class UserController{
private UserService userService;
// 标注在构造方法上
@Autowired
public UserService(UserService userService){
this.userService = userService;
}
}
// 4.标注在方法参数上
public class UserController{
private UserService userService;
public UserService(@Autowired UserService userService){
this.userService = userService;
}
}
// 5.在配置类中的@Bean标注的方法
@Configuration
public class Config{
// @Bean标注的方法创建对象的时候,方法参数的值从容器中获取
@Bean
public UserService userService(@Autowired User user){
return new UserService(user);
}
}
自定义组件想要使用 Spring 容器底层的一些组件:
- 自定义组件实现 xxAware,在创建对象的时候,会调用接口规定的方法注入相关组件,Aware 把 Spring 底层一些组件注入到自定义的 Bean 中
- xxAware 接口的功能实现:xxAwareProcessor,即使用后置处理器进行实现
简单测试:
@Component
public class Demo implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware {
@Override
public void setBeanName(String name) {
System.out.println("Bean的名字:" + name);
}
private ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 可以获取Spring容器并执行相关操作
// 通过属性接受
context = applicationContext;
}
@Override
public void setEmbeddedValueResolver(StringValueResolver resolver) {
// 字符串解析器
String s = resolver.resolveStringValue("当前操作系统:${os.name}");
System.out.println(s);
}
}