欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring詳細(xì)講解@Autowired注解

 更新時(shí)間:2022年06月17日 10:26:06   作者:寫B(tài)ug的小廉  
@Autowired注解可以用在類屬性,構(gòu)造函數(shù),setter方法和函數(shù)參數(shù)上,該注解可以準(zhǔn)確地控制bean在何處如何自動(dòng)裝配的過(guò)程。在默認(rèn)情況下,該注解是類型驅(qū)動(dòng)的注入

java注解

在解釋spring的注解之前,先了解一下什么是java的注解?:Java 注解(Annotation)又稱 Java 標(biāo)注,是 JDK5.0 引入的一種注釋機(jī)制。

Java中類、變量、參數(shù)、 包等都可以添加注解,java的注解可以通過(guò)反射來(lái)獲取到標(biāo)注的內(nèi)容,在編譯器生成字節(jié)碼文件時(shí),標(biāo)注信息也添加進(jìn)去。當(dāng)運(yùn)行時(shí),JVM可以根據(jù)標(biāo)注信息獲取相應(yīng)的信息。

先給大家介紹一下java中常見(jiàn)的7種注解,這種注解也是spring中的注解的基礎(chǔ)!前三個(gè)注解是用于代碼上的注解,剩下的四個(gè)是用于修飾注解!

  • @Override - 檢查該方法是否是重寫方法。如果發(fā)現(xiàn)其父類,或者是引用的接口中并沒(méi)有該方法時(shí),會(huì)報(bào)編譯錯(cuò)誤。
  • @Deprecated - 標(biāo)記過(guò)時(shí)方法。如果使用該方法,會(huì)報(bào)編譯警告。
  • @SuppressWarnings - 指示編譯器去忽略注解中聲明的警告。
  • @Retention - 標(biāo)識(shí)這個(gè)注解怎么保存,是只在代碼中,還是編入class文件中,或者是在運(yùn)行時(shí)可以通過(guò)反射訪問(wèn)。
  • @Documented - 標(biāo)記這些注解是否包含在用戶文檔javadoc中。
  • @Target - 標(biāo)記這個(gè)注解應(yīng)該是哪種 Java 成員。
  • @Inherited - 標(biāo)記這個(gè)注解是繼承于哪個(gè)注解類(默認(rèn) 注解并沒(méi)有繼承于任何子類)

spring注解

然后我們來(lái)說(shuō)一下spring中注解的作用。

spring的重要特征就是控制反轉(zhuǎn)和依賴注入。在spring中,將部分需要?jiǎng)?chuàng)建和生成的類的控制權(quán)限交給了spring容器進(jìn)行管理,這就是控制反轉(zhuǎn)。依賴注入就是將屬性和類信息注入給相應(yīng)的類。而這和我們要使用的注解有什么關(guān)系呢?

(1)配置文件形式

我們知道在出現(xiàn)注解之前,spring實(shí)現(xiàn)bean的管理是通過(guò)配置文件來(lái)實(shí)現(xiàn)的,所以我們先設(shè)計(jì)一個(gè)簡(jiǎn)答的bean來(lái)實(shí)現(xiàn)一下,如下:結(jié)構(gòu)圖在下面,為了方便我把代碼放到了一起,實(shí)現(xiàn)請(qǐng)對(duì)比結(jié)構(gòu)圖!

package com.example.school;
import com.example.studuent.*;
public class chuzhong {
    private lisi Lisi;
    private zhangsan ZhangSan;
    public void setLisi(com.example.studuent.lisi Lisi) {
        this.Lisi = Lisi;
    }
    public void setZhangsan(com.example.studuent.zhangsan ZhangSan) {
        this.ZhangSan = ZhangSan;
    }
    public com.example.studuent.lisi getLisi() {
        return Lisi;
    }
    public com.example.studuent.zhangsan getZhangsan() {
        return ZhangSan;
    }
    public String toString()
    {
        return Lisi.name;
    }
}
package com.example.studuent;
public class lisi {
    public String name = "李四";
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public String studentname(){
        return name;
    }
}
package com.example.studuent;
public class zhangsan {
    public String name = "張三";
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public String studentname(){
        return "這個(gè)學(xué)生是:" + name;
    }
}
import com.example.school.*;
import com.example.studuent.lisi;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class annotationExample {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        chuzhong cz = (chuzhong) context.getBean("chuzhong");
        String name = cz.getLisi().studentname();
        System.out.println(name);
    }
}

