springboot的註解的作用說明(全)

我的世界ZHL發表於2019-04-23

@RestController註解相當於@ResponseBody + @Controller合在一起的作用

@Controller 註解,在對應的方法上,檢視解析器可以解析return 的jsp,html頁面,並且跳轉到相應頁面

若返回json等內容到頁面,則需要加@ResponseBody註解

區別:

1) 如果只是使用@RestController註解Controller,則Controller中的方法無法返回jsp頁面,或者html,配置的檢視解析器 InternalResourceViewResolver不起作用,返回的內容就是Return 裡的內容

2) 如果需要返回到指定頁面,則需要用 @Controller配合檢視解析器InternalResourceViewResolver才行。
    如果需要返回JSON,XML或自定義mediaType內容到頁面,則需要在對應的方法上加上@ResponseBody註解。

@RequestMapping 來對映URL 到控制器類,或者是到Controller 控制器的處理方法上。當@RequestMapping 標記在Controller 類上的時候,裡面使用@RequestMapping 標記的方法的請求地址都是相對於類上的@RequestMapping 而言的;當Controller 類上沒有標記@RequestMapping 註解時,方法上的@RequestMapping 都是絕對路徑。這種絕對路徑和相對路徑所組合成的最終路徑都是相對於根路徑“/ ”而言的。

@RequestMapping

RequestMapping是一個用來處理請求地址對映的註解,可用於類或方法上。用於類上,表示類中的所有響應請求

的方法都是以該地址作為父路徑。

RequestMapping註解有六個屬性,下面分成三類進行說明。

1valuemethod

value:指定請求的實際地址,指定的地址可以是URITemplate 模式(後面將會說明);

method:指定請求的method型別,GET、POST、PUT、DELETE等;

2consumesproduces

Consumes:指定處理請求的提交內容型別(Content-Type),例如application/json,text/html;

produces:指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指

定型別才返回;

3paramsheaders

Params:指定request中必須包含某些引數值是,才讓該方法處理。

headers:指定request中必須包含某些指定的header值,才能讓該方法處理請求。

 

@SpringBootApplication開啟了Spring的元件掃描和Spring Boot的自動配置功能

@Configuration:標明該類使用Spring基於Java的配置

@ComponentScan:啟用元件掃描,這樣寫的Web控制器類和其他元件才能被 自動發現並註冊為Spring應用程式上下文裡的Bean

Spring MVC 控制器,使用@Controller進行註解,這樣元件掃描才能找到它

@EnableAutoConfiguration :這個不起眼的小注解也可以稱為 @Abracadabra①,就是這一行配置開啟了Spring Boot自動配置的魔力,讓你不用再寫很多的配置

@SpringBootApplication註解包含了一下三個註解的組合,即:

@SpringBootApplication=@Configuration+@ComponentScan+@EnableAutoConfiguration

Spring Boot 1.2.0開始,有@SpringBootApplication就行了

 

@RunWith就是一個執行器

@RunWith(JUnit4.class)就是指用JUnit4來執行

@RunWith(SpringJUnit4ClassRunner.class),讓測試執行於Spring測試環境

@RunWith(Suite.class)的話就是一套測試集合,
@ContextConfiguration Spring整合JUnit4測試時,使用註解引入多個配置檔案
單個檔案 

@ContextConfiguration(Locations="classpath:applicationContext.xml")  
@ContextConfiguration(classes = SimpleConfiguration.class)
多個檔案時,可用{}

@ContextConfiguration(locations = { "classpath:spring1.xml", "classpath:spring2.xml" }) 

@SpringBootTest註解進行單元測試

 

@SpringApplicationConfiguration註解從ReadingListApplication配置類里載入 Spring應用程式上

下文

@ContextConfiguration註解標識如何載入Spring的應用 程式上下文

 

注:

 Spring Boot起步依賴基本都以spring-boot-starter打頭,隨後是直接代表其功能的名字,比如web、test, 下文出現起步依賴的名字時,可能就直接用其字首後的單詞來表示

Spring Boot的Web起步依賴所引用的實際Jackson版本由你使用的Spring Boot版本決定

 

@Entity註解表明它是一個JPA實體,id屬性加了@Id和@GeneratedValue註解,說明這個欄位 是實體的唯一標識,並且這個欄位的值是自動生成的

 

