spring框架(IOC) 注解

7.4 使用注解實(shí)現(xiàn)自動(dòng)裝配

jdk1.5支持注解,Spring2.5開始支持注解。

要使用注解須知:

  1. 導(dǎo)入約束:context約束本鸣。

  2. 配置注解的支持:<context:annotation-config/> ·

    <?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
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
    
    </beans>
    

@Autowired

直接在屬性上使用即可弓颈!也可以在set方式上使用!

使用Autowired我們可以不用編寫Set方法了绕德,前提是你這個(gè)自動(dòng)裝配的屬性在IoC(Spring)容器中存在,且符合名字byName摊阀!

科普:

@Nullable   字段標(biāo)記了這個(gè)注解耻蛇,說(shuō)明這個(gè)字段可以為null
    public People(@Nullable String name){
    this.name = name;
}
public @interface Autowired {
    boolean required() default true;
}

測(cè)試代碼:

public class People {
    //如果顯式定義了Autowired的required屬性為false踪蹬,說(shuō)明這個(gè)對(duì)象可以為null,否則不允許為空
    @Autowired(required = false)
    private Dog dog;
    @Autowired
    private Cat cat;
    private String name;
}

如果@Autowired自動(dòng)裝配的環(huán)境比較復(fù)雜臣咖,自動(dòng)裝配無(wú)法通過(guò)一個(gè)注解@Autowired完成的時(shí)候跃捣,我們可以使用@Qualifier(value="xxx")去配置@Autowired的使用,指定一個(gè)唯一的bean對(duì)象注入夺蛇!

public class People {
    @Autowired
    @Qualifier(value="dog11")
    private Dog dog;
    @Autowired
    @Qualifier(value="cat11")
    private Cat cat;
    private String name;
}

@Resource注解

public class People {
    @Resource(name = "cat2")
    private Cat cat;
}

小結(jié):

@Resource和@Autowired的區(qū)別:

  • 都是用來(lái)自動(dòng)裝配的疚漆,都可以放在屬性字段上;

  • @Autowired通過(guò)byType的方式實(shí)現(xiàn)刁赦,而且必須要求這個(gè)對(duì)象存在娶聘!【常用】

  • @Resource默認(rèn)通過(guò)byName的方式實(shí)現(xiàn),如果找不到名字甚脉,則通過(guò)byType實(shí)現(xiàn)丸升!如果兩個(gè)都找不到的情況下,就報(bào)錯(cuò)牺氨!

  • 執(zhí)行順序不同:@Autowired通過(guò)byType的方式實(shí)現(xiàn)狡耻,@Resource默認(rèn)通過(guò)byName的方式實(shí)現(xiàn)。

8猴凹、 使用注解開發(fā)

在spring4之后夷狰,要使用注解開發(fā),必須要保證aop的包導(dǎo)入了精堕。

image.png

使用注解需要導(dǎo)入context約束孵淘,增加注解的支持!

<!--指定要掃描的包歹篓,這個(gè)包下的注解會(huì)生效-->
<context:component-scan base-package="com.kuang.pojo"/>
  1. bean

  2. 屬性如何注入

    //等價(jià)于<bean id="user" class="com.kuang.pojo.User"/>
    //@Component 組件
    @Component
    public class User {
        //相當(dāng)于<property name="name" value="小憨批"/>
        public String name;
        @Value("小憨批")
        public void setName(String name){
            this.name = name;
        }
    }
    
  3. 衍生的注解

    @Component有幾個(gè)衍生注解瘫证,我們?cè)趙eb開發(fā)中,會(huì)按照mvc三層架構(gòu)分層庄撮!

    • dao【@Repository】
    • service【@Service】
    • controller【@Controller】

    這四個(gè)注解功能都是一樣的背捌,都是代表將某個(gè)類注冊(cè)到Spring中,裝配Bean洞斯!

  4. 自動(dòng)裝配

    -@Autowired:自動(dòng)裝配通過(guò)類型毡庆,名字
     如果Autowired不能唯一自動(dòng)裝配上屬性,則需要通過(guò)@Qualifier(value="xxx")
    -@Nullable:字段標(biāo)記了這個(gè)注解烙如,說(shuō)明這個(gè)字段可以為null
    -@Resource:自動(dòng)裝配通過(guò)名字么抗,類型
    
  5. 作用域

    @Scope("singleton")
    public class User {
        //相當(dāng)于<property name="name" value="小憨批"/>
        public String name;
        @Value("小憨批")
        public void setName(String name){
            this.name = name;
        }
    }
    
  6. 小結(jié)

    xml與注解:

    • xml更加萬(wàn)能,適用于任何場(chǎng)合亚铁!維護(hù)簡(jiǎn)單方便蝇刀。
    • 注解,不是自己的類使用不了徘溢,維護(hù)相對(duì)復(fù)雜吞琐!

    xml與注解最佳實(shí)踐:

    • xml用來(lái)管理bean捆探;
    • 注解只負(fù)責(zé)完成屬性的注入;
    • 我們?cè)谑褂玫倪^(guò)程中站粟,只需要注意一個(gè)問(wèn)題:必須讓注解生效黍图,就需要開啟注解的支持。
     <!--指定要掃描的包奴烙,這個(gè)包下的注解會(huì)生效-->
    <context:component-scan base-package="com.kuang"/>
    <context:annotation-config/>
    

