将包内的所有 类 初始化为 Beans,而不用 @Component 注释声明它们
Initialise all classes inside a package as Beans without declaring them with @Component annotation
我有一个包裹com.org.pages
,里面有40多个class。
我想通过 Spring 将所有这些 classes 初始化为 Beans。现在我不想去为那个包中的每个 class 添加 @Component
。
问题 1: 是否有任何其他方法可以实现此目的,而无需使用 @Component
注释所有这些 classes 以将它们视为 beans?
问题2:一旦我用@Component注解注解了这些class,我是否需要@Autowire
引用这些class是否在某处 实际上 创建它们的实例?
您需要创建自己的 bean 定义,
做那样的事情
@Component
public class CustomBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
Reflections reflections = new Reflections("my.package.prefix", new SubTypesScanner(false));
Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);
for (Class clazz : allClasses) {
GenericBeanDefinition gbd = new GenericBeanDefinition();
gbd.setBeanClass(clazz);
gbd.setAttribute("attributeName", "attributeValue");
registry.registerBeanDefinition(clazz.getSimpleName() + "RegisteredBean", gbd);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// Custom post process the existing bean definitions
}
}
通过这种方式,您将在提供的包
中将所有 类 注册为 beans
您可以定义自己的配置class。在您的配置 class 中,您可以使用 @Bean 注释定义所有 bean。你也可以在那里做你的DI。
假设您有一个 UserDao class 和一个 UserServcie class。而 UserService 有一个 userDao。然后配置文件将是这样的:
@Configuration
public class Config {
@Bean
public UserDao userDao(){
return new UserDao();
}
@Bean
public UserService userService(){
UserService userService = new UserService();
userService.setUserDao(userDao());
return userService;
}
}
documentation of the @ComponentScan
annotation should give you some insight. One thing you will notice is the includeFilters
参数。您可以指定要包含的内容。默认过滤器包括具有 @Component
注释的 classes。
如果你看@Filter
annotation you can see that there are several types。您在此处需要的类型是 REGEX 过滤器类型。您定义一个表达式,如果表达式匹配,class 将成为一个组件。
@ComponentScan(includeFilters =
@Filter(type=FilterType.REGEXP,
pattern= {"com.org.pages..*.*" )
像上面这样的东西应该可以解决问题。
我有一个包裹com.org.pages
,里面有40多个class。
我想通过 Spring 将所有这些 classes 初始化为 Beans。现在我不想去为那个包中的每个 class 添加 @Component
。
问题 1: 是否有任何其他方法可以实现此目的,而无需使用 @Component
注释所有这些 classes 以将它们视为 beans?
问题2:一旦我用@Component注解注解了这些class,我是否需要@Autowire
引用这些class是否在某处 实际上 创建它们的实例?
您需要创建自己的 bean 定义,
做那样的事情
@Component
public class CustomBeanFactoryPostProcessor implements BeanDefinitionRegistryPostProcessor {
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
Reflections reflections = new Reflections("my.package.prefix", new SubTypesScanner(false));
Set<Class<? extends Object>> allClasses = reflections.getSubTypesOf(Object.class);
for (Class clazz : allClasses) {
GenericBeanDefinition gbd = new GenericBeanDefinition();
gbd.setBeanClass(clazz);
gbd.setAttribute("attributeName", "attributeValue");
registry.registerBeanDefinition(clazz.getSimpleName() + "RegisteredBean", gbd);
}
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
// Custom post process the existing bean definitions
}
}
通过这种方式,您将在提供的包
中将所有 类 注册为 beans您可以定义自己的配置class。在您的配置 class 中,您可以使用 @Bean 注释定义所有 bean。你也可以在那里做你的DI。 假设您有一个 UserDao class 和一个 UserServcie class。而 UserService 有一个 userDao。然后配置文件将是这样的:
@Configuration
public class Config {
@Bean
public UserDao userDao(){
return new UserDao();
}
@Bean
public UserService userService(){
UserService userService = new UserService();
userService.setUserDao(userDao());
return userService;
}
}
documentation of the @ComponentScan
annotation should give you some insight. One thing you will notice is the includeFilters
参数。您可以指定要包含的内容。默认过滤器包括具有 @Component
注释的 classes。
如果你看@Filter
annotation you can see that there are several types。您在此处需要的类型是 REGEX 过滤器类型。您定义一个表达式,如果表达式匹配,class 将成为一个组件。
@ComponentScan(includeFilters =
@Filter(type=FilterType.REGEXP,
pattern= {"com.org.pages..*.*" )
像上面这样的东西应该可以解决问题。