springboot注解@SpringBootApplication分析


@SpringBootApplication注解用在Spring Boot的入口類上面,是Spring Boot提供的應用啟動相關的注解。

直接上注解的源碼:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {

    @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude")
    Class<?>[] exclude() default {};

    @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName")
    String[] excludeName() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
    String[] scanBasePackages() default {};

    @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
    Class<?>[] scanBasePackageClasses() default {};

}

@SpringBootApplication是一個復合注解

查看源碼,可以發現@SpringBootApplication是一個復合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan三個注解。

對這三個注解進行逐一解析:

@SpringBootConfiguration

@SpringBootConfiguration繼承自@Configuration,二者的功能也一致,用於標注當前類是配置類,並且會將當前類內聲明的一個或多個以@Bean注解標記的方法的實例納入到Spring容器中,且實例名就是方法名。

@SpringBootConfiguration和@Configuration都可以理解為Spring傳統XML配置里的<beans>標簽,而@Bean則是<bean>標簽。

@Configuration和@Bean並不是Spring Boot的特有標簽,普通的Spring項目也可以使用,只是普通的Spring項目在使用大多數注解的時候要掃包才能生效,要注意加上掃包配置<context:component-scan base-package="com.yanggb.xxx" />。而Spring Boot只需要保證啟動啟動main入口在這些類的上層包就行,不需要特別加上掃包配置。

Spring傳統XML配置:

<beans>  
    <bean id="car" class="com.yanggb.Car">  
        <property name="wheel" ref="wheel"></property>  
    </bean>  
    <bean id="wheel" class="com.yanggb.Wheel"></bean>  
</beans>  

Spring新型注解配置:

@Configuration // 相當於<beans>
public class CarConfig {
    
    @Bean // 相當於<bean>
    public Car car() {
        Car car = new Car();
        car.setWheel(wheel()); // 相當於<property>
        return car;
    }
    
    @Bean
    public Wheel wheel() {
        return new Wheel();
    }  

}

兩種方式最后產生的結果是相同的。

@EnableAutoConfiguration

@EnableAutoConfiguration的作用是啟動自動配置,意思是Spring Boot會根據你添加的jar包來配置你項目的默認設置,比如你添加了Spring Boot提供的spring-boot-starter-web依賴,其中包含了Tomcat和Spring MVC,這個注釋就會假設你正在開發一個Web應用程序,自動地幫你添加Web項目中所需要的Spring配置。

@ComponentScan

@ComponentScan的作用是掃描當前包及其子包下被@Component注解標記的類並納入到Spring容器中進行管理。是Spring傳統XML配置的<context:component-scan>的替代。

@Controller,@Service,@Repository是@Component的子注解,所以也會被@ComponentScan掃描並做和@Component相同的處理。

@ComponentScan提供了basePackage參數定義要掃描的包,如果不設置,默認會掃描包的所有類,即默認掃描**/*.class路徑,建議加上該參數以減少加載的時間。

@SpringBootApplication提供的參數

exclude

exlude參數繼承自@EnableAutoConfiguration注解的同名參數,根據class來排除特定的類加入Spring容器,傳入參數的value類型是class類型數組。

@SpringBootApplication(exclude = {Good.class, Bad.class})

excludeName

exludeName參數繼承自@EnableAutoConfiguration注解的同名參數,根據className來排除特定的類加入Spring容器,傳入參數的value類型是class的全類名字符串數組。

@SpringBootApplication(excludeName = {"com.yanggb.xxx.Good", "com.yanggb.yyy.Bad"})

exclude和excludeName可以用來關閉指定的自動配置,比如關閉數據源相關的自動配置。

scanBasePackages

scanBasePackages參數繼承自@ComponentScan注解的basePackages參數,指定要掃描的包,傳入參數的value類型是包名的字符串數組。

@SpringBootApplication(scanBasePackages = {"com.yanggb.xxx", "com.yanggb.yyy"})

scanBasePackageClasses

scanBasePackageClasses參數繼承自@ComponentScan注解的basePackageClasses參數,指定要掃描的包,傳入參數的value類型是包名的字符串數組。

@SpringBootApplication(scanBasePackageClasses = {Good.class, Bad.class})

 

"到后來,我們只是會說對此無能為力。"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM