好程式設計師分享SpringBoot須掌握的註解

好程式設計師IT發表於2019-06-05

前言

Spring 經歷瞭如下幾個階段

第一階段: xml 配置

Spring 1.x 時代,使用 Spring 開發滿眼都是 xml 配置的 Bean ,隨著專案的擴大,我們需要把 xml 配置檔案放到不同的配置檔案裡,那時需要頻繁的在開發的類和配置檔案之間進行切換

第二階段:註解配置

Spring 2.x  時代,隨著 JDK1.5 帶來的註解支援, Spring 提供了宣告 Bean 的註解(例如 @Component @Service ),大大減少了配置量。主要使用的方式是應用的基本配置(如資料庫配置)用 xml ,業務配置用註解

第三階段: java 配置

Spring 3.0  引入了基於  Java  的配置能力,這是一種型別安全的可重構配置方式,可以代替  XML 。我們目前剛好處於這個時代, Spring4.x Spring Boot 都推薦使用 Java 配置。

所有這些 xml 配置都代表了開發時的損耗。   因為在思考  Spring  特性配置和解決業務問題之間需要進行思維切換,所以寫配置擠佔了寫應用程式邏輯的時間 Spring Boot  讓這一切成為了過去。 Spring Boot  簡化了基於 Spring 的應用開發,只需要 “run” 就能建立一個獨立的、生產級別的 Spring 應用。 Spring Boot Spring 平臺及第三方庫提供開箱即用的設定(提供預設設定),這樣我們就可以簡單的開始。多數 Spring Boot 應用只需要很少的 Spring 配置。我們可以使用 SpringBoot 建立 java 應用,並使用 java –jar  啟動它,或者採用傳統的 war 部署方式。這也是 SpringBoot 越來越多的開發人員使用的主要原因之一。下面我們就來詳細講解 Spring Boot 幾個很重要的註解: @Configuration @Bean @SpringBootApplication @ComponentScan

 

@  Configuration @Bean 註解

Spring Java 配置方式是透過 @Configuration @Bean 這兩個註解實現的,這兩個註解是從 Spring3.0 之後就開始有了:

1 @Configuration 作用於類上,相當於一個 xml 配置檔案;

2 @Bean 作用於方法上,相當於 xml 配置中的 <bean>

案例

@Configuration

public class DemoConfigure {

    @Bean

    public User userBean(){

        User user=new User();

        user.setAge(100);

        user.setName("jack");

        user.setPwd("123");

        return user;

    }

}

 

 

測試如下:

package com.example.springboot01;

import com.example.springboot01.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class Springboot01ApplicationTests {

  @Autowired
  private User user;
  @Test
  public void contextLoads() {
      System.out.println(user);
  }

}

 

 

列印:

User{name='jack', pwd='123', age=100}

@SpringBootApplication

@SpringBootApplication 註解原始碼如下:

 

    package org.springframework.boot.autoconfigure;

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

    

    }

 

 

@SpringBootApplication 是一個複合註解,包括 @ComponentScan ,和 @SpringBootConfiguration @EnableAutoConfiguration

- @SpringBootConfiguration 繼承自 @Configuration ,二者功能也一致,標註當前類是配置類,並會將當前類內宣告的一個或多個以 @Bean 註解標記的方法的例項納入到 srping 容器中,並且例項名就是方法名。

- @EnableAutoConfiguration 的作用啟動自動的配置, @EnableAutoConfiguration 註解的意思就是 Springboot 根據你新增的 jar 包來配置你專案的預設配置,比如根據 spring-boot-starter-web ,來判斷你的專案是否需要新增了 webmvc tomcat ,就會自動的幫你配置 web 專案中所需要的預設配置。

- @ComponentScan ,掃描當前包及其子包下被 @Component @Controller @Service @Repository 註解標記的類並納入到 spring 容器中進行管理。是以前的 <context:component-scan> (以前使用在 xml 中使用的標籤,用來掃描包)。

  

@SpringBootApplication 指定掃描某些包

@SpringBootApplication 註解預設掃描的是當前類所在的包和子包。自己可以透過屬性來設定掃描其他的包,設定了之後預設值就不在有用。

@SpringBootApplication(scanBasePackageClasses = {TestConfig.class,TestController.class})
透過設定 scanBasePackageClasses 屬性來制定,只掃描哪些配置類( @Configuration 註解的類)。

或者如下設定:

@SpringBootApplication(scanBasePackageClasses = {Springboot01Application.class,TestConfig.class})
指定掃描這些類所在的包和子包。

設定不自動裝配

springboot 的自動配置可以幫我們節省很多時間 , 但是有時候如果我們不想在引入依賴包的情況自動配置 , 則可以透過相關設定取消

@SpringBootApplication ( exclude   =  { JpaRepositoriesAutoConfiguration . class , RedisAutoConfiguration . class }) 註解內部將不需要自動配置的依賴透過 exclude 引數指定即可 , 可以指定多個類

所有自動配置的類全都在: org.springframework.boot.autoconfigure 包下。只能排出自動配置的類。

@ComponentScan

@ComponentScan 註解在 Spring 的註解中也起到到相當重要的作用,它可以自定義 Spring 掃描的包,也就是它預設會掃描標註了 @Controller @Service @Component 以及 @Repository 註解的類,並例項化這些元件到 SpringIOC 容器中,它有個配置屬性: basePackages ,也就是指定掃描的包,如果不知道,它會預設掃描配置了該註解的類的包所在的路徑(包括子包)。我們看 @SpringBootConfiguration 註解的原始碼中有段程式碼:

@AliasFor (

  annotation   =   ComponentScan . class ,

  attribute   =   "basePackages"

)

String [] scanBasePackages () default  {};

scanBasePackages 屬性,指定到了 @ComponentScan 註解的 basePackages 屬性,所有在 SpringBoot 中,我們同樣可以透過 scanBasePackages 屬性指定包掃描的路徑(如不指定,會預設掃描主程式類所在的包路徑以及子包下的類):

@SpringBootApplication(scanBasePackages = "com.seagetech.springbootdemo")


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69913892/viewspace-2646751/,如需轉載,請註明出處,否則將追究法律責任。

相關文章