Spring全家桶註解一覽(精選)

點擊上方“Coder編程”,選擇“置頂公衆號”

技術文章第一時間送達!

Spring全家桶註解一覽(精選)

廢話

最近想整理一波Spring註解相關的文章,雖然寫CURD就只涉及到那些常用的註解。但是筆者我也想去了解一下其他註解,豐富下自己的知識面(提升一下逼格!)。
就想在網上搜了半天,好像大家的都差不多,也找不到原文出處了。這裏我就在此基礎上結合相關知識點做一下整理。以便自己或者大家參考查閱了~

幾大常見的註解以及使用

1. @Controller

@Controller:標註一個控制器組件類。標識一個該類是Spring MVC controller處理器,用來創建處理http請求的對象。組合註解(組合了@Component註解),應用在MVC層(控制層)

@Controller
public class TestController {
        @RequestMapping("/test")
        public String test(String name){
            return "hello";
        }
}

2. @RestController

Spring4之後加入的註解,原來在@Controller中返回json需要@ResponseBody來配合,如果直接用@RestController替代@Controller就不需要再配置@ResponseBody,默認返回json格式。

@RestController
public class TestController {
        @RequestMapping("/test")
        public String test(String name){
            return "hello";
        }
}

3. @Service

@Service 把類當做容器中的一個組件來使用。
當使用@Autowired註解則是實例化構造器。因爲在自動注入時,是一個接口類型,所以要在容器中找到相應的實現類注入。故@Service加到類上。組合註解(組合了@Component註解),應用在service層(業務邏輯)。

@Service
public interface UserService {
   User login(String username,String password); 
}
//當把註解寫在接口上時,spring容器會注入失敗。


//註解寫在類上  注入不會失敗。
@Service
public class UserServiceImpl  implements UserService{
       @Autowired
       private  UserMapper userMapper;
}

@Controller
@RequestMapping("user")
public class UserController {

    @Autowired
    private UserService userService
}

4. @Reponsitory

@Repository註解便屬於最先引入的一批,它用於將數據訪問層 (DAO 層 ) 的類標識爲 Spring Bean。具體只需將該註解標註在 DAO類上即可。爲什麼 @Repository 只能標註在 DAO 類上呢?這是因爲該註解的作用不只是將類識別爲Bean,同時它還能將所標註的類中拋出的數據訪問異常封裝爲 Spring 的數據訪問異常類型。Spring本身提供了一個豐富的並且是與具體的數據訪問技術無關的數據訪問異常結構,用於封裝不同的持久層框架拋出的異常,使得異常獨立於底層的框架。組合註解(組合了@Component註解),應用在DAO層(數據訪問層)。

5. @Component

把普通pojo實例化到spring容器中,相當於配置文件中的,表示一個帶註釋的類的一個"組件",成爲Spring管理的Bean。當使用基於註解的配置和類路徑掃描時,這些類被視爲自動檢測的候選對象。同時@Component還是一個元註解。

6. @Configuration

@Configuration作用在類上,聲明一個class需要被spring解析以擴充beanDefinition。
@Configration註解同時被@Component註解修飾,因此具有被自動加載的特點,被@Configuration修飾的類本身也會作爲definition註冊。value屬性是Configuration bean名稱。

7. @Resource

這個註解屬於J2EE的。@Resource的作用相當於@Autowired,只不過@AutowiredbyType自動注入,而@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方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配,如果匹配則自動裝配;

8. @Bean

Spring的@Bean註解用於告訴方法,產生一個Bean對象,然後這個Bean對象交給Spring管理。產生這個Bean對象的方法Spring只會調用一次,隨後這個Spring將會將這個Bean對象放在自己的IOC容器中。
SpringIOC 容器管理一個或者多個bean,這些bean都需要在@Configuration註解下進行創建,在一個方法上使用@Bean註解就表明這個方法需要交給Spring進行管理。