9助被、 使用java的方式配置Spring

我們現(xiàn)在要完全不適用Spring的xml配置了,全權(quán)交給java來(lái)做切诀!

javaConfig是Spring的一個(gè)子項(xiàng)目恰起,在Spring4之后,它成為了一個(gè)核心功能趾牧。

實(shí)體類:

@Component
public class User {
    private String name;

    public String getName() {
        return name;
    }

    @Value("小笨蛋")
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                '}';
    }
}
import com.kuang.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

//這個(gè)也會(huì)被Spring容器托管,注冊(cè)到容器中肯污,因?yàn)楸緛?lái)就是一個(gè)@Component
//@Configuration代表這是一個(gè)配置類翘单,就和我們之前看的beans.xml
@Configuration
@ComponentScan("com.kuang.pojo")
@Import(KuangConfig2.class )
public class KuangConfig {
    //注冊(cè)一個(gè)bean,就相當(dāng)于我們之前寫的一個(gè)bean標(biāo)簽
    //這個(gè)方法的名字蹦渣,就相當(dāng)于bean標(biāo)簽中的id屬性
    //這個(gè)方法的返回值哄芜,就相當(dāng)于bean標(biāo)簽中的class屬性
    @Bean
    public User getUser(){
        return new User();//就是返回要注入到bean的對(duì)象
    }
}

測(cè)試類:

public class MyTest {
    public static void main(String[] args) {
        //如果完全使用了配置類方式去做,我們就只能通過(guò)AnnotationConfig上下文來(lái)獲取容器柬唯,通過(guò)配置類的class對(duì)象加載认臊!
        ApplicationContext context = new AnnotationConfigApplicationContext(KuangConfig.class);
        User getUser = (User) context.getBean("getUser");
        System.out.println(getUser.getName());
    }
}

這種純java的配置方式,在SpringBoot中隨處可見锄奢!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末失晴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拘央,更是在濱河造成了極大的恐慌涂屁,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灰伟,死亡現(xiàn)場(chǎng)離奇詭異拆又,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)栏账,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門帖族,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人挡爵,你說(shuō)我怎么就攤上這事竖般。” “怎么了了讨?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵捻激,是天一觀的道長(zhǎng)制轰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)胞谭,這世上最難降的妖魔是什么垃杖? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮丈屹,結(jié)果婚禮上调俘,老公的妹妹穿的比我還像新娘。我一直安慰自己旺垒,他們只是感情好彩库,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著先蒋,像睡著了一般骇钦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竞漾,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天眯搭,我揣著相機(jī)與錄音,去河邊找鬼业岁。 笑死鳞仙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笔时。 我是一名探鬼主播棍好,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼允耿!你這毒婦竟也來(lái)了借笙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤右犹,失蹤者是張志新(化名)和其女友劉穎提澎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體念链,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盼忌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掂墓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谦纱。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖君编,靈堂內(nèi)的尸體忽然破棺而出跨嘉,到底是詐尸還是另有隱情,我是刑警寧澤吃嘿,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布祠乃,位于F島的核電站梦重,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏亮瓷。R本人自食惡果不足惜琴拧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘱支。 院中可真熱鬧蚓胸,春花似錦、人聲如沸除师。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)汛聚。三九已至锹安,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間倚舀,已是汗流浹背八毯。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瞄桨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓讶踪,卻偏偏與公主長(zhǎng)得像芯侥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乳讥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容