@ConditionalOnBean 配置了某個特定Bean

@ConditionalOnMissingBean 沒有配置特定的Bean

@ConditionalOnClass Classpath裡有指定的類

@ConditionalOnMissingClass Classpath裡缺少指定的類

@ConditionalOnExpression 給定的Spring Expression Language(SpEL)表示式計算結果為true

@ConditionalOnJava Java的版本匹配特定值或者一個範圍值

@ConditionalOnJndi 引數中給定的JNDI位置必須存在一個,如果沒有給引數,則要有JNDI InitialContext @ConditionalOnProperty 指定的配置屬性要有一個明確的值

@ConditionalOnResource Classpath裡有指定的資源

@ConditionalOnWebApplication 這是一個Web應用程式

@ConditionalOnNotWebApplication 這不是一個Web應用程式

 

宣告Bean的註解:

  • @Component : 元件,沒有明確的角色
  • @Service : 在業務邏輯層(service層)使用
  • @Repository : 在資料訪問層(dao層)使用.
  • @Controller : 在展現層(MVC--SpringMVC)使用

 

注入Bean的註解:

  • @Aautowired : Spring提供的註解.
  • @Inject : JSR-330提供的註解
  • @Resource : JSR-250提供的註解

 

配置檔案的註解:

  • @Configuration : 宣告當前類是個配置類,相當於一個Spring配置的xml檔案.
  • @ComponentScan (cn.test.demo): 自動掃描包名下所有使用 @Component @Service  @Repository @Controller 的類,並註冊為Bean
  • @WiselyConfiguration : 組合註解 可以替代 @Configuration和@ComponentScan
  • @Bean : 註解在方法上,宣告當前方法的返回值為一個Bean.
    • @Bean(initMethod="aa",destroyMethod="bb")--> 指定 aa和bb方法在構造之後.Bean銷燬之前執行.

 

AOP切面程式設計註解:

  • @Aspect : 宣告這是一個切面 
  • @After @Before. @Around 定義切面,可以直接將攔截規則(切入點 PointCut)作為引數
  • @PointCut : 專門定義攔截規則 然後在 @After @Before. @Around 中呼叫
  • @Transcational : 事務處理
  • @Cacheable : 資料快取
  • @EnableAaspectJAutoProxy : 開啟Spring 對 這個切面(Aspect )的支援
  • @Target (ElementType.TYPE):元註解,用來指定註解修飾類的那個成員 -->指定攔截規則
  • @Retention(RetentionPolicy.RUNTIME) 
    • --->當定義的註解的@Retention為RUNTIME時,才能夠通過執行時的反射機制來處理註解.-->指定攔截規則

 

Spring 常用配置:

  • @import :匯入配置類
  • @Scope : 新建Bean的例項 @Scope("prototype") 宣告Scope 為 Prototype
  • @Value : 屬性注入
    • @Value ("我愛你")  --> 普通字串注入
    • @Value ("#{systemProperties['os.name']}") -->注入作業系統屬性
    • @Value ("#{ T (java.lang.Math).random()  * 100.0 }") --> 注入表示式結果
    • @Value ("#{demoService.another}") --> 注入其他Bean屬性
    • @Value ( "classpath:com/wisely/highlight_spring4/ch2/el/test.txt" ) --> 注入檔案資源
    • @Value ("http://www.baidu.com")-->注入網址資源
    • @Value ("${book.name}" ) --> 注入配置檔案  注意: 使用的是$ 而不是 #
  • @PostConstruct : 在建構函式執行完之後執行
  • @PreDestroy  : 在 Bean 銷燬之前執行
  • @ActiveProfiles : 用來宣告活動的 profile
  • @profile: 為不同環境下使用不同的配置提供了支援
    •  @Profile("dev") .......對方法名為 dev-xxxx的方法提供例項化Bean
  • @EnableAsync : 開啟非同步任務的支援(多執行緒)
  • @Asyns : 宣告這是一個非同步任務,可以在類級別 和方法級別宣告.
  • @EnableScheduling : 開啟對計劃任務的支援(定時器)
  • @Scheduled : 宣告這是一個計劃任務 支援多種計劃任務,包含 cron. fixDelay fixRate
    • @Scheduled (dixedDelay = 5000) 通過註解 定時更新
  • @Conditional : 條件註解,根據滿足某一特定條件建立一個特定的Bean
  • @ContextConfiguration : 載入配置檔案
    • @ContextConfiguration(classes = {TestConfig.class})
    • @ContextConfiguration用來載入ApplicationContext 
    • classes屬性用來載入配置類
  • @WebAppCofiguration : 指定載入 ApplicationContext是一個WebApplicationContext