詳細瞭解@Bean 註解全解析:https://www.cnblogs.com/cxuanBlog/p/11179439.html

9.@Value

值得注入。經常與Spring EL表達式語言一起使用,注入普通字符,系統屬性,表達式運算結果,其他Bean的屬性,文件內容,網址請求內容,配置文件屬性值等等。
主要兩種使用方法:

  • @Value("#{configProperties['key']}")

  • @Value("${key}")

10. @PropertySource

指定文件地址。提供一種方便的、聲明性的機制,用於向Spring環境添加PropertySource。與@Configuration類一起使用。在app項目中,我們通過@PropertySource註解到JavaConfig類上,設置.properties配置文件的路徑。

@Component
@PropertySource(value = "application.properties")
public class Message {

    @Value("${demo.msg}")
    private String msg;

}

11.@ResponseBody

@ResponseBody註解表示該方法的返回的結果直接寫入HTTP響應正文中(ResponseBody),一般在異步獲取數據時使用,通常是在使用@RequestMapping後。返回值通常解析爲跳轉路徑,加上@ResponseBody後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP響應正文中。

12.@RequestMapping

使用 @RequestMapping 來映射 Request 請求與處理器,通過這個註解可以定義不同的處理器映射規則,即爲控制器指定可以處理哪些URL請求。

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

13. @SpringBootApplication

@SpringBootApplication是一個組合註解
源碼如下:

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

由源碼可知,主要包含三個註解@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan。

14. @ComponentScan

  • @ComponentScan(包掃描)component是組件,scan是掃描,所以這個註解的含義就是用來掃描組件的

  • ComponentScan就是掃描所標註的類所在包下的所有需要注入的組件,將其注入,這裏他是在@SpringBootApplication 中體現的,所以這個註解會自動注入所有在主程序所在包下的組件

  • 以前在ssm項目中我們需要去配置我們的包掃描,相對應的XML配置就是, 將符合條件的組件加入到IOC容器中。

詳細瞭解點擊:https://blog.csdn.net/luojinbai/article/details/85877956

15.@EnableAutoConfiguration

@EnableAutoConfiguration表示開啓自動裝配,註解主要作用從classpath中搜尋所有的META-INF/spring.factories配置文件,並將其中的org.spring-framework.boot.autoconfigure.EnableAutoConfiguration對應的配置項通過反射實例化爲對應的標註了@Configuration的javaConfig形式的IOC容器配置類,然後彙總爲一整個並加載到IOC容器。

源碼如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
  String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

  Class<?>[] exclude() default {};

  String[] excludeName() default {};
}

其中兩個比較重要的註解@AutoConfigurationPackage@Import({AutoConfigurationImportSelector.class})

  • @AutoConfigurationPackage表示獲取我們註解所在包下的組件去進行註冊

  • @Import({AutoConfigurationImportSelector.class})表示自動配置導入選擇器,從META-INF/spring.factories獲取我們的自動配置信息的


較爲重要註解以及使用

1. @ConfigurationProperties

將properties屬性與一個Bean及其屬性相關聯,從而實現類型安全的配置。例如:@ConfigurationProperties(prefix="connection")

@Data// lombok註解,相關知識可以自行查閱
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {

    private String username;
    private String remoteAddress;
    private String password ;

}

詳細內容可參考:https://blog.csdn.net/fcvtb/article/details/97488297

2. @ConditionalOnBean與@ConditionalOnMissingBean

@ConditionalOnBean@ConditionalOnMissingBean兩個註解都是條件註解,作用相反。

  • @ConditionalOnBean表示存當給定的在bean存在時,則實例化當前Bean。

  • @ConditionalOnMissingBean表示當給定的在bean不存在時,則實例化當前Bean。

@ConditionalOnBean

結合使用註解@ConditionalOnBean@Bean,可以做到只有特定名稱或者類型的Bean存在於BeanFactory時才創建某個Bean。例如:

