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

时间:2018-07-05 07:31:34

标签: java spring javabeans

我有一个软件包com.org.pages,其中有40多个类。

我想通过Spring作为Beans初始化所有这些类。现在,我不想为该包中的每个类添加@Component

问题1:是否还有其他方法可以实现,而无需用@Component注释所有这些类以将它们视为bean?

问题2:用@Component注释对这些类进行注释后,是否需要在某个地方@Autowire引用这些类以实际上创建它们的实例?

3 个答案:

答案 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;
    }

}