配置文件如下:

<?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"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
        <bean id="chuzhong" class="com.example.school.chuzhong" >
            <property name="lisi" ref="lisi" />
            <property name="zhangsan" ref="zhangsan" />
        </bean>
        <bean id="lisi" class="com.example.studuent.lisi" />
        <bean id="zhangsan" class="com.example.studuent.zhangsan" />
</beans>

運(yùn)行結(jié)果:

可以看到,加載了相應(yīng)的配置文件,然后spring容器依次創(chuàng)建了相應(yīng)的實(shí)例對(duì)象。并成功輸出的lisi實(shí)例對(duì)象的姓名。

這就是未使用注解時(shí)候,bean的使用方法。

(2)注解形式

加入了注解之后,我們會(huì)省下配置很多不必要信息的時(shí)間。最常用的自動(dòng)裝配的注解@Autowired,用于放置在類上用來(lái)修飾。

可以了解一下@Autowired的源碼中的注解信息,咱們簡(jiǎn)單看一個(gè)重要的信息

這個(gè)說(shuō),構(gòu)造函數(shù)、字段、setter方法或config方法標(biāo)記為由Spring的依賴項(xiàng)注入工具自動(dòng)連接。

而@Autowired這個(gè)注解對(duì)應(yīng)的,就是我們?cè)赾huzhong類中,寫的set和get方法,以及配置文件中的property標(biāo)簽的內(nèi)容,它可以幫我們自動(dòng)關(guān)聯(lián)bean對(duì)象,實(shí)現(xiàn)自動(dòng)裝配功能。

所以我們使用@Autowired注解之后的類文件和配置文件就變成了如下圖,關(guān)聯(lián)的zhangsan和lisi類對(duì)象的set和get方法省略,并且配置文件中property中內(nèi)容省略,但是需要加上component-scan組件掃描配置,因?yàn)楫?dāng)出現(xiàn)@Autowired注解之后,會(huì)從base-package下查找相應(yīng)的關(guān)聯(lián)bean對(duì)象:

@Autowired的解析

我們來(lái)分析一下@Autowired中都是什么東西:

1,首先注解是使用@interface修飾的,意味著它實(shí)現(xiàn)了 java.lang.annotation.Annotation 接口,使用@interface修飾才可以生成注解的形式

2,綠色字體的意思,注解依賴是否是必須的,也就是你使用了@Autowired這個(gè)注解,那么可以手動(dòng)配置required,是否使用,默認(rèn)是寫了該注解就是使用

3,我們?cè)谖恼碌谝欢握f(shuō)明了,有四個(gè)注解是用來(lái)修飾注解的。我用一段來(lái)解釋一下其中字段的意思。

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE}) 表示這個(gè)注解是用來(lái)修改哪種成員的,如果沒(méi)有寫這個(gè)@Target則表示,它可以用在任何地方。然后我們了解一下ElementType這個(gè)枚舉類中中各個(gè)字段的意思。從下面我們可以看出,它可以修飾構(gòu)造器、方法、參數(shù)、成員變量以及注解。所以多個(gè)ElementType對(duì)應(yīng)一個(gè)注解。

TYPE:                 能修飾類、接口或枚舉類型
FIELD:                能修飾成員變量
METHOD:               能修飾方法
PARAMETER:            能修飾參數(shù)
CONSTRUCTOR:          能修飾構(gòu)造器
LOCAL_VARIABLE:       能修飾局部變量
ANNOTATION_TYPE:      能修飾注解
PACKAGE:              能修飾包
TYPE_PARAMETER:       能修飾類型參數(shù)
TYPE_USE:             所有類型都可以修飾(不包括類)

@Retention(RetentionPolicy.RUNTIME)用于指定該注解的生命周期,存活到什么時(shí)候,RUNTIME表明存活到運(yùn)行時(shí),可以反射獲取相應(yīng)的信息。

SOURCE:該注解存在于源碼中,當(dāng)編譯成字節(jié)碼時(shí),就消失了。
CLASS: 該注解在java文件生成字節(jié)碼文件后,存在于字節(jié)中,但是在jvm運(yùn)行中就沒(méi)了。@Retention的默認(rèn)值,即當(dāng)沒(méi)有顯式指定@Retention的時(shí)候,就會(huì)是這種類型。
RUNTIME: 該標(biāo)注信息存在字節(jié)碼中,jvm運(yùn)行該字節(jié)碼時(shí),可以通過(guò)標(biāo)注獲取相應(yīng)的信息

