成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

SpringMVC:Spring 自動(dòng)裝配實(shí)現(xiàn)的基本原理

Neilyo / 1057人閱讀

摘要:對(duì)自動(dòng)裝配的支持對(duì)自動(dòng)裝配的支持之前還沒(méi)有注解功能,在版本才正式加入了對(duì)注解機(jī)制的支持。注解相當(dāng)于一種標(biāo)記,允許程序在運(yùn)行時(shí)動(dòng)態(tài)地對(duì)擁有該標(biāo)記的成員進(jìn)行操作。

??在編寫(xiě) SpringMVC Demo 的過(guò)程中,對(duì)自動(dòng)裝配有一種莫名的興奮感,只要容器中有相對(duì)應(yīng)的 Bean ,通過(guò) @Autowire 注解,自動(dòng)會(huì)將對(duì)應(yīng)的 Bean 注入到相關(guān)的屬性中,著的確是一個(gè)很強(qiáng)大的機(jī)制,但是在使用的過(guò)程中,也遇到了許多問(wèn)題,其中有一個(gè)是,如果這個(gè)屬性的類型有多個(gè)實(shí)現(xiàn) Bean,那應(yīng)該注入哪一個(gè)Bean呢,翻了很多資料也沒(méi)有,只能夠自己看源碼,找答案。

Java 對(duì)自動(dòng)裝配的支持

Java 對(duì)自動(dòng)裝配的支持

??JDK1.5之前還沒(méi)有注解功能,在1.5版本才正式加入了對(duì)注解機(jī)制的支持。
??注解相當(dāng)于一種標(biāo)記,允許程序在運(yùn)行時(shí)動(dòng)態(tài)地對(duì)擁有該標(biāo)記的成員進(jìn)行操作。
??百度百科里對(duì)注解功能的解釋是:

編寫(xiě)文檔:通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)生成文檔【生成文檔doc文檔】

代碼分析:通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)對(duì)代碼進(jìn)行分析【使用反射】

編譯檢查:通過(guò)代碼里標(biāo)識(shí)的元數(shù)據(jù)讓編譯器能夠?qū)崿F(xiàn)基本的編譯檢查【Override】

??因此 Spring基于 JDK1.5,實(shí)現(xiàn)了注解功能。

那么現(xiàn)在我們通過(guò)自行編碼,簡(jiǎn)單實(shí)現(xiàn) Spring 自動(dòng)裝配的功能:

自定義注解:

/**
 * 自定義注解,用來(lái)配置方法
 */
@Retention(RetentionPolicy.RUNTIME) // 表示注解在運(yùn)行時(shí)依然存在
@Target(ElementType.METHOD) // 表示注解可以被使用于方法上
public @interface SayHiAnnotation {
    String paramValue() default "johness"; // 表示我的注解需要一個(gè)參數(shù)名為"paramValue" 默認(rèn)值為"johness"

自動(dòng)裝配:

/**
 * 要使用SayHiAnnotation的元素所在類
 * 由于我們定義了只有方法才能使用我們的注解,我們就使用多個(gè)方法來(lái)進(jìn)行測(cè)試
 */
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);
    }
}

測(cè)試代碼:

public class AnnotionOperator {
    public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
        SayHiEmlement element = new SayHiEmlement(); // 初始化一個(gè)實(shí)例,用于方法調(diào)用
        Method[] methods = SayHiEmlement.class.getDeclaredMethods(); // 獲得所有方法
        
        for (Method method : methods) {
            SayHiAnnotation annotationTmp = null;
            if((annotationTmp = method.getAnnotation(SayHiAnnotation.class))!=null) // 檢測(cè)是否使用了我們的注解
                method.invoke(element,annotationTmp.paramValue()); // 如果使用了我們的注解,我們就把注解里的"paramValue"參數(shù)值作為方法參數(shù)來(lái)調(diào)用方法
            else
                method.invoke(element, "Rose"); // 如果沒(méi)有使用我們的注解,我們就需要使用普通的方式來(lái)調(diào)用方法了
        }
    }

測(cè)試結(jié)果:

SayHiAnnotation()//Hi, Jack
SayHiAnnotationDefault() //Hi, johness
SayHiDefault()//Hi, Rose

可以看出,Spring 則是基于注解和反射 自行自動(dòng)裝配

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67414.html

