Инициализируйте все классы внутри пакета как Beans, не объявляя их аннотацией @Component - PullRequest
0 голосов
/ 05 июля 2018

У меня есть пакет com.org.pages, внутри которого более 40 классов.

Я хочу инициализировать все эти классы через Spring как Beans. Теперь я не хочу идти и добавлять @Component для каждого класса в этом пакете.

Вопрос 1: Есть ли другой способ достичь этого, не отмечая все эти классы @Component для обработки их как бобов?

Вопрос 2: Как только я аннотирую эти классы с помощью аннотации @Component, нужно ли мне @Autowire ссылки на эти классы где-нибудь, чтобы на самом деле создавать их экземпляры?

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Вы можете определить свой собственный класс конфигурации. В вашем классе конфигурации вы можете определить все компоненты с помощью аннотации @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;
    }

}
0 голосов
/ 05 июля 2018

Документация аннотации @ComponentScan должна дать вам некоторое представление. Одна вещь, которую вы заметите, это аргумент includeFilters. Вы можете указать с этим, что включать. Фильтры по умолчанию включают классы с аннотацией @Component.

Если вы посмотрите на аннотацию @Filter, вы увидите, что существует несколько типов . Здесь вам нужен тип фильтра REGEX. Вы определяете выражение и, если выражение соответствует классу, станет компонентом.

@ComponentScan(includeFilters = 
    @Filter(type=FilterType.REGEXP, 
            pattern= {"com.org.pages..*.*" )

Нечто подобное вышесказанное должно сработать.

0 голосов
/ 05 июля 2018

Вам нужно создать собственное определение бина,

сделать что-то подобное

@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
  }
}

таким образом вы зарегистрируете все классы как бины в предоставленном пакете

...