我有一个包com.org.pages
里面有40多个类。
我想通过 Spring 作为 Bean 初始化所有这些类。现在我不想为该包中的每个类添加@Component
。
问题 1:有没有其他方法可以实现这一目标,而无需用@Component
注释所有这些类以将它们视为 bean?
问题 2:一旦我用@Component注释注释这些类,我是否需要在某处@Autowire
这些类的引用才能实际创建它们的实例?
你需要创建自己的 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
}
}
通过这种方式,您将在提供的包中将所有类注册为 bean
@ComponentScan
注释的文档应该会给你一些见解。您会注意到的一件事是includeFilters
论点。您可以使用此指定要包含的内容。默认过滤器包括具有@Component
注解的类。
如果您查看@Filter
注释,您可以看到有几种类型。此处所需的类型是 REGEX 筛选器类型。您定义一个表达式,如果该表达式匹配,则该类将成为组件。
@ComponentScan(includeFilters =
@Filter(type=FilterType.REGEXP,
pattern= {"com.org.pages..*.*" )
像上面这样的东西应该可以解决问题。
您可以定义自己的配置类。在配置类中,您可以使用@Bean注释定义所有 bean。你也可以在那里做你的DI。 假设你有一个UserDao类和一个UserServcie类。用户服务有一个用户道。那么配置文件将是这样的:
@Configuration
public class Config {
@Bean
public UserDao userDao(){
return new UserDao();
}
@Bean
public UserService userService(){
UserService userService = new UserService();
userService.setUserDao(userDao());
return userService;
}
}