Bean 逻辑分组注入
创建多个具有相同类型的 bean 时,使用类注入会报错,在这种情况下可以使用 @Qualifier + Bean 名称方式来进行限定注入。实际上这是 @Qualify 最基础的用法,它还可以做简单的分组限定,下面会对分组限定的方式进行展示。
以下自定义了两个注解 @Group1 和 @Group2 , 他们两个为 @Qualify 注解的拓展;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
@interface Group1 {
}
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
@interface Group2 {
}
在声明 Bean 对象的时候分别使用 @Group1 、@Group2 进行标示。
@Bean
@Qualifier
public User user1() {
User user = new User();
user.setId(1L);
return user;
}
@Bean
@Group1
public User user2() {
User user = new User();
user.setId(2L);
return user;
}
@Bean
@Group2
public User user3() {
User user = new User();
user.setId(3L);
return user;
}
@Data
@ToString
static class User {
private Long id;
}
在进行依赖注入的使用,使用 @Group1 、@Group2 标识要获取的bean 对象;
@Autowired
@Group1
private Collection<User> group1Users;
@Autowired
@Group2
private Collection<User> group2Users;
这样就可以分组得到对应标示的对象集合;
完整代码以及输出结果如下:
import lombok.Data;
import lombok.ToString;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import java.lang.annotation.*;
import java.util.Collection;
/**
* {@link org.springframework.beans.factory.annotation.Qualifier} 注解依赖注入
*
* @author houfeifan
* @since 2022/5/29 5:45 下午
**/
public class AuailfierAnnotationDependencyInjectionDemo {
@Autowired
@Group1
private Collection<User> group1Users;
@Autowired
@Group2
private Collection<User> group2Users;
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
applicationContext.register(AuailfierAnnotationDependencyInjectionDemo.class);
applicationContext.refresh();
AuailfierAnnotationDependencyInjectionDemo demo = applicationContext.getBean(AuailfierAnnotationDependencyInjectionDemo.class);
System.out.println("group1Users: " + demo.group1Users);
System.out.println("group2Users: " + demo.group2Users);
// 按照类型依赖查找
applicationContext.close();
}
@Bean
@Qualifier
public User user1() {
User user = new User();
user.setId(1L);
return user;
}
@Bean
@Group1
public User user2() {
User user = new User();
user.setId(2L);
return user;
}
@Bean
@Group2
public User user3() {
User user = new User();
user.setId(3L);
return user;
}
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
@interface Group1 {
}
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier
@interface Group2 {
}
@Data
@ToString
static class User {
private Long id;
}
}
group1Users: [AuailfierAnnotationDependencyInjectionDemo.User(id=2)]
group2Users: [AuailfierAnnotationDependencyInjectionDemo.User(id=3)]