【framework】spring-註解(annotation)
近來發現把寫部落格當成任務了。呵呵,調整下了下心態:我在這裡寫,只是希望你看到,能有所幫助。
spring註解的發展史
在spring2.5的官方指導裡指出,spring從2.0開始引入了一些用於配置的annotation, 包括 @Transactional, @Required and @PersistenceContext/@PersistenceUnit.
然而我在一篇文章裡,看到spring註解從1.2開始便有了,於是我不得不回頭去查閱了下spring相關文件。得出如下結論:
1. spring1.0: 從1.0開始就在對後設資料問題出謀劃策,沒有正式引入註解。但有了SOURCE級別的後設資料支援
2. spring1.2: 在1.2的時候是java1.5的釋出,並且面對要相容1.3,1.4版本的問題,但已經有了基於java5.0的註解如: @ManagedResource,基本無關注。 aspectJ 在該版本中仍在建設過程中,還停留在aspect。
3. spring2.0 :有了比較多的註解,包括AspectJ已經採用了註解方法,並且支援xml配置
4. spring2.5: 引入了用於配置的完整的Annotation集合: @Autowired,以及對JSR-250註解@Resource, @PostConstruct and @PreDestroy的支援
5. spring3.0: 註解已經非常的豐富,spring的 JavaConfig專案已經加入到spring框架中,這意味著將直接支援如@Configuration,@Bean,@Value等標籤
6. spring3.1: 對@Configuration有所增強,充實。
認識註解:
我相信大家接觸註解(annotation),最早應該是@Override,@Deprecated,@Suppress Warnings,就算接觸不多,也沒關係,我這裡儘量系統的說一遍。
1. 註解:也被叫做 後設資料(其實我覺得更是後設資料的一種表現形式),為程式碼新增資訊提供了一種形式化的方法,在稍後的某個時候用到這些資料
2. 後設資料: 用於描述資料的資料(MetaDate),翻譯成資訊的資訊會跟更好理解,舉例來說:我這邊文章就是一些資料,或者資訊,而對這個文章的標題,時間,關鍵字,都可以稱為後設資料
3. 註解是後設資料與原始碼結合在一起,但不儲存在外部文件(如xml)的趨勢下催生的
陰暗的說,其實你知道上面這些也沒大用,反正能寫能用就成,下面介紹註解的格式
註解的格式
注意: 註解本身不做任何事
註解可以與其他任何修飾符共同作用於方法,例如public,static或者void。從語法角度看,註解的使用方式與修飾符使用幾乎一模一樣。
為何說幾乎,舉例:
有方法:
public void create(int i){} |
@Test, @Test1 |
可以如下寫法:
1.
- @Test
- public void create(int i){}
2.
- public @Test void create(int i){}
- @Test public void create(int i){}
- //注意不能放在void的後面
3.
- public void create(@Test int i){}
4.
- @Test@Test1
- public void create(int i){}
- //註解以@分隔,與空白符包括行(row) 無關
java中自定義一個註解和應用:
只舉一個簡單例子,算是入門。但對你理解spring註解將會是個不錯的過渡,至少你能感覺到,註解原來這麼簡單。
例子:
- import java.lang.annotation.*;
- @Target(ElementType.METHOD)//註解只能用於方法
- @Retention(RetentionPolicy.RUNTIME)//註解在執行期也保留,可以通過反射讀取註解資訊
- public @interface Scholar {
- public int id();
- public String descrition() default "no description";
- }
建立一個類TestScholar 來應用@Scholar
程式碼:
- //@Scholar(id=1)//Scholar只能用於方法
- public class TestScholar {
- @Scholar(id=1)
- public void test() {};
- }
效果圖:
通過上面的例子,對註解算是有些認識。注意:
1. @Target如果你是第一次接觸,不要急,下面有講解
2. 你需要注意 註解的方式很像介面,欄位定義需要加小括號
3. 註解可以有預設,如果預設(default),則可以不賦值
元註解
記得後設資料的解釋嗎?是的,元註解專職負責註解其他註解
元註解 |
引數 |
說明 |
@Target |
表示註解可用於什麼地方 | |
CONSTRUCTOR | 構造器的宣告 | |
FIELD | 域宣告(包括enum例項) | |
LOCAL_VARIABLE | 區域性變數宣告 | |
METHOD | 方法宣告 | |
PACKAGE | 包宣告 | |
PARAMETER | 引數宣告 | |
TYPE | 類,介面(包括註解)或者enum宣告 | |
@Retention |
|
表示需要什麼級別儲存該註解資訊 |
SOURCE | 註解將被編譯器丟棄 | |
CLASS | 註解在class檔案中可用,會被VM丟棄 | |
RUNTIME | VM在執行期被保留,可以通過反射機制讀取註解 | |
@Documented |
|
將此註解包含在Javadoc中 |
@Inherited |
允許子類整合父類中的註解 |
註解型別
所有基本型別(int,float,boolean等) String Class enum Annotation 以上型別的陣列 |
讀取註解的內容:
通過反射機制,都會有getAnnotation()方法
如方法(Method)的:
- for(Method m : of.getDeclaredMethods())
- Scholar scholar = m.getAnnotation(Scholar.class)
如果是初學,可能要去專門學習下,呵呵,這裡只是為了給spring做個入門。
spring2.5 註解
spring2.5算是一個里程碑的版本,而註解2個比較大的改革便是:
1. Annotation驅動的bean配置
2. 對Spring MVC的支援
分別講解一下:
1.Annotation驅動的bean配置
1.1 基於註解(Annotation-based)的配置
要使註解可用,您必須使用 Java 5 (Tiger)或更新的版本,以使得可以訪問原始碼層次的註解。這些註解可以被註冊為獨立 bean 的定義,但它們也可以被隱式地註冊,通過基於 XML 的配置方式,如下例(請注意包含 'context' 名稱空間):
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <context:annotation-config/>
- <!--注意:xmlns:context="http://www.springframework.org/schema/context" -->
- <!--(隱式註冊 post-processors 包括了
- AutowiredAnnotationBeanPostProcessor,
- CommonAnnotationBeanPostProcessor,
- PersistenceAnnotationBeanPostProcessor,也包括了前面提到的 RequiredAnnotationBeanPostProcessor。) -->
- </beans>
1.2 @Autowired
引用些官方例子:
1)@Autowired 註解可以用於“傳統的”setter 方法,如下例:
- public class SimpleMovieLister {
- private MovieFinder movieFinder;
- @Autowired
- public void setMovieFinder(MovieFinder movieFinder) {
- this.movieFinder = movieFinder;
- }
- // ...
- }
2)這個註解也可以用於以屬性為引數/多個引數的方法
- public class MovieRecommender {
- private MovieCatalog movieCatalog;
- private CustomerPreferenceDao customerPreferenceDao;
- @Autowired
- public void prepare(MovieCatalog movieCatalog,
- CustomerPreferenceDao customerPreferenceDao) {
- this.movieCatalog = movieCatalog;
- this.customerPreferenceDao = customerPreferenceDao;
- }
- // ...
- }
3)@Autowired註解甚至可以用於構造器與欄位:
- public class MovieRecommender {
- @Autowired
- private MovieCatalog movieCatalog;
- private CustomerPreferenceDao customerPreferenceDao;
- @Autowired
- public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
- this.customerPreferenceDao = customerPreferenceDao;
- }
- // ...
- }
4)也可以一種提供來自ApplicationContext的特殊型別的所有 beans,註解欄位或者方法,例如:
- public class MovieRecommender {
- @Autowired
- private MovieCatalog[] movieCatalogs;
- // ...
- }
5)這同樣適用於集合型別:
- public class MovieRecommender {
- private Set<MovieCatalog> movieCatalogs;
- @Autowired
- public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
- this.movieCatalogs = movieCatalogs;
- }
- // ...
- }
注意:在預設情況下,當出現0個候選的 beans時自動連線將失敗;預設行為把連線方法,構造器,欄位假設為 required 的依賴。這樣的行為如下所示:
- public class SimpleMovieLister {
- private MovieFinder movieFinder;
- @Autowired(required = false)
- public void setMovieFinder(MovieFinder movieFinder) {
- this.movieFinder = movieFinder;
- }
- // ...
- }
1.3 基於註解的微調
1)有多個例項,需要篩選出一個,可以通過Qualifier註解
- public class MovieRecommender {
- @Autowired
- @Qualifier("mainCatalog")
- private MovieCatalog movieCatalog;
- // ...
- }
2)@Qualifier註解也能夠被指定為構造器的引數或者方法的引數:
- public class MovieRecommender {
- private MovieCatalog movieCatalog;
- private CustomerPreferenceDao customerPreferenceDao;
- @Autowired
- public void prepare(@Qualifier("mainCatalog") MovieCatalog movieCatalog,
- CustomerPreferenceDao customerPreferenceDao) {
- this.movieCatalog = movieCatalog;
- this.customerPreferenceDao = customerPreferenceDao;
- }
- // ...
- }
2.對Spring MVC的支援
Spring 2.5 為MVC 控制器引入了一種基於Annotation(註解)的程式設計模型, 使用@RequestMapping, @RequestParam, @ModelAttribute等等註解。
1.要實現控制器@Controller自動探測
加入配置
- <!--package是要掃描的包-->
- <context:component-scan base-package="org.springframework.samples.petclinic.web"/>
2.一個例項
- @Controller
- @RequestMapping("/editPet.do")
- @SessionAttributes("pet")
- public class EditPetForm {
- private final Clinic clinic;
- @Autowired
- public EditPetForm(Clinic clinic) {
- this.clinic = clinic;
- }
- @ModelAttribute("types")
- public Collection<PetType> populatePetTypes() {
- return this.clinic.getPetTypes();
- }
- @RequestMapping(method = RequestMethod.GET)
- public String setupForm(@RequestParam("petId") int petId, ModelMap model) {
- Pet pet = this.clinic.loadPet(petId);
- model.addAttribute("pet", pet);
- return "petForm";
- }
- @RequestMapping(method = RequestMethod.POST)
- public String processSubmit(@ModelAttribute("pet") Pet pet,
- BindingResult result, SessionStatus status) {
- new PetValidator().validate(pet, result);
- if (result.hasErrors()) {
- return "petForm";
- } else {
- this.clinic.storePet(pet);
- status.setComplete();
- return "redirect:owner.do?ownerId=" + pet.getOwner().getId();
- }
- }
- }
spring2.5 對註解的2個主要關注點已經闡述,但是隨著註解的大量應用,spring可能融入一些其他的框架,如AspectJ ,都會有自己的註解,需要大家瞭解並且注意,但是他並不是與spring-framework實際相關。
收尾
我想這些東西,很多人都應該寫過,這裡就不反覆闡述。我寫文章的目的,是為spring3新特徵和加強(包括註解)做鋪墊,有時間就寫寫。
相關文章
- Spring-註解注入Spring
- Java —— 註解(Annotation)Java
- Java Annotation 註解Java
- Java 註解(Annotation)Java
- Java註解(Annotation)詳解Java
- java-Annotation註解Java
- Java之註解(Annotation)Java
- Java 註解Annotation研究Java
- 【Java.Core】註解 - AnnotationJava
- Java進階(一)Annotation(註解)Java
- Spring(三)——註解方式(Annotation)Spring
- Java註解(Annotation):請不要小看我!Java
- Java 註解 (Annotation)淺入深出Java
- Android 註解系列之Annotation(二)Android
- 元註解——java.lang.annotation.Target(1.8)Java
- 關於Java註解(annotation)的簡單理解Java
- Java學習之註解Annotation實現原理Java
- hibernate annotation註解方式來處理對映關係
- 「Android」Android開發你需要知道的註解(Annotation)Android
- JAVA ANNOTATION詳解Java
- Spring-注入方式Spring
- C# 在PDF中新增墨跡註釋Ink AnnotationC#
- Spring-讀取配置Spring
- 基於Annotation註解整合SSH框架和基於XML檔案配置Bean整合SSH框架框架XMLBean
- 註解中用於@target的方法annotation/--ElementType.METHOD,ElementType.TYPE對應方法,類介面
- Annotation
- Spring Framework 元件註冊 之 @ImportSpringFramework元件Import
- Spring Framework 元件註冊 之 FactoryBeanSpringFramework元件Bean
- 重新註冊iis的.NET Framework版本Framework
- 【mybatis annotation】資料層框架應用--Mybatis(二) 基於註解實現資料的CRUDMyBatis框架
- Spring-宣告式事務Spring
- JDK6.0的新特性之六:插入式註解處理API(Pluggable Annotation Processing API)JDKAPI
- java annotationJava
- Java自定義Annotation,通過反射解析AnnotationJava反射
- Java建立AnnotationJava
- 自定義Annotation
- JUnit basic annotation
- java 的annotationJava