廢話
最近想整理一波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
,只不過@Autowired
按byType
自動注入,而@Resource
預設按 byName
自動注入罷了。@Resource
有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析為bean的名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
@Resource裝配順序
- 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常
- 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常
- 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常
- 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一個原始型別進行匹配,如果匹配則自動裝配;
8. @Bean
Spring的@Bean註解用於告訴方法,產生一個Bean物件,然後這個Bean物件交給Spring管理。產生這個Bean物件的方法Spring只會呼叫一次,隨後這個Spring將會將這個Bean物件放在自己的IOC容器中。 SpringIOC 容器管理一個或者多個bean,這些bean都需要在@Configuration註解下進行建立,在一個方法上使用@Bean註解就表明這個方法需要交給Spring進行管理。
詳細瞭解@Bean 註解全解析:www.cnblogs.com/cxuanBlog/p…
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配置就是context:component-scan/, 將符合條件的元件加入到IOC容器中。
詳細瞭解點選:blog.csdn.net/luojinbai/a…
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 ;
}
複製程式碼
詳細內容可參考:blog.csdn.net/fcvtb/artic…
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應用環境下起效
以上註解都是條件註解,作用類似。這裡就不做過多介紹了~~ 有興趣的朋友可自行查閱官網:spring.io/
推薦
大廠筆試內容集合(內有詳細解析) 持續更新中....
文末
歡迎關注個人微信公眾號:Coder程式設計 歡迎關注Coder程式設計公眾號,主要分享資料結構與演算法、Java相關知識體系、框架知識及原理、Spring全家桶、微服務專案實戰、DevOps實踐之路、每日一篇網際網路大廠面試或筆試題以及PMP專案管理知識等。更多精彩內容正在路上~ 偶爾分享一些雜文~ 文章收錄至 Github: github.com/CoderMerlin… Gitee: gitee.com/573059382/c… 歡迎關注並star~