最近想整理一波Spring註解相關的文章,雖然寫CURD就只涉及到那些經常使用的註解。可是筆者我也想去了解一下其餘註解,豐富下本身的知識面(提高一下逼格!)。 就想在網上搜了半天,好像你們的都差很少,也找不到原文出處了。這裏我就在此基礎上結合相關知識點作一下整理。以便本身或者你們參考查閱了~html
@Controller:標註一個控制器組件類。標識一個該類是Spring MVC controller處理器,用來建立處理http請求的對象。組合註解(組合了@Component註解),應用在MVC層(控制層)java
@Controller
public class TestController {
@RequestMapping("/test")
public String test(String name){
return "hello";
}
}
複製代碼
Spring4
以後加入的註解,原來在@Controller
中返回json
須要@ResponseBody
來配合,若是直接用@RestController
替代@Controller
就不須要再配置@ResponseBody
,默認返回json格式。git
@RestController
public class TestController {
@RequestMapping("/test")
public String test(String name){
return "hello";
}
}
複製代碼
@Service 把類當作容器中的一個組件來使用。 當使用@Autowired註解則是實例化構造器。由於在自動注入時,是一個接口類型,因此要在容器中找到相應的實現類注入。故@Service加到類上。組合註解(組合了@Component註解),應用在service層(業務邏輯)。github
@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
}
複製代碼
@Repository註解便屬於最早引入的一批,它用於將數據訪問層 (DAO 層 ) 的類標識爲 Spring Bean。具體只需將該註解標註在 DAO類上便可。爲何 @Repository 只能標註在 DAO 類上呢?這是由於該註解的做用不僅是將類識別爲Bean,同時它還能將所標註的類中拋出的數據訪問異常封裝爲 Spring 的數據訪問異常類型。 Spring自己提供了一個豐富的而且是與具體的數據訪問技術無關的數據訪問異常結構,用於封裝不一樣的持久層框架拋出的異常,使得異常獨立於底層的框架。組合註解(組合了@Component註解),應用在DAO層(數據訪問層)。面試
把普通pojo實例化到spring容器中,至關於配置文件中的,表示一個帶註釋的類的一個"組件",成爲Spring管理的Bean。當使用基於註解的配置和類路徑掃描時,這些類被視爲自動檢測的候選對象。同時@Component仍是一個元註解。算法
@Configuration做用在類上,聲明一個class須要被spring解析以擴充beanDefinition。 @Configration註解同時被@Component註解修飾,所以具備被自動加載的特色,被@Configuration修飾的類自己也會做爲definition註冊。value屬性是Configuration bean名稱。spring
這個註解屬於J2EE的。@Resource
的做用至關於@Autowired
,只不過@Autowired
按byType
自動注入,而@Resource
默認按 byName
自動注入罷了。@Resource
有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。因此若是使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。若是既不指定name也不指定type屬性,這時將經過反射機制使用byName自動注入策略。編程
@Resource裝配順序json
Spring的@Bean註解用於告訴方法,產生一個Bean對象,而後這個Bean對象交給Spring管理。產生這個Bean對象的方法Spring只會調用一次,隨後這個Spring將會將這個Bean對象放在本身的IOC容器中。 SpringIOC 容器管理一個或者多個bean,這些bean都須要在@Configuration註解下進行建立,在一個方法上使用@Bean註解就代表這個方法須要交給Spring進行管理。安全
詳細瞭解@Bean 註解全解析:www.cnblogs.com/cxuanBlog/p…
值得注入。常常與Spring EL表達式語言一塊兒使用,注入普通字符,系統屬性,表達式運算結果,其餘Bean的屬性,文件內容,網址請求內容,配置文件屬性值等等。 主要兩種使用方法:
指定文件地址。提供一種方便的、聲明性的機制,用於向Spring環境添加PropertySource。與@Configuration類一塊兒使用。在app項目中,咱們經過@PropertySource註解到JavaConfig類上,設置.properties配置文件的路徑。
@Component
@PropertySource(value = "application.properties")
public class Message {
@Value("${demo.msg}")
private String msg;
}
複製代碼
@ResponseBody
註解表示該方法的返回的結果直接寫入HTTP響應正文中(ResponseBody),通常在異步獲取數據時使用,一般是在使用@RequestMapping
後。返回值一般解析爲跳轉路徑,加上@ResponseBody
後返回結果不會被解析爲跳轉路徑,而是直接寫入HTTP
響應正文中。
使用 @RequestMapping
來映射 Request
請求與處理器,經過這個註解能夠定義不一樣的處理器映射規則,即爲控制器指定能夠處理哪些URL請求。
用@RequestMapping
來映射URL
到控制器類,或者是到Controller
控制器的處理方法上。 當@RequestMapping
標記在Controller
類上的時候,裏面使用@RequestMapping
標記的方法的請求地址都是相對於類上的@RequestMapping 而言的; 當Controller
類上沒有標記@RequestMapping
註解時,方法上的@RequestMapping
都是絕對路徑。這種絕對路徑和相對路徑所組合成的最終路徑都是相對於根路徑「/ 」而言的。
@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。
@ComponentScan
(包掃描)component是組件,scan是掃描,因此這個註解的含義就是用來掃描組件的
ComponentScan就是掃描所標註的類所在包下的全部須要注入的組件,將其注入,這裏他是在@SpringBootApplication 中體現的,因此這個註解會自動注入全部在主程序所在包下的組件
之前在ssm項目中咱們須要去配置咱們的包掃描,相對應的XML配置就是context:component-scan/, 將符合條件的組件加入到IOC容器中。
詳細瞭解點擊:blog.csdn.net/luojinbai/a…
@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獲取咱們的自動配置信息的將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…
@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("備用電腦");
}
}
複製代碼
@ConditionalOnClass
與@ConditionalOnMissingClass
這兩個註解與@ConditionalOnBean與@ConditionalOnMissingBean兩個註解類似。
@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~