@Configuration
public class ConditionalOnBeanConfig {

    @Bean
    public A beanA(){
        return new A(); // 創建一個Bean,名稱是 beanA,不需要滿足什麼前置條件,
    }

    @Bean
    @ConditionalOnBean(name="beanA")
    public B beanB(){
        // 僅在beanFactory存在一個名稱叫做beanA的bean時,當前方法初始化一個名字爲beanB的bean。
        return new B(); 
    }

    @Bean
    @ConditionalOnBean
    public C beanC(){
        //如果beanFactory不存在一個類型爲C的bean,則不創建該bean。
        // 如果當前項目僅有這一個 bean 配置文件,則因爲 beanFactory 中不存在一個類型爲C的 bean ,所以當前
        // 方法定義的名稱爲 beanC 的 bean 並不會被初始化。
        return new C(); 
    }

    @Bean
    public SimpleInt beanAInt(){
        // 創建一個類型爲 SimpleInt 的 bean ,其實現類使用 ASimpleInt
        return new ASimpleInt();
    }

    @Bean
    @ConditionalOnBean
    public SimpleInt beanBInt(){
        // 僅在 beanFactory 中存在一個類型爲 SimpleInt 的 bean 時才初始化一個類型同樣 爲 SimpleInt 
        // 的 bean ,bean 名稱爲 beanBInt
        return new BSimpleInt(); 
    }
}

@ConditionalOnMissingBean

配置類中有兩個Computer類的bean,一個是筆記本電腦,一個是備用電腦。如果當前容器中已經有電腦bean了,就不注入備用電腦,如果沒有,則注入備用電腦,這裏需要使用到@ConditionalOnMissingBean。

@Configuration
public class BeanConfig {

    @Bean(name = "notebookPC")
    public Computer computer1(){
        return new Computer("筆記本電腦");
    }

    @ConditionalOnMissingBean(Computer.class)
    @Bean("reservePC")
    public Computer computer2(){
        return new Computer("備用電腦");
    }
}

3. @ConditionalOnClass與@ConditionalOnMissingClass

@ConditionalOnClass@ConditionalOnMissingClass這兩個註解與@ConditionalOnBean與@ConditionalOnMissingBean兩個註解相似。

  • @ConditionalOnClass 表示當給定的類名在類路徑上存在,則實例化當前Bean

  • @ConditionalOnMissingClass 表示當給定的類名在類路徑上不存在,則實例化當前Bean

其他

@ConditionalOnSingleCandidate :DI容器中該類型Bean只有一個或@Primary的只有一個時起效
@ConditionalOnExpression :SpEL表達式結果爲true時
@ConditionalOnProperty :參數設置或者值一致時起效
@ConditionalOnResource :指定的文件存在時起效
@ConditionalOnJndi :指定的JNDI存在時起效
@ConditionalOnJava :指定的Java版本存在時起效
@ConditionalOnWebApplication :Web應用環境下起效
@ConditionalOnNotWebApplication :非Web應用環境下起效

以上註解都是條件註解,作用類似。這裏就不做過多介紹了~~
有興趣的朋友可自行查閱官網:https://spring.io/

推薦

https://www.processon.com/i/5cd53c2fe4b01941c8cf1c21(ProcessOn是一個在線作圖工具的聚合平臺~)

文末

歡迎關注個人微信公衆號:Coder編程
歡迎關注Coder編程公衆號,主要分享數據結構與算法、Java相關知識體系、框架知識及原理、Spring全家桶、微服務項目實戰、DevOps實踐之路、每日一篇互聯網大廠面試或筆試題以及PMP項目管理知識等。更多精彩內容正在路上~

文章收錄至
Github: https://github.com/CoderMerlin/coder-programming
Gitee: https://gitee.com/573059382/coder-programming
歡迎關注並star~

微信公衆號
發佈了211 篇原創文章 · 獲贊 248 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章