我有一个软件包com.org.pages
,其中有40多个类。
我想通过Spring作为Beans初始化所有这些类。现在,我不想为该包中的每个类添加@Component
。
问题1:是否还有其他方法可以实现,而无需用@Component
注释所有这些类以将它们视为bean?
问题2:用@Component注释对这些类进行注释后,是否需要在某个地方@Autowire
引用这些类以实际上创建它们的实例?
答案 0 :(得分:3)
您需要创建自己的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
答案 1 :(得分:1)
@ComponentScan
批注中的documentation应该为您提供一些见识。您会注意到的一件事是includeFilters
参数。您可以以此指定要包含的内容。默认过滤器包括带有@Component
批注的类。
如果查看@Filter
批注,您会发现其中有多个types。您想要的类型是REGEX过滤器类型。您定义一个表达式,如果该表达式匹配,则该类将成为组件。
@ComponentScan(includeFilters =
@Filter(type=FilterType.REGEXP,
pattern= {"com.org.pages..*.*" )
类似上面的事情应该可以解决。
答案 2 :(得分:0)
您可以定义自己的配置类。在配置类中,您可以使用@Bean批注定义所有bean。您也可以在那里进行DI。 假设您有一个UserDao类和一个UserServcie类。并且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;
}
}