2016-07-20 2 views
6

Я пытаюсь создать новый стартер. У меня есть бизнес-модуль, например ProjectManager, который содержит некоторые классы, аннотированные с помощью @Component. После учебника я создал модуль автоконфигурации, он содержит класс AutoConfiguration. Во-первых, я попытался использовать @ComponentSan для поиска компонентов в моем бизнес-модуле.@ComponentScan не работает в Spring загрузочный класс AutoConfiguration?

@ComponentScan(value = {"com.foo.project"}) 
@ConditionalOnClass({Project.class}) 
@Configuration 
public class ProjectAutoConfiguration { 
    .... 

} 

Но это не сработает. Я должен добавить дополнительный класс конфигурации, как показано ниже:

@Configuration 
@ComponentScan(value = {"com.foo.project"}) 
@MapperScan(value = {"com.foo.project"}) 
public class ProjectConfig { 
} 

А затем импортировать его в класс автонастройки, как показано ниже:

@Import(ProjectConfig.class) 
@ConditionalOnClass({Project.class}) 
@Configuration 
public class ProjectAutoConfiguration { 
    .... 

} 

Это работает. Но по весне doc.

автонастройки осуществляется с помощью стандартных @Configuration классов

Так что мой вопрос, почему @ComponentScan здесь не работает? Я сделал что-то не так? Или это по дизайну?

ответ

6

Вы должны использовать аннотацию compentscan в основной класс. Вот пример кода:

@SpringBootApplication 
@ComponentScan("com.foo.project") 
public class MainApplication extends SpringBootServletInitializer { 

    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(MainApplication.class); 
    } 

    public static void main(String[] args) { 
     new MainApplication().configure(new SpringApplicationBuilder(MainApplication.class)).run(args); 
    } 
} 

Приветствия

+0

Вы имеете в виду, класс с основным методом? – Dongqing

+0

есть. отредактируйте свой основной класс следующим образом. – emoleumassi

+0

Он действительно работает, чтобы добавить его в основной класс. Итак, вы имеете в виду, что @ComponentScan работает только с основным классом весенней загрузки? – Dongqing

0

Вы можете попробовать со следующими?

@ConditionalOnClass({Project.class}) 
@Configuration 
@EnableAutoConfiguration 
@ComponentScan(value = {"com.foo.project"}) 
public class ProjectAutoConfiguration { 
    .... 

} 
+0

Я уже добавил @ EnableAutoConfiguration в моем основном классе – Dongqing

3

Автоматические все требует класса Application (аннотированный с @SpringBootApplication), чтобы быть в «высшем» пакете, чем компоненты, которые вы хотите сканировать.

Использование:

package com.example.foo; 

для вашего приложения и положить компоненты в упаковке, как:

package com.example.foo.entities; 

См также https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-using-springbootapplication-annotation.html

Смежные вопросы