@Enable*註解:

  • @EnableAsync : 開啟非同步任務的支援(多執行緒)
  • @EnableScheduling : 開啟對計劃任務的支援(定時器)
  • @EnableWebMVC : 開啟對Web MVC 的配置支援
  • @EnableAaspectJAutoProxy : 開啟Spring 對 這個切面(Aspect )的支援
  • @EnableConfigurationProperties 開啟對@ConfigurationProperties註解配置Bean的支援
  • @EnableJpaRepositories : 開啟對Spring Data JAP Repository 的支援
  • @EnableTransactionManagement 開啟對註解式事物的支援
  • @EnableCaching開啟註解是快取的支援.
  • @EnableDiscoveryClient 讓服務發現伺服器,使用伺服器.Spring cloud 實現服務發現
  • @EnableEurekaServer 註冊伺服器 spring cloud 實現服務註冊@
  • @EnableScheduling 讓spring可以進行任務排程,功能類似於spring.xml檔案中的名稱空間<task:*>
  • @EnableCaching 開啟Cache快取支援;

SpringMVC 常用註解:

  • @Controller : 註解在類上 宣告這個類是springmvc裡的Controller,將其宣告為一個spring的Bean.
  • @RequestMapping :可以註解在類上和方法上 對映WEB請求(訪問路徑和引數)
    • @RequestMapping(value= "/convert",produces+{"application/x-wisely"}) 設定訪問URL 返回值型別
  • @ResponseBody : 支援將返回值放入response體內 而不是返回一個頁面(返回的是一個組資料)
  • @RequestBody : 允許request的引數在request體中,而不是直接連線在地址後面 次註解放置在引數前
  • @Path Variable : 用來接收路徑引數 如/test/001,001為引數,次註解放置在引數前
  • @RestController : @Controller + @ResponseBody 組合註解
  • @ControllerAdvice : 通過@ControllerAdvice可以將對已控制器的全域性配置放置在同一個位置
  • @ExceptionHandler : 用於全域性處理控制器的異常
    • @ExceptionHandier(value=Exception.class) -->通過value屬性可過濾攔截器條件,攔截所有的異常
  • @InitBinder : 用來設定WebDataBinder , WebDataBinder用來自動繫結前臺請求引數到Model中.
  • @ModelAttrbuute : 繫結鍵值對到Model中,
  • @RunWith : 執行器 
    • @RunWith(JUnit4.class)就是指用JUnit4來執行
    • @RunWith(SpringJUnit4ClassRunner.class),讓測試執行於Spring測試環境
    • @RunWith(Suite.class)的話就是一套測試集合,
  • @WebAppConfiguration("src/main/resources") : 註解在類上,用來宣告載入的ApplicationContex 是一個WebApplicationContext ,它的屬性指定的是Web資源的位置,預設為 src/main/webapp ,自定義修改為 resource

  • @Before : 在 xxx 前初始化

 

Spring Boot 註解:

  •  @SpringBootApplication : 是Spring Boot 專案的核心註解 主要目的是開啟自動配置
    • @SpringBootApplication註解是一個組合註解,主要組合了@Configuration .+@EnableAutoConfiguration.+@ComponentScan
  • @Value : 屬性注入,讀取properties或者 Yml 檔案中的屬性
  • @ConfigurationProperties : 將properties屬性和一個Bean及其屬性關聯,從而實現型別安全的配置
    • @ConfigurationProperties(prefix = "author",locations = {"classpath:config/author.properties"})
    • 通過@ConfigurationProperties載入配置,通過prefix屬性指定配置字首,通過location指定配置檔案位置
  • @EnableAutoConfiguration 註解:作用在於讓 Spring Boot   根據應用所宣告的依賴來對 Spring 框架進行自動配置
            這個註解告訴Spring Boot根據新增的jar依賴猜測你想如何配置Spring。由於spring-boot-starter-web新增了Tomcat和Spring MVC,所以auto-configuration將假定你正在開發一個web應用並相應地對Spring進行設定。
  • @ Configuration @EnableAutoConfiguration (exclude={xxxx.class}) 禁用特定的自動配置
  • @SpringBootApplication   註解等價於以預設屬性使用 @Configuration,@EnableAutoConfiguration和     @ComponentScan。

 

 

