官术网_书友最值得收藏!

2.4 Spring Boot應用注解@Spring BootApplication

我們在上面看到在Spring Boot入口類上面添加了注解@Spring BootApplication,這個注解的定義如下:

        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Inherited
        @Spring BootConfiguration
        @EnableAutoConfiguration
        @ComponentScan(excludeFilters = {
                @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
                @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExclu
                    deFilter.class) })
        public @interface Spring BootApplication {...}

@Spring BootApplication注解實際上封裝了以下三個注解:

?@Spring BootConfiguration:配置類注解。

?@EnableAutoConfiguration:啟用自動配置注解。

?@ComponentScan:組件掃描注解。

下面我們分別來介紹。

2.4.1 Spring Boot配置類注解

@SpringBootConfiguration與@Component注解是一樣的。@SpringBootConfiguration其實是Spring Boot包裝的@Configuration注解:

        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Configuration
        public @interface Spring BootConfiguration {
        }

而@Configuration注解使用的又是@Component注解:

        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Component
        public @interface Configuration {
            @AliasFor(annotation = Component.class)
            String value() default "";
        }

我們知道,@Component注解的功能是把普通POJO實例化到Spring容器中,相當于配置文件中的<bean id = ""class = ""/>。

在類上添加注解@Configuration,表明這個類代表一個Spring配置文件,與原來XML配置是等效的。只不過現在用Java類加上一個@Configuration注解進行配置了,這種方式與XML相比可以稱得上是極簡風格了。同時基于注解的配置風格,使得代碼的可讀性也大大增高了。

Spring容器可以掃描出任何我們添加了@Component注解的類,Bean的注冊邏輯在Class-PathScanningCandidateComponentProvider這個類的registerDefaultFilters方法里。

提示

注解(Annotation)是JDK1.5中引入的一個新特性。從Spring2.0以后的版本中,Spring引入了基于注解方式的配置,用于取代XML配置文件,從而極簡化了Bean的配置,Spring后來的新版本。在Spring Boot中完全采用基于注解(Spring4.x引入了更加智能的@Condition系列注解,我們將會在后面的章節中詳細介紹)的配置,實現“零XML的配置”(當然,同時也支持之前的XML配置文件方式)。

2.4.2 啟用自動配置注解

@EnableAutoConfiguration這個注解是Spring Boot的最核心注解。首先我們看它的定義:

        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Inherited
        @AutoConfigurationPackage
        @Import(AutoConfigurationImportSelector.class)
        public @interface EnableAutoConfiguration {...}

其中,導入配置類注解@Import標識導入@Configuration標注的配置類。@Import用來整合所有在@Configuration注解中定義的Bean配置。這與我們將多個XML配置文件導入到單個文件的場景一致。@Import注解實現了相同的功能。

使用@EnableAutoConfiguration注解可以啟用Spring應用程序上下文的自動配置,Spring Boot會去嘗試猜測和配置你可能需要的Bean。自動配置類通常是根據類路徑中你定義的Bean來推斷可能需要怎樣的配置。

例如,如果在你的類路徑中有tomcat-embedded.jar這個類庫,那么Spring Boot會根據此信息來判斷你可能需要一個TomcatServletWebServerFactory(除非你已經定義了你自己的ServletWebServerFactory Bean)。當然我們還可以通過設置exclude或者excludeName變量的值來手動排除你不想要的自動配置。

Spring Boot默認掃描的包路徑是入口類Demo0HelloWorldApplication所在的根包中,及其所有的子包。通常,Spring Boot自動配置Bean是根據Conditional Bean(條件Bean)中注解的類信息來推斷的。例如@ConditionalOnClass、@ConditionalOnMissingBean注解。關于Spring Boot自動配置的相關內容我們將在后面的章節中詳細介紹。

2.4.3 組件掃描注解

組件掃描注解@ComponentScan提供的功能與Spring XML配置文件中的<context:component-scan>元素等價。對應@ComponentScan注解的處理類是ConfigurationClassParser。@ComponentScan告訴Spring去哪個package下面掃描Spring注解。Spring會去自動掃描這些被Spring注解標注的類,并且將其注冊到Bean容器中。例如下面的XML配置:

        <beans>
            <context:component-scan base-package="com.easy.SpringBoot"
                name-generator="com.easy.SpringBoot.MyApp" />
        </beans>

對應到Java Config風格如下:

        @Configuration
        @ComponentScan(basePackages = "com.easy.SpringBoot", nameGenerator = MyApp.class)
        public class AppConfig {
              .
        }

如果你有個類用@Controller注解標識了,但是沒有加上@ComponentScan告訴Spring去掃描這個類所在的包,那么該Controller就不會被注冊到Spring容器中。

不過,Spring Boot中如果不顯式地使用@ComponentScan指明對象掃描的包,那么默認只掃描當前啟動類所在的包里的類。

我們可以設置basePackageClasses的值來指定要掃描哪個類所在的包,代碼示例如下:

        @Spring BootApplication
        @ComponentScan(basePackageClasses=MyApplication.class) //指定掃描MyApplication
                                                                    //類所在的包
        public class MyApplication {
            public static void main(String[] args){
                SpringApplication.run(MyApplication.class, args);
            }
        }
主站蜘蛛池模板: 宁夏| 阜阳市| 崇礼县| 伊吾县| 昌黎县| 新安县| 赤壁市| 油尖旺区| 建宁县| 永顺县| 大关县| 克拉玛依市| 义马市| 林周县| 噶尔县| 民乐县| 石屏县| 安顺市| 鱼台县| 长白| 清涧县| 锡林浩特市| 蒙阴县| 牙克石市| 新晃| 谷城县| 东辽县| 三河市| 华阴市| 白山市| 原阳县| 伊金霍洛旗| 曲松县| 临海市| 兴海县| 尉氏县| 缙云县| 浦县| 岳普湖县| 荣昌县| 彩票|