将包中的所有类初始化为 Beans,而不使用@Component注释声明它们



我有一个包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;
}
}

相关内容

最新更新