2016-01-26 40 views
18

Spring Boot中的@ComponentScan@EnableAutoConfiguration註釋之間有什麼區別?是否有必要添加這些?沒有這些註釋,我的應用程序運行良好。我只想了解爲什麼我們必須添加它們。Spring Boot中的@ComponentScan和@EnableAutoConfiguration有什麼區別?

+4

你有['@ SpringBootApplication'(http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html)?這是您提到的兩個替代品 –

+0

是的,我在我的主類中使用它們 –

+5

'@ ComponentScan'用於掃描註釋的Spring組件,'@ EnableAutoConfiguration'用於啓用免費的好東西(配置,激活的組件等) Spring Boot提供。 '@ SprintBootApplication'允許您使用單個註釋而不是通常使用的一些註釋,就像您提到的兩個註釋一樣。看看我鏈接到 –

回答

23

Spring Boot中的@ComponentScan和@@@EnableAutoConfiguration註解有什麼區別?

@EnableAutoConfiguration註釋告訴Spring Boot基於你添加的jar依賴關係來「猜測」你想要如何配置Spring。例如,如果HSQLDB位於你的類路徑上,並且你沒有手動配置任何數據庫連接bean,那麼Spring將自動配置一個內存數據庫。

@ComponentScan告訴Spring在指定的包中查找其他組件,配置和服務。 Spring能夠自動掃描,檢測並註冊來自預定義項目包的bean或組件。如果未指定包,則將當前類包視爲根包。

是否有必要添加這些?

如果您需要Spring引導來自動配置您的每件事情@EnableAutoConfiguration是必需的。您不需要手動添加它,Spring會根據您提供的註釋在內部爲您添加它。

實際上,@SpringBootApplication註釋等效於使用@Configuration,@EnableAutoConfiguration@ComponentScan及其默認屬性。

參見:

+1

javadoc和** @ ComponentScan **和** @ ComponentScans **之間呢? –

3

一個春天啓動的主要優點是它的註釋驅動與傳統的基於XML的配置,@EnableAutoConfiguration自動配置Spring應用程序基於其包含的jar文件,它設置默認值或幫助程序bas編輯pom.xml中的依賴關係。 自動配置通常基於類路徑和定義的bean應用。因此,我們不需要定義任何DataSource,EntityManagerFactory,TransactionManager等,並且基於類路徑神奇地,Spring Boot自動創建適當的bean併爲我們註冊它們。例如,當你的類路徑上有一個tomcat-embedded.jar時,你可能需要一個TomcatEmbeddedServletContainerFactory(除非你已經定義了你自己的EmbeddedServletContainerFactory bean)。 @EnableAutoConfiguration具有一個exclude屬性來顯式地禁用自動配置,否則我們可以簡單地將它從pom.xml中排除,例如如果我們不希望Spring配置tomcat,那麼將spring-bootstarter-tomcat從spring-boot-starter-網頁。

@ComponentScan爲彈簧部件掃描提供範圍,它簡單地進入雖然所提供的基本包和拾取由@Bean或@Autowired等必需的,在一個典型的Spring應用的依賴關係,@ComponentScan是在使用配置類,用@Configuration註釋的類。配置類包含用@Bean註釋的方法。這些@Bean註釋的方法生成由Spring容器管理的bean。這些bean將由@ComponentScan註釋自動檢測。有一些註釋可以使bean自動檢測,如@Repository,@Service,@Controller,@Configuration,@Component。 在下面的代碼中,Spring從包中包含BeanA類開始掃描。

@Configuration 
@ComponentScan(basePackageClasses = BeanA.class) 
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) 
public class Config { 

    @Bean 
    public BeanA beanA(){ 
    return new BeanA(); 
    } 

    @Bean 
    public BeanB beanB{ 
    return new BeanB(); 
    } 

} 
相關問題