springboot的註解的作用說明(全)
@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註解有六個屬性,下面分成三類進行說明。
1、value,method;
value:指定請求的實際地址,指定的地址可以是URITemplate 模式(後面將會說明);
method:指定請求的method型別,GET、POST、PUT、DELETE等;
2、consumes,produces;
Consumes:指定處理請求的提交內容型別(Content-Type),例如application/json,text/html;
produces:指定返回的內容型別,僅當request請求頭中的(Accept)型別中包含該指
定型別才返回;
3、params,headers;
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 |
|
3、@Resource(這個註解屬於J2EE的),預設按照名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當註解寫在欄位上時,預設取欄位名進行安裝名稱查詢,如果註解寫在setter方法上預設取屬性名進行裝配。當找不到與名稱匹配的bean時才按照型別進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
1 2 |
|
推薦使用:@Resource註解在欄位上,這樣就不用寫setter方法了,並且這個註解是屬於J2EE的,減少了與spring的耦合。這樣程式碼看起就比較優雅。
@Autowired是根據型別進行自動裝配的。如果當Spring上下文中存在不止一個UserDao型別的bean時,就會丟擲BeanCreationException異常;如果Spring上下文中不存在UserDao型別的bean,也會丟擲BeanCreationException異常。我們可以使用@Qualifier配合@Autowired來解決這些問題。如下:
①可能存在多個UserDao例項
- @Autowired
- @Qualifier("userServiceImpl")
- public IUserService userService;
或者
- @Autowired
- public void setUserDao(@Qualifier("userDao") UserDao userDao) {
- this.userDao = userDao;
- }
這樣Spring會找到id為userServiceImpl和userDao的bean進行裝配。
②可能不存在UserDao例項
- @Autowired(required = false)
- 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程式碼
- @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程式碼
- @Qualifier
@Qualifier
註釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常。
Java程式碼
- @Qualifier("XXX")
@Qualifier("XXX")
中的 XX是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。
@Autowired 可以對成員變數、方法以及建構函式進行註釋,而 @Qualifier 的標註物件是成員變數、方法入參、建構函式入參。
Spring不但支援自己定義的@Autowired註解,還支援幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroy。
Java程式碼
- @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;
相關文章
- SpringMVC的@ResponseBody註解說明SpringMVC
- Spring的@Qualifier註解使用說明Spring
- AndroidAnnotation常用註解使用說明Android
- Oracle中password file的作用及說明Oracle
- Spring原始碼系列:註解說明Spring原始碼
- Oracle密碼檔案的作用和說明Oracle密碼
- Swagger2常用註解說明Swagger
- SpringBoot整合說明Spring Boot
- API介面的要素以及API的作用說明API
- (zt)Oracle中password file orapwd的作用及說明Oracle
- Oracle中passwordfile的作用及說明考試大全Oracle
- Retrofit請求引數註解欄位說明
- JAVA註解的總結及其作用Java
- 阿里巴巴fastjson @JSONField 註解說明阿里ASTJSON
- springboot的@ConditionalOnBean註解Spring BootBean
- winscp操作說明,winscp操作說明的詳細解讀
- @GrpcServise 註解的作用和使用RPC
- springBoot自定義註解的使用Spring Boot
- SpringBoot註解Spring Boot
- mysql的my.cnf解釋說明MySql
- Nginx的nginx.conf配置檔案中文註釋說明Nginx
- 【SpringBoot系列】SpringBoot註解詳解Spring Boot
- C++中map的使用詳解說明C++
- Java正規表示式的解釋說明Java
- Springboot 常用註解Spring Boot
- Python基礎語法–註釋說明Python
- 阿里 Nacos 註冊中心 配置啟動說明阿里
- 完美解決CodeSmith無法獲取MySQL表及列Description說明註釋的方案MITMySql
- 全志R11 SDK版本說明書
- 【Spring註解驅動開發】使用@Scope註解設定元件的作用域Spring元件
- ip 命令的說明
- SpringBoot + MyBatis(註解版),常用的SQL方法Spring BootMyBatisSQL
- springboot:非同步註解@Async的前世今生Spring Boot非同步
- SpringBoot dubbo 的簡單使用註解版本Spring Boot
- 好程式設計師Java培訓分享註解與反射原理說明程式設計師Java反射
- JPA SQL 查詢、結果集對映(@NamedNativeQuery、@ColumnResult註解說明)SQL
- Solon 框架詳解(十一)- Solon Cloud 的配置說明框架Cloud
- 顯示卡的作用和功能介紹 集顯核顯獨顯區別說明