属性注入方式:

  • @Value 注解
  • 从配置文件中读取
  • 自动装配

@Value 注解

@Value 注解支持如下的属性注入:

  1. 字面量:字面量的类型必须与属性的类型一致
  2. 属性占位符:即通过 ${} 从环境变量、配置文件中获取值
  3. 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 { }

  1. <a name="BQEq4"></a>
  2. #### 自动装配
  3. 自动装配:Spring 利用依赖注入(DI),完成IOC容器中各个组件的依赖关系赋值
  4. - @Autowired:自动注入
  5. - 默认优先按照**类型**去容器中查找对应的组件,相当于 context.getBean(xx.class),找到就赋值
  6. - 如果找到**多个相同类型的组件**,再将**属性的名称**作为组件的 id 去容器中查找
  7. - @Qualifier():指定需要装配的组件的 id,而不是属性名进行查找
  8. - 自动装配默认一定要将属性赋值好,否则会报错,通过 @Autowired(required = false) 设置该装配不是必须的
  9. - @Primary:让 spring 在进行自动装配的时候,默认使用首选的 bean,同样可以使用@Qualifier 进行指定需要装配的 bean 的 id
  10. - @Resource 和 @Inject :Java 规范
  11. - @Resource(name=""):JSR 250注解,默认按照**组件名称**进行装配,不支持@Primary 和 @required = false 功能
  12. - @Inject:JSR 330注解,需要导入依赖 javax.inject,和 @Autowired 的功能一样,只是没有 required = false 功能
  13. - 通过 AutowiredAnnotationBeanPostProcessor 后置处理器实现
  14. @Autowired 的位置:
  15. ```java
  16. // 1.标注在属性上
  17. public class UserController{
  18. @Autowired
  19. private UserService userService;
  20. }
  21. // 2.标注在set方法上
  22. public class UserController{
  23. private UserService userService;
  24. // 标注在set方法上,spring容器创建对象,就会调用方法,完成赋值
  25. @Autowired
  26. public void setUserService(UserService userService){
  27. this.userService = userService;
  28. }
  29. }
  30. // 3.标注在构造方法上
  31. // 默认加载ioc容器中的组件,容器启动时会调用无参构造器创建对象,再进行初始化赋值等操作
  32. // 如果组件中只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动装配(从容器中获取)
  33. public class UserController{
  34. private UserService userService;
  35. // 标注在构造方法上
  36. @Autowired
  37. public UserService(UserService userService){
  38. this.userService = userService;
  39. }
  40. }
  41. // 4.标注在方法参数上
  42. public class UserController{
  43. private UserService userService;
  44. public UserService(@Autowired UserService userService){
  45. this.userService = userService;
  46. }
  47. }
  48. // 5.在配置类中的@Bean标注的方法
  49. @Configuration
  50. public class Config{
  51. // @Bean标注的方法创建对象的时候,方法参数的值从容器中获取
  52. @Bean
  53. public UserService userService(@Autowired User user){
  54. return new UserService(user);
  55. }
  56. }

自定义组件想要使用 Spring 容器底层的一些组件:
image.png

  • 自定义组件实现 xxAware,在创建对象的时候,会调用接口规定的方法注入相关组件,Aware 把 Spring 底层一些组件注入到自定义的 Bean 中
  • xxAware 接口的功能实现:xxAwareProcessor,即使用后置处理器进行实现

image.png

简单测试:

  1. @Component
  2. public class Demo implements ApplicationContextAware, BeanNameAware, EmbeddedValueResolverAware {
  3. @Override
  4. public void setBeanName(String name) {
  5. System.out.println("Bean的名字:" + name);
  6. }
  7. private ApplicationContext context;
  8. @Override
  9. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  10. // 可以获取Spring容器并执行相关操作
  11. // 通过属性接受
  12. context = applicationContext;
  13. }
  14. @Override
  15. public void setEmbeddedValueResolver(StringValueResolver resolver) {
  16. // 字符串解析器
  17. String s = resolver.resolveStringValue("当前操作系统:${os.name}");
  18. System.out.println(s);
  19. }
  20. }