将包内的所有 类 初始化为 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..*.*" )

像上面这样的东西应该可以解决问题。