【Spring如何使用注解機制完成自動裝配】
Java實例構造時會調用默認父類無參構造方法,Spring正是利用了這一點,讓"操作元素的代碼"得以執行。
【兩種處理策略】
(1)類級別的注解:如@Component、@Repository、@Controller、@Service以及JavaEE6的@ManagedBean和@Named注解,都是添加在類上面的類級別注解。
Spring容器根據注解的過濾規則掃描讀取注解Bean定義類,並將其注冊到Spring IoC容器中。
(2)類內部的注解:如@Autowire、@Value、@Resource以及EJB和WebService相關的注解等,都是添加在類內部的字段或者方法上的類內部注解。
SpringIoC容器通過Bean后置注解處理器解析Bean內部的注解。
Spring實現@Autowire解析和注入的核心的類是通過AutowiredAnnotationBeanPostProcessor來實現的。
我們可以通過其方法列表看出,其中對字段的注入,對屬性的注入,還有選擇相應的構造方法來注入。
1,從構造方法的緩存中查詢其構造方法
2,若緩存中不存在,則根據反射獲取所有構造方法
3,遍歷所有構造方法,查詢器是否含有@Autowired屬性
4,判斷Autowired注解中指定了required屬性 (required屬性就是判斷是否強依依賴)若存在required就使用默認構造方法。
5,返回指定的構造方法
注入的時候則是通過inject方法來實現。
================================================================================================================================
Spring對注解的支持主要都是通過反射來獲取相應的注解,來做相應的處理,我們的工程中大部分都是使用@Service 和@Autowired來使用,其實我們還可以使用到其他的注解來加快我們的開發,滿足我們的多樣性需求。
annotation是挺簡單的東西.其實就是個聲明。然后通過反射去取那些聲明了值。
autowire其實也是這個意思。通過反射去看你autowire的方式,通過定義的方式,去給你聲明的變量賦值。
通過java的反射機制相關的API來訪問Annotation信息。
相關類(框架或工具中的類)根據這些信息來決定如何使用該程序元素或改變它們的行為。
Java語言解釋器在工作時會忽略這些Annotation,因此在JVM中這些Annotation是“不起作用”的,只能通過配套的工具才能對這些Annotation類型的信息進行訪問和處理。
注解本身不做任何事情,只是像xml文件一樣起到配置作用。
注解代表的是某種業務意義,注解背后處理器的工作原理如上源碼實現:
——首先解析所有屬性,判斷屬性上是否存在指定注解。
——如果存在則根據搜索規則取得bean,然后利用反射原理注入。
——如果標注在字段上面,也可以通過字段的反射技術取得注解,根據搜索規則取得bean,然后利用反射技術注入。
================================================================================================================================
Spring 3.0 新增了另外兩個實現類:AnnotationConfigApplicationContext 和 AnnotationConfigWebApplicationContext。從名字便可以看出,它們是為注解而生,直接依賴於注解作為容器配置信息來源的 IoC 容器初始化類。由於 AnnotationConfigWebApplicationContext 是 AnnotationConfigApplicationContext 的 web 版本,其用法與后者相比幾乎沒有什么差別,因此本文將以 AnnotationConfigApplicationContext 為例進行講解。
我們需要在用於指定配置信息的類上加上 @Configuration 注解,以明確指出該類是 Bean 配置的信息源。並且 Spring 對標注 Configuration 的類有如下要求:
配置類不能是 final 的;
配置類不能是本地化的,亦即不能將配置類定義在其他類的方法內部;
配置類必須有一個無參構造函數。
AnnotationConfigApplicationContext 將配置類中標注了 @Bean 的方法的返回值識別為 Spring Bean,並注冊到容器中,受 IoC 容器管理。@Bean 的作用等價於 XML 配置中的 <bean/> 標簽。
在一般的項目中,為了結構清晰,通常會根據軟件的模塊或者結構定義多個 XML 配置文件,然后再定義一個入口的配置文件,該文件使用 <import/> 將其他的配置文件組織起來。最后只需將該文件傳給 ClassPathXmlApplicationContext 的構造函數即可。
針對基於注解的配置,Spring 也提供了類似的功能,只需定義一個入口配置類,並在該類上使用 @Import 注解引入其他的配置類即可,最后只需要將該入口類傳遞給 AnnotationConfigApplicationContext。
@Configuration
@Import({BookStoreServiceConfig.class,BookStoreDaoConfig.class})
public class BookStoreConfig{ … }
================================================================================================================================
http://zxf-noimp.iteye.com/blog/1071765
【定義注解】
// 在運行時執行
@Retention(RetentionPolicy.RUNTIME)
// 注解適用地方(字段和方法)
@Target({ ElementType.FIELD, ElementType.METHOD })
public @interface ZxfResource {
//注解的name屬性
public String name() default "";
}
【注解處理器】
public ClassPathXMLApplicationContext(String fileName) {
//讀取配置文件中管理的bean
this.readXML(fileName);
//實例化bean
this.instancesBean();
//注解處理器
this.annotationInject();
}
================================================================================================================================