相關(guān)文章

  • 手撕面試官系列(二):開(kāi)源框架面試題Spring+SpringMVC+MyBatis

    摘要:跳槽時(shí)時(shí)刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個(gè)個(gè)都走了,自己也盲目的開(kāi)始面試起來(lái)期間也沒(méi)有準(zhǔn)備充分,到底是因?yàn)榧夹g(shù)原因影響自己的發(fā)展,偏移自己規(guī)劃的軌跡,還是錢給少了,不受重視。 跳槽時(shí)時(shí)刻刻都在發(fā)生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風(fēng),看到同事一個(gè)個(gè)都走了,自己也盲目的開(kāi)始面試起來(lái)(期間也沒(méi)有準(zhǔn)備充分),到底是因?yàn)榧?..

    Flink_China 評(píng)論0 收藏0
  • SpringMVC 配置和基本使用

    摘要:配置開(kāi)啟注解模式簡(jiǎn)化配置自動(dòng)注冊(cè)默認(rèn)提供了一系列的功能數(shù)據(jù)綁定數(shù)字和日期的轉(zhuǎn)換的讀寫(xiě)支持映射路徑靜態(tài)資源默認(rèn)配置加入對(duì)靜態(tài)資源的處理允許使用做整體配置映射后面的和類基本上都要自動(dòng)包掃描,讓認(rèn)識(shí)然后就可以盡情的使用了。 花了點(diǎn)時(shí)間做的(比較水)筆記,有可能有漏洞,有不對(duì)的,歡迎指出(如果你會(huì)看的話)。 首先都是二話不說(shuō),先找依賴(Gradle): // spring系列 // 這個(gè)jar...

    CarterLi 評(píng)論0 收藏0
  • spring mvc 常用注解標(biāo)簽詳解【轉(zhuǎn)載】

    摘要:分發(fā)處理器將會(huì)掃描使用了該注解的類的方法,并檢測(cè)該方法是否使用了注解。的作用相當(dāng)于,只不過(guò)按照自動(dòng)注入。作用該注解用于將的方法返回的對(duì)象,通過(guò)適當(dāng)?shù)霓D(zhuǎn)換為指定格式后,寫(xiě)入到對(duì)象的數(shù)據(jù)區(qū)。用于注解層,在類上面注解。 原文地址 Controller 在SpringMVC中,控制器Controller負(fù)責(zé)處理由DispatcherServlet分發(fā)的請(qǐng)求,它把用戶請(qǐng)求的數(shù)據(jù)經(jīng)過(guò)業(yè)務(wù)處理層處理...

    Kylin_Mountain 評(píng)論0 收藏0
  • SpringMVCSpringMVC啟動(dòng)初始化過(guò)程

    摘要:當(dāng)容器啟動(dòng)或終止應(yīng)用時(shí),會(huì)觸發(fā)事件,該事件由來(lái)處理。監(jiān)聽(tīng)器的作用就是啟動(dòng)容器時(shí),自動(dòng)裝配的配置信息。初始化在架構(gòu)中,負(fù)責(zé)請(qǐng)求分發(fā),起到控制器的作用。 ??公司項(xiàng)目使用 struts2 作為控制層框架,為了實(shí)現(xiàn)前后端分離,計(jì)劃將 struts2 切換為 SpringMVC ,因此,這段時(shí)間都在學(xué)習(xí)新的框架,《Spring實(shí)戰(zhàn)》是一本好書(shū),里面對(duì) Spring 的原理實(shí)現(xiàn)以及應(yīng)用都說(shuō)得很透...

    Bowman_han 評(píng)論0 收藏0
  • springMVC流程學(xué)習(xí)和理解

    摘要:先用一個(gè)圖來(lái)表示基本流程圖這個(gè)網(wǎng)上很容易找到基本流程圖用戶發(fā)送請(qǐng)求到前端控制器前端控制器是的重要部分,位于中心,提供整個(gè)框架訪問(wèn)點(diǎn),起到交換的作用,而且與容器集成。在配置這個(gè)監(jiān)聽(tīng)器,啟動(dòng)容器時(shí),就會(huì)默認(rèn)執(zhí)行它實(shí)現(xiàn)的方法。 先用一個(gè)圖來(lái)表示基本流程圖這個(gè)網(wǎng)上很容易找到 基本流程圖 showImg(https://segmentfault.com/img/bVbfDiV?w=1340&h...

    didikee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<