@Autowired
@Autowired是Spring框架中的一个注解,它可以对类成员变量、方法及构造函数进行标注,让 Spring 完成 bean 自动装配的工作。@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
@Qualifier
如果有两个类实现了同一个接口,那么@Autowired实现哪个类的实例,取决于你如何使用@Qualifier注解来指定要注入的实现类。如果没有指定@Qualifier注解来区分它们,那么@Autowired注入时会报错,因为Spring无法确定要注入哪个实现类。
yml文件配置
可以通过yml文件来指定使用哪个实现类。在yml文件中,使用@Qualifier注解来指定要注入的实现类。例如,假设有两个实现类,一个是AImpl,另一个是BImpl,它们都实现了同一个接口I,那么在yml文件中,可以这样配置:
spring:
profiles:
active: dev
---
spring:
profiles: dev
aImpl:
class: com.example.AImpl
bImpl:
class: com.example.BImpl
---
spring:
profiles: prod
aImpl:
class: com.example.AImpl
然后在代码中使用@Qualifier注解来指定要注入的实现类。例如:
@Autowired
@Qualifier("aImpl")
private I i;
这样就可以指定要注入AImpl了。
BeanDefinitionBuilder
Spring提供了多种方式来实现动态注入,其中一种方式是使用BeanDefinitionBuilder来构建BeanDefinition,然后使用BeanFactory注册BeanDefinition。具体步骤如下:
- 获取到当前上下文中的BeanFactory,可以使用ApplicationContext.getBeanFactory()方法获取。
- 使用BeanDefinitionBuilder构建BeanDefinition。
- 使用BeanFactory注册BeanDefinition。
例如,假设有一个接口I和两个实现类AImpl和BImpl,那么可以这样实现动态注入:
@Autowired
private ApplicationContext applicationContext;
public void dynamicInject(String className) {
BeanFactory beanFactory = applicationContext.getBeanFactory();
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(className);
GenericBeanDefinition definition = (GenericBeanDefinition) builder.getRawBeanDefinition();
definition.setAutowireMode(GenericBeanDefinition.AUTOWIRE_BY_TYPE);
beanFactory.registerSingleton(className, definition.getBeanClass());
}
这样就可以根据需要动态注入AImpl或BImpl了。