@SuppressWarnings註解

  • @SuppressWarnings("unchecked")
    • 告訴編譯器忽略 unchecked 警告資訊,如使用 list ArrayList等未進行引數化產生的警告資訊
  • @SuppressWarnings("serial")
    • 如 果編譯器出現這樣的警告資訊: The serializable class WmailCalendar does not declare a static final serialVersionUID field of type long     使用這個註釋將警告資訊去掉。
  • @SuppressWarnings("deprecation")
    • 如果使用了使用@Deprecated註釋的方法,編譯器將出現警告資訊。使用這個註釋將警告資訊去掉。
  • @SuppressWarnings("unchecked", "deprecation")
    • 告訴編譯器同時忽略unchecked和deprecation的警告資訊。
  • @SuppressWarnings(value={"unchecked", "deprecation"})
    • 等同於@SuppressWarnings("unchecked", "deprecation")

案例

 

@Entity

@Table(name = "S_PRODUCEINFO" )

@Data

@NoArgsConstructor

@AllArgsConstructor

public class ProduceInfoEntity {

 

    @Id

    @Column(name = "app_name", unique = true, length = 50)

    private String name;

 

    @Column(name = "status")

    @Enumerated(EnumType. STRING)

    private ProduceStatus status;

 

    @Column(name = "create_time", updatable = false)

    @Temporal(TemporalType. TIMESTAMP)

    @CreationTimestamp

    private Date createTime;

 

    @Column(name = "update_time")

    @Temporal(TemporalType. TIMESTAMP)

    @UpdateTimestamp

    private Date updateTime;

@Entity : 對映資料庫實體類

@Table(name = "S_PRODUCEINFO" ) : 表名為 "S_PRODUCEINFO"

@Id : 宣告主鍵ID

@Column(name = "app_name", unique = true, length = 50) :對應資料庫欄位,屬性

@Enumerated(EnumType. STRING) : 採用列舉值型別和資料庫欄位進行互動 

@Temporal : 時間格式 對映資料庫會得到規定時間格式的日期

       @Enumerted(EnumType.STRING)  HH:MM:SS 格式的日期

       @Enumerted(EnumType.DATE) 獲取年月日  yyyy-MM-dd 

       @Enumerted(EnumType.TIME) 獲取時分秒  HH:MM:SS

 

       @Autowired自動注入,@Resource、@PostConstruct以及@PreDestroy。
  @Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource預設按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
  @Resource裝配順序
  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常
  2. 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常
  3. 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配;

@Autowired 與@Resource的區別:

1、 @Autowired與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上。

2、 @Autowired預設按型別裝配(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:

1

2

@Autowired()@Qualifier("baseDao")

privateBaseDao baseDao;

3、@Resource(這個註解屬於J2EE的),預設按照名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當註解寫在欄位上時,預設取欄位名進行安裝名稱查詢,如果註解寫在setter方法上預設取屬性名進行裝配。當找不到與名稱匹配的bean時才按照型別進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

1

2

@Resource(name="baseDao")

privateBaseDao baseDao;

推薦使用:@Resource註解在欄位上,這樣就不用寫setter方法了,並且這個註解是屬於J2EE的,減少了與spring的耦合。這樣程式碼看起就比較優雅。

spring @Qualifier註解

@Autowired是根據型別進行自動裝配的。如果當Spring上下文中存在不止一個UserDao型別的bean時,就會丟擲BeanCreationException異常;如果Spring上下文中不存在UserDao型別的bean,也會丟擲BeanCreationException異常。我們可以使用@Qualifier配合@Autowired來解決這些問題。如下:

①可能存在多個UserDao例項

  1. @Autowired   
  2. @Qualifier("userServiceImpl")   
  3. public IUserService userService;   

或者

  1. @Autowired   
  2. public void setUserDao(@Qualifier("userDao") UserDao userDao) {   
  3.     this.userDao = userDao;   
  4. }  

 

這樣Spring會找到id為userServiceImpl和userDao的bean進行裝配。

 

②可能不存在UserDao例項

 

  1. @Autowired(required = false)   
  2. public IUserService userService  

 

個人總結:

@Autowired//預設按type注入
@Qualifier("cusInfoService")//一般作為@Autowired()的修飾用
@Resource(name="cusInfoService")//預設按name注入,可以通過name和type屬性進行選擇性注入

 

一般@Autowired和@Qualifier一起用,@Resource單獨用。

當然沒有衝突的話@Autowired也可以單獨用

 

 

-----------常用註解--------

 

--定義Bean的註解

 

@Controller

@Controller("Bean的名稱")

定義控制層Bean,如Action

 

@Service          

@Service("Bean的名稱")

定義業務層Bean

 

@Repository   

@Repository("Bean的名稱")

定義DAO層Bean

 

@Component  

定義Bean, 不好歸類時使用.

 

--自動裝配Bean (選用一種註解就可以)

@Autowired  (Srping提供的)

預設按型別匹配,自動裝配(Srping提供的),可以寫在成員屬性上,或寫在setter方法上

 

@Autowired(required=true)  

一定要找到匹配的Bean,否則拋異常。 預設值就是true 

 

@Autowired

@Qualifier("bean的名字") 

按名稱裝配Bean,與@Autowired組合使用,解決按型別匹配找到多個Bean問題。

 

@Resource   JSR-250提供的

預設按名稱裝配,當找不到名稱匹配的bean再按型別裝配.

可以寫在成員屬性上,或寫在setter方法上

可以通過@Resource(name="beanName") 指定被注入的bean的名稱, 要是未指定name屬性, 預設使用成員屬性的變數名,一般不用寫name屬性.

@Resource(name="beanName")指定了name屬性,按名稱注入但沒找到bean, 就不會再按型別裝配了.

 

@Inject   是JSR-330提供的

按型別裝配,功能比@Autowired少,沒有使用的必要。

 

--定義Bean的作用域和生命過程

@Scope("prototype")

值有:singleton,prototype,session,request,session,globalSession

 

@PostConstruct 

相當於init-method,使用在方法上,當Bean初始化時執行。

 

@PreDestroy 

相當於destory-method,使用在方法上,當Bean銷燬時執行。

--宣告式事務

@Transactional  

@Autowired @Resource @Qualifier的區別

實用理解:@Autowired @Resource 二選其一,看中哪個就用哪個。

 

簡單理解:

@Autowired 根據型別注入, 

@Resource 預設根據名字注入,其次按照型別搜尋

@Autowired @Qualifie("userService") 兩個結合起來可以根據名字和型別注入

 

複雜理解:

比如你有這麼一個Bean

@Service(“UserService”)

public Class UserServiceImpl implements UserService{};

現在你想在UserController 裡面使用這個UserServiceImpl 

public Class UserController {

@AutoWire   //當使用這個注入的時候上面的 UserServiceImpl 只需要這樣寫 @Service,這樣就會自動找到UserService這個型別以及他的子型別。UserServiceImpl 實現了UserService,所以能夠找到它。不過這樣有一個缺點,就是當UserService實現類有兩個以上的時候,這個時候會找哪一個呢,這就造成了衝突,所以要用@AutoWire注入的時候要確保UserService只有一個實現類。

@Resource 預設情況下是按照名稱進行匹配,如果沒有找到相同名稱的Bean,則會按照型別進行匹配,首先,根據這個註解的匹配效果可以看出,它進行了兩次匹配,也就是說,如果你在UserService這個類上面這樣寫註解,@Service,它會怎麼找呢,首先是找相同名字的,如果沒有找到,再找相同型別的,而這裡的@Service沒有寫名字,這個時候就進行了兩次搜尋,顯然,速度就下降了許多。UserServiceImpl 上面如果有@Service預設的名字 是這個userServiceImpl,注意看,就是把類名前面的大寫變成小寫,就是預設的Bean的名字了。 @Resource根據名字搜尋是這樣寫@Resource("userService"),如果你寫了這個名字叫userService,那麼UserServiceImpl上面必須也是這個名字,不然還是會報錯。

 

@Autowired @Qualifie("userService") 是直接按照名字進行搜尋,也就是說,對於UserServiceImpl 上面@Service註解必須寫名字,不寫就會報錯,而且名字必須是@Autowired @Qualifie("userService") 保持一致。如果@Service上面寫了名字,而@Autowired @Qualifie() ,一樣會報錯。

 

private UserService userService;

 

實際的工作是根據實際情況來使用的,通常使用AutoWire和@Resource多一些,bean的名字不用寫,而UserServiceImpl上面能會這樣寫 @Service("userService")。訪問速度比較好,通常是考慮速度的話。這個時候@AutoWire沒有@Resource好用,因為@Resource可以根據名字來搜尋,是這樣寫的@Resource("userService")。這個@Autowired @Qualifie("userService") 也可以用名字啊,為什麼不用呢,原因很簡單,增加工作量。而如果你不用註解,用xml檔案的時候,對於注入Bean的時候要求寫一個Id,xml檔案時候的id就相當於這裡的名字。

通常情況一個Bean的註解寫錯了,會報下面這些錯誤,最為常見,

No bean named 'user' is defined,這個表示沒有找到被命名為user的Bean,通俗的說,就是名字為user的型別,以及它的子型別,出現這個錯誤的原因就是注入時候的型別名字為user,而搜尋的時候找不到,也就是說可能那個搜尋的型別,並沒有命令為user,解決辦法就是找到這個型別,去命令為user,

 

下面這個錯誤也常見,

No qualifying bean of type [com.service.UserService] found for dependency:

這個錯誤的原因就是型別上面沒有加@Service這個注入,不僅僅是@Service,如果是其他層也會出現這個錯誤,這裡我是以Service為例子說明,如果是DAO層就是沒有加@Repository,Controller層,則是沒有加@Controller。

還有,如果你還是想再簡單點,無論是DAO,Controller,Service三個層,都可以用這個註解,@Component,這個註解通用所有的Bean,這個時候你可能會說了,有通常的為什麼用的人少呢,那是因為MVC這個分層的設計原則,用@Repository,@Service,@Controller,這個可以區別MVC原則中的DAO,Service,Controller。便於識別。

 

Spring框架中@Autowired標籤時預設情況下使用

Java程式碼 

  1. @Autowired  
 @Autowired

註釋進行自動注入時,Spring 容器中匹配的候選 Bean 數目必須有且僅有一個。當找不到一個匹配的 Bean 時,Spring 容器將丟擲 BeanCreationException 異常,並指出必須至少擁有一個匹配的 Bean。

@Autowired 預設是按照byType進行注入的,如果發現找到多個bean,則,又按照byName方式比對,如果還有多個,則報出異常。

例子:

@Autowired
private ExamUserMapper examUserMapper;  - ExamUserMapper是一個介面

 

1. spring先找型別為ExamUserMapper的bean

2. 如果存在且唯一,則OK;

3. 如果不唯一,在結果集裡,尋找name為examUserMapper的bean。因為bean的name有唯一性,所以,到這裡應該能確定是否存在滿足要求的bean了

 

@Autowired也可以手動指定按照byName方式注入,使用@Qualifier標籤,例如:

@Autowired () @Qualifier ( "baseDao" )



  Spring 允許我們通過

Java程式碼 

  1. @Qualifier  
@Qualifier

註釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常。 

  

Java程式碼 

  1. @Qualifier("XXX")  
@Qualifier("XXX")

中的 XX是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。 

  @Autowired 可以對成員變數、方法以及建構函式進行註釋,而 @Qualifier 的標註物件是成員變數、方法入參、建構函式入參。 

    Spring不但支援自己定義的@Autowired註解,還支援幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroy。 

  

Java程式碼 

  1. @Resource  
@Resource

的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource預設按 byName自動注入罷了。@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。 

  @Resource裝配順序 
  1. 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常 
  2. 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常 
  3. 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常 
  4. 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配

 

@Conditional註解可以根據程式碼中設定的條件裝載不同的bean,在設定條件註解之前,先要把裝載的bean類去實現Condition介面,然後對該實現介面的類設定是否裝載的條件。先建立一個介面,然後建立兩個實現該介面的類,通過條件註解去實現在容器中到底裝載哪個實現類,即在spring容器中裝載那個bean。

1、建立服務介面
在該示例介面中,建立一個人的介面,並建立一個服務方法,然後通過該介面分別實現一個男人和一個女人的實現類,通過註解去判斷裝載的bean。介面程式碼為:

package com.spring.conditional.annotation;

//一個服務介面
public interface Person {
    void birth();
}

2、介面實現類
下面分別實現一個男人和一個女人的實現類。

男人的實現方類:

package com.spring.conditional.annotation;

public class Man implements Person {

    @Override
    public void birth() {
        System.out.println("我不會生孩子……");
    }

}

女人的實現類為:

package com.spring.conditional.annotation;

public class Woman implements Person {

    @Override
    public void birth() {
        System.out.println("我要生孩子了……");
    }

}

3、建立Man和Woman的判斷條件類
Man的條件類

package com.spring.conditional.annotation;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class ManCondition implements Condition {

    @Override
    public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
        return false;
    }
}

Woman的條件類

package com.spring.conditional.annotation;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

public class WomanCondition implements Condition {

    @Override
    public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) {
        return true;
    }
}

4、建立配置類
package com.spring.conditional.annotation;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class ConditionalConfig {

    @Bean
    @Conditional(ManCondition.class)
    //如果ManCondition中的match方法返回結果true,就建立該Bean,否則不建立
    public Man getMan(){
        return new Man();
    }


    @Bean
    @Conditional(WomanCondition.class)
    public Woman getWoman(){
        return new Woman();
    }
}

5、建立測試方法
package com.spring.conditional.annotation;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestMain {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConditionalConfig.class);
        Person person = ctx.getBean(Person.class);
        //通過條件類判斷,只有Woman的條件類返回true,所以在容器中只能找到Woman的實現類的裝載bean,而Woman又是繼承自Person的,所以,在容器中可以找到一個唯一的Bean,通過getBean獲取到。
        System.out.println(person);
        person.birth();
    }

}