@Documented文中第一段有說(shuō)明。

@Autowired的生效流程

而@Autowired是如何生效的呢?我引用一下別人的文章:SpringBoot中@Autowired是如何生效的,希望大家也可以看一看,我摘重點(diǎn)說(shuō)一下。下圖就是spring啟動(dòng)之后的流程。

首先是AutowiredPorcessor的BeanDefinition的注冊(cè)

1, 創(chuàng)建ApplicationContext

2, 創(chuàng)建AnnotatedBeanDefinitionReader

3, 注冊(cè)BeanDefinition registerAnnotationConfigProcessors

然后是AutowiredProcessor注冊(cè)為bean

1,registerBeanPostProcessors

最后是注入

1,獲取bean getBean()

2,創(chuàng)建bean doCreateBean()

?3,生成bean populateBean()

4,應(yīng)用AutowiredProcessor ibp.postProcessProperties()

5,找到可注入的字段 buildAutowiringMetadata

6,注入 metadata.inject

spring的其余注解也可以參考這種形式,逐一進(jìn)行分析,個(gè)人的注解放到(二)中實(shí)現(xiàn)。

到此這篇關(guān)于spring詳細(xì)講解@Autowired注解的解析的文章就介紹到這了,更多相關(guān)spring @Autowired內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring如何使用@Indexed加快啟動(dòng)速度

    Spring如何使用@Indexed加快啟動(dòng)速度

    這篇文章主要介紹了Spring如何使用@Indexed加快啟動(dòng)速度,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • mybatis interceptor 處理查詢參數(shù)及查詢結(jié)果的實(shí)例代碼

    mybatis interceptor 處理查詢參數(shù)及查詢結(jié)果的實(shí)例代碼

    這篇文章主要介紹了mybatis interceptor 處理查詢參數(shù)及查詢結(jié)果,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-01-01
  • 詳解JAVA Stream流

    詳解JAVA Stream流

    這篇文章主要介紹了JAVA Stream流的相關(guān)資料,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 運(yùn)行時(shí)常量池和字符串常量池的區(qū)別及說(shuō)明

    運(yùn)行時(shí)常量池和字符串常量池的區(qū)別及說(shuō)明

    這篇文章主要介紹了運(yùn)行時(shí)常量池和字符串常量池的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Spring Boot實(shí)現(xiàn)發(fā)送郵件

    Spring Boot實(shí)現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了Spring Boot實(shí)現(xiàn)發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 利用Spring Boot操作MongoDB的方法教程

    利用Spring Boot操作MongoDB的方法教程

    mongodb是最早熱門非關(guān)系數(shù)據(jù)庫(kù)的之一,使用也比較普遍,一般會(huì)用做離線數(shù)據(jù)分析來(lái)使用,放到內(nèi)網(wǎng)的居多,下面這篇文章主要給大家介紹了利用Spring Boot操作MongoDB的方法教程,需要的朋友可以參考下
    2017-05-05
  • Java中的ArrayList集合源碼解析

    Java中的ArrayList集合源碼解析

    這篇文章主要介紹了Java中的ArrayList集合源碼解析,ArrayList是一種以數(shù)組實(shí)現(xiàn)的List,與數(shù)組相比,它具有動(dòng)態(tài)擴(kuò)展的能力,因此也可稱之為動(dòng)態(tài)數(shù)組,需要的朋友可以參考下
    2023-12-12
  • Java?中泛型?T?和???的區(qū)別詳解

    Java?中泛型?T?和???的區(qū)別詳解

    本文主要介紹了Java?中泛型?T?和???的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java案例分享-集合嵌套

    Java案例分享-集合嵌套

    這篇文章主要介紹了Java案例分享-集合嵌套,通過(guò)案例創(chuàng)建一個(gè)ArrayList集合,存儲(chǔ)三個(gè)元素,每一個(gè)元素都是HashMap,每一個(gè)HashMap的鍵和值都是String,并遍歷,實(shí)際操作內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析

    SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析

    這篇文章主要介紹了SpringBoot+Idea熱部署實(shí)現(xiàn)流程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11

最新評(píng)論