天天看點

【springboot】springboot 注解

目錄

​​@Autowired​​

​​@Component:​​

​​@Controller:​​

​​@Service:​​

​​@Repository:​​

​​@Override​​

​​@Service()​​

​​DAO層​​

​​@Bean​​

​​@Bean​​

​​@Configuration​​

​​@Autowired​​

​@Autowired​

​注解的意思就是,當Spring發現​

​@Autowired​

​注解時,将自動在代碼上下文中找到與其比對(預設是類型比對)的Bean,并自動注入到相應的地方去。

@Component:

這将 java 類标記為 bean。它是任何 Spring 管理元件的通用構造型。spring 的元件掃描機制現在可以将其拾取并将其拉入應用程式環境中。

@Controller:

這将一個類标記為 Spring Web MVC 控制器。标有它的 Bean 會自動導入到 IoC 容器中。

@Service:

此注解是元件注解的特化。它不會對 @Component 注解提供任何其他行為。您可以在服務層類中使用 @Service 而不是 @Component,因為它以更好的方式指定了意圖。

@Repository:

這個注解是具有類似用途和功能的 @Component 注解的特化。它為 DAO 提供了額外的好處。它将 DAO 導入 IoC 容器,并使未經檢查的異常有資格轉換為 Spring DataAccessException。

下面用案例來具體說明

UserRepository.java

package com.proc.bean.repository;

public interface UserRepository {

void save();
}      

這裡定義了一個UserRepository接口,其中定義了一個save方法

UserRepositoryImps.java

package com.proc.bean.repository;

import org.springframework.stereotype.Repository;

@Repository("userRepository")
public class UserRepositoryImps implements UserRepository{

@Override
public void save() {
System.out.println("UserRepositoryImps save");
    }
}      

定義一個UserRepository接口的實作類,并實作save方法,在這裡指定了該bean在IoC中辨別符名稱為userRepository

UserService.java

package com.proc.bean.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.proc.bean.repository.UserRepository;

@Service
public class UserService {

@Autowired
private UserRepository userRepository;

public void save(){
userRepository.save();
    }
}      

這裡需要一個UserRepository類型的屬性,通過@Autowired自動裝配方式,從IoC容器中去查找到,并傳回給該屬性

applicationContext.xml配置

<context:component-scan base-package="com.proc.bean" />      

測試代碼:

1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2 
3 UserService userService=(UserService) ctx.getBean("userService");
4 userService.save();      

輸出結果:UserRepositoryImps save

​​@Component、@Repository、@Service、@Controller差別​​

​​spring​​ 2.5 中除了提供 @Component 注釋外,還定義了幾個擁有特殊語義的注釋,它們分别是:@Repository、@Service 和 @Controller。

    在目前的 Spring 版本中,這 3 個注釋和 @Component 是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分别和持久層、業務層和控制層(Web 層)相對應。雖然目前這 3 個注釋和 @Component 相比沒有什麼新意,但 Spring 将在以後的版本中為它們添加特殊的功能。是以,如果Web 應用程式采用了經典的三層分層結構的話,最好在持久層、業務層和控制層分别采用@Repository、@Service 和 @Controller 對分層中的類進行注釋,而用 @Component 對那些比較中立的類進行注釋。

在一個稍大的項目中,通常會有上百個元件,如果這些元件采用xml的bean定義來配置,顯然會增加配置檔案的體積,查找以及維護起來也不太友善。 Spring2.5為我們引入了元件自動掃描機制,他可以在類路徑底下尋找标注了@Component,@Service,@Controller,@Repository注解的類,并把這些類納入進spring容器中管理。它的作用和在xml檔案中使用bean節點配置元件時一樣的。要使用自動掃描機制,我們需要打開以下配置資訊:  

@Override

@Override是僞代碼,表示重寫。(當然不寫@Override也可以),不過寫上有如下好處: 

1、可以當注釋用,友善閱讀;

2、編譯器可以給你驗證@Override下面的方法名是否是你父類中所有的,如果沒有則報錯。例如,你如果沒寫@Override,而你下面的方法名又寫錯了,這時你的編譯器是可以編譯通過的,因為編譯器以為這個方法是你的子類中自己增加的方法。

舉例:在重寫父類的onCreate時,在方法前面加上@Override 系統可以幫你檢查方法的正确性。

@Override

public void onCreate(Bundle savedInstanceState)

{…….}

這種寫法是正确的,如果你寫成:

@Override

public void oncreate(Bundle savedInstanceState)

{…….}

編譯器會報如下錯誤:The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以確定你正确重寫onCreate方法(因為oncreate應該為onCreate)。