輸出結果為:

com.spring.conditional.annotation.Woman@75881071
我要生孩子了……

 

@EnableWebSecurity註解啟用web許可權認證; 

自定義一個類,在類上面加@EnableWebSecurity註解
有兩種方式: 
一是直接在入口類中加上該註解,入口類不需要繼承自WebSecurityConfigurerAdapter 
二是新增註解後再繼承自WebSecurityConfigurerAdapter類; 繼承自該類後,將會自動新增如表單登入、記住使用者名稱密碼等十來個個Filter 
這些Filter是在HttpSecurity中定義的; 而HttpSecurity又是在WebSecurityConfigurerAdapter中建立的使用的

 

 

@RunWith的引數是SpringJUnit4ClassRunner.class,開啟了Spring整合測試支援。

@ContextConfiguration指定了如何載入應用程式上下文

 

@SpringApplicationConfiguration的用法和@ContextConfiguration大致相同,但 也有不同的地方,@SpringApplicationConfiguration載入Spring應用程式上下文的方式同 SpringApplication相同,處理方式和生產應用程式中的情況相同。這包括載入外部屬性和 Spring Boot日誌

@SpringApplicationConfiguration在Spring Boot應用程式編寫測試時代替@ContextConfiguration,是大多數情況下

 

       @RunWith(SpringJUnit4ClassRunner.class)

@WebAppConfiguration註解宣告,由SpringJUnit4ClassRunner建立的應用程式上下 文應該是一個WebApplicationContext(相對於基本的非WebApplicationContext)

@Before註解,表明它應該在測試方法之前執行

 

@WithMockUser:載入安全上下文,其中包含一個UserDetails,使用了給定的使用者名稱、 密碼和授權。

 @WithUserDetails:根據給定的使用者名稱查詢UserDetails物件,載入安全上下文

@WebIntegrationTest註解用在測試類上,宣告Spring Boot為測試建立應用程式上下文,啟動一個嵌入式的Servlet容器 ,如圖:

@Value註解是spring的,注入值

 例: @Value("${local.server.port}")

          private int port;

 

 

 

相關文章