摘要:對自動裝配的支持對自動裝配的支持之前還沒有注解功能,在版本才正式加入了對注解機(jī)制的支持。注解相當(dāng)于一種標(biāo)記,允許程序在運行時動態(tài)地對擁有該標(biāo)記的成員進(jìn)行操作。
??在編寫 SpringMVC Demo 的過程中,對自動裝配有一種莫名的興奮感,只要容器中有相對應(yīng)的 Bean ,通過 @Autowire 注解,自動會將對應(yīng)的 Bean 注入到相關(guān)的屬性中,著的確是一個很強(qiáng)大的機(jī)制,但是在使用的過程中,也遇到了許多問題,其中有一個是,如果這個屬性的類型有多個實現(xiàn) Bean,那應(yīng)該注入哪一個Bean呢,翻了很多資料也沒有,只能夠自己看源碼,找答案。
Java 對自動裝配的支持
Java 對自動裝配的支持??JDK1.5之前還沒有注解功能,在1.5版本才正式加入了對注解機(jī)制的支持。
??注解相當(dāng)于一種標(biāo)記,允許程序在運行時動態(tài)地對擁有該標(biāo)記的成員進(jìn)行操作。
??百度百科里對注解功能的解釋是:
編寫文檔:通過代碼里標(biāo)識的元數(shù)據(jù)生成文檔【生成文檔doc文檔】
代碼分析:通過代碼里標(biāo)識的元數(shù)據(jù)對代碼進(jìn)行分析【使用反射】
編譯檢查:通過代碼里標(biāo)識的元數(shù)據(jù)讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】
??因此 Spring基于 JDK1.5,實現(xiàn)了注解功能。
那么現(xiàn)在我們通過自行編碼,簡單實現(xiàn) Spring 自動裝配的功能:
自定義注解:
/** * 自定義注解,用來配置方法 */ @Retention(RetentionPolicy.RUNTIME) // 表示注解在運行時依然存在 @Target(ElementType.METHOD) // 表示注解可以被使用于方法上 public @interface SayHiAnnotation { String paramValue() default "johness"; // 表示我的注解需要一個參數(shù)名為"paramValue" 默認(rèn)值為"johness"
自動裝配:
/** * 要使用SayHiAnnotation的元素所在類 * 由于我們定義了只有方法才能使用我們的注解,我們就使用多個方法來進(jìn)行測試 */ public class SayHiEmlement { // 普通的方法 public void SayHiDefault(String name){ System.out.println("Hi, " + name); } // 使用注解并傳入?yún)?shù)的方法 @SayHiAnnotation(paramValue="Jack") public void SayHiAnnotation(String name){ System.out.println("Hi, " + name); } // 使用注解并使用默認(rèn)參數(shù)的方法 @SayHiAnnotation public void SayHiAnnotationDefault(String name){ System.out.println("Hi, " + name); } }
測試代碼:
public class AnnotionOperator { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException { SayHiEmlement element = new SayHiEmlement(); // 初始化一個實例,用于方法調(diào)用 Method[] methods = SayHiEmlement.class.getDeclaredMethods(); // 獲得所有方法 for (Method method : methods) { SayHiAnnotation annotationTmp = null; if((annotationTmp = method.getAnnotation(SayHiAnnotation.class))!=null) // 檢測是否使用了我們的注解 method.invoke(element,annotationTmp.paramValue()); // 如果使用了我們的注解,我們就把注解里的"paramValue"參數(shù)值作為方法參數(shù)來調(diào)用方法 else method.invoke(element, "Rose"); // 如果沒有使用我們的注解,我們就需要使用普通的方式來調(diào)用方法了 } }
測試結(jié)果:
SayHiAnnotation()//Hi, Jack SayHiAnnotationDefault() //Hi, johness SayHiDefault()//Hi, Rose
可以看出,Spring 則是基于注解和反射 自行自動裝配
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/67414.html
摘要:跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準(zhǔn)備充分,到底是因為技術(shù)原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準(zhǔn)備充分),到底是因為技...
摘要:配置開啟注解模式簡化配置自動注冊默認(rèn)提供了一系列的功能數(shù)據(jù)綁定數(shù)字和日期的轉(zhuǎn)換的讀寫支持映射路徑靜態(tài)資源默認(rèn)配置加入對靜態(tài)資源的處理允許使用做整體配置映射后面的和類基本上都要自動包掃描,讓認(rèn)識然后就可以盡情的使用了。 花了點時間做的(比較水)筆記,有可能有漏洞,有不對的,歡迎指出(如果你會看的話)。 首先都是二話不說,先找依賴(Gradle): // spring系列 // 這個jar...
摘要:分發(fā)處理器將會掃描使用了該注解的類的方法,并檢測該方法是否使用了注解。的作用相當(dāng)于,只不過按照自動注入。作用該注解用于將的方法返回的對象,通過適當(dāng)?shù)霓D(zhuǎn)換為指定格式后,寫入到對象的數(shù)據(jù)區(qū)。用于注解層,在類上面注解。 原文地址 Controller 在SpringMVC中,控制器Controller負(fù)責(zé)處理由DispatcherServlet分發(fā)的請求,它把用戶請求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理...
摘要:當(dāng)容器啟動或終止應(yīng)用時,會觸發(fā)事件,該事件由來處理。監(jiān)聽器的作用就是啟動容器時,自動裝配的配置信息。初始化在架構(gòu)中,負(fù)責(zé)請求分發(fā),起到控制器的作用。 ??公司項目使用 struts2 作為控制層框架,為了實現(xiàn)前后端分離,計劃將 struts2 切換為 SpringMVC ,因此,這段時間都在學(xué)習(xí)新的框架,《Spring實戰(zhàn)》是一本好書,里面對 Spring 的原理實現(xiàn)以及應(yīng)用都說得很透...
摘要:先用一個圖來表示基本流程圖這個網(wǎng)上很容易找到基本流程圖用戶發(fā)送請求到前端控制器前端控制器是的重要部分,位于中心,提供整個框架訪問點,起到交換的作用,而且與容器集成。在配置這個監(jiān)聽器,啟動容器時,就會默認(rèn)執(zhí)行它實現(xiàn)的方法。 先用一個圖來表示基本流程圖這個網(wǎng)上很容易找到 基本流程圖 showImg(https://segmentfault.com/img/bVbfDiV?w=1340&h...
閱讀 3575·2021-10-13 09:39
閱讀 1528·2021-10-08 10:05
閱讀 2352·2021-09-26 09:56
閱讀 2370·2021-09-03 10:28
閱讀 2757·2019-08-29 18:37
閱讀 2089·2019-08-29 17:07
閱讀 657·2019-08-29 16:23
閱讀 2264·2019-08-29 11:24