而如果你不加@Override,則編譯器将不會檢測出錯誤,而是會認為你為子類定義了一個新方法:oncreate

在Spring2.0之前的版本中,@Repository注解可以标記在任何的類上,用來表明該類是用來執行與資料庫相關的操作(即dao對象),并支援自動處理資料庫操作産生的異常

在Spring2.5版本中,引入了更多的Spring類注解:@Component,@Service,@Controller。@Component是一個通用的Spring容器管理的單例bean元件。而@Repository, @Service, @Controller就是針對不同的使用場景所采取的特定功能化的注解元件。

是以,當你的一個類被@Component所注解,那麼就意味着同樣可以用@Repository, @Service, @Controller來替代它,同時這些注解會具備有更多的功能,而且功能各異。

最後,如果你不知道要在項目的業務層采用@Service還是@Component注解。那麼,@Service是一個更好的選擇。

就如上文所說的,@Repository早已被支援了在你的持久層作為一個标記可以去自動處理資料庫操作産生的異常(譯者注:因為原生的java操作資料庫所産生的異常隻定義了幾種,但是産生資料庫異常的原因卻有很多種,這樣對于資料庫操作的報錯排查造成了一定的影響;而Spring拓展了原生的持久層異常,針對不同的産生原因有了更多的異常進行描述。是以,在注解了@Repository的類上如果資料庫操作中抛出了異常,就能對其進行處理,轉而抛出的是翻譯後的spring專屬資料庫異常,友善我們對異常進行排查處理)。

注解 含義
@Component 最普通的元件,可以被注入到spring容器進行管理
@Repository 作用于持久層
@Service 作用于業務邏輯層
@Controller 作用于表現層(spring-mvc的注解)

https://msd.misuland.com/pd/3113337336633493026

這幾個注解幾乎可以說是一樣的:因為被這些注解修飾的類就會被Spring掃描到并注入到Spring的bean容器中。

總結

@Component, @Service, @Controller, @Repository是spring注解,注解後可以被spring架構所掃描并注入到spring容器來進行管理  @Component是通用注解,其他三個注解是這個注解的拓展,并且具有了特定的功能  @Repository注解在持久層中,具有将資料庫操作抛出的原生異常翻譯轉化為spring的持久層異常的功能。  @Controller層是spring-mvc的注解,具有将請求進行轉發,重定向的功能。  @Service層是業務邏輯層注解,這個注解隻是标注該類處于業務邏輯層。  用這些注解對應用進行分層之後,就能将請求處理,義務邏輯處理,資料庫操作處理分離出來,為代碼解耦,也友善了以後項目的維護和開發。

@Service()

此注注解屬于業務邏輯層,service或者manager層

預設按照名稱進行裝配,如果名稱可以通過name屬性指定,如果沒有name屬性,注解寫在字段上時,預設去字段名進行查找,如果注解寫在setter方法上,預設按照方法屬性名稱進行裝配。當找不到比對的bean時,才按照類型進行裝配,如果name名稱一旦指定就會按照名稱進行裝配

3. @Repository持久層

此注解式持久層元件,用于标注資料通路元件,即DAO元件

@Bean

​​https://www.jianshu.com/p/93727fa9bf23​​

用注解的方式代替xml配置,告訴spring容器加載哪些對象到容器中。

如:

POJO

public class Person {
private String name;
private Integer age;

public Person() {
    }

public Person(String name, Integer age) {
this.name = name;
this.age = age;
    }

// 省略 getter setter

// 後續會省略 toString 方法, 使用 IDE 自動生成就可以了
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
    }
}      

spring xml配置方式

<bean id="person" class="me.sjl.bean.Person">
<property name="age" value="18"/>
<property name="name" value="sjl"/>
</bean>


      

以上是我們使用傳統的 xml 配置方式建立一個 bean 的方式,下面我們使用注解來建立一個 bean。

 springboot 注解方式

@Bean

JavaConfig 方式

@Configuration
public class BeanConfig {

@Bean
public Person person() {
return new Person("SJL01", 20);
    }

}      

在配置類上打個一個 @Configuration 注解,表示聲明該類為 Spring 的配置類。在建立一個方法,方法傳回對象即我們要建立的對象 Person , 傳回該對象的執行個體。在方法上打上注解 @Bean即表示聲明該方法傳回的執行個體是受 Spring 管理的 Bean。

連結:https://www.jianshu.com/p/93727fa9bf23

@Configuration

從Spring3.0,@Configuration用于定義配置類,可替換xml配置檔案,被注解的類内部包含有一個或多個被@Bean注解的方法,這些方法将會被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext類進行掃描,并用于建構bean定義,初始化Spring容器。