spring IoC的xml和注解配置 @Autowired加深掌握

spring的IoC框架有啥用漏峰?使用那框架一大好處就是解耦膜蠢,不直接new一個對象堪藐。網(wǎng)上的教材很多,但感覺都只教很淺的部分挑围,很多人看那些教材文章礁竞,基本處于一種似懂非懂狀態(tài),對于自動注入注解@Autowired杉辙,感到迷惑模捂。看完我寫的這篇文章蜘矢,你就明白了狂男。用Spring Framework,主要使用xml文件進行配置品腹。如果用springboot岖食,就只能用注解的方式配置。
先把工程構建好舞吭,目錄結構如圖


555.jpg

maven的pom配置如下:

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<spring.version>4.2.2.RELEASE</spring.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.2.5</version>
    </dependency>

    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.8.7</version>
        <scope>test</scope>
    </dependency>   

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.1</version>
            <configuration>
                <source>${java.version}</source>
                <target>${java.version}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
    </plugins>
</build>

下面給出十個例子泡垃,請按順序做完。
先來一個基于xml的配置例子
第一個例子:
Car類:

package uuiih.ddee.cddsp.zhujiexml.shiyi;

public class Car {

private int maxSpeed;
public String brand;
private double price;

public String getBrand() {
    return brand;
}
public void setBrand(String brand) {
    this.brand = brand;
}
public int getMaxSpeed() {
    return maxSpeed;
}
public void setMaxSpeed(int maxSpeed) {
    this.maxSpeed = maxSpeed;
}
public double getPrice() {
    return price;
}
public void setPrice(double price) {
    this.price = price;
}
public String toString() {
    return "Car:{brand:" + brand + ", maxSpeed:" + maxSpeed + ", price:" + price+"}";
}

}

Boss類:

package uuiih.ddee.cddsp.zhujiexml.shiyi;

public class Boss { 

private String name;    
private Car car;

public Car getCar() {
    return car;
}
public void setCar(Car car) {
    this.car = car;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
@Override
public String toString() {
    return "Boss:{name:" + name + ", car:" + car + "}";
}   
}

在resources下的zhujiexml文件夾創(chuàng)建文件shiyi羡鸥,在文件夾shiyi下創(chuàng)建beans.xml文件

<?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:p="http://www.springframework.org/schema/p" 
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
     http://www.springframework.org/schema/context
     http://www.springframework.org/schema/context/spring-context-4.0.xsd">         
<bean id="car" class="uuiih.ddee.cddsp.zhujiexml.shiyi.Car"
  p:brand="紅旗&amp;CA72"
  p:maxSpeed="200"
  p:price="20000.00"/>
<bean id="boss" class="uuiih.ddee.cddsp.zhujiexml.shiyi.Boss"
  p:car-ref="car"/>
</beans>

創(chuàng)建一個主類測試Test:

package uuiih.ddee.cddsp.zhujiexml.shiyi;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
public static void main(String[] args) {        
    ApplicationContext ctx = new ClassPathXmlApplicationContext("zhujiexml/shiyi/beans.xml");
    Car cat = (Car) ctx.getBean("car");
    System.out.println(cat.toString());     
    Boss boss = (Boss) ctx.getBean("boss");
    System.out.println(boss.toString());
}
}

測試結果如下圖


22222.jpg

下面第二個例子是基于注解的例子蔑穴,是與@Configuration注解有關。網(wǎng)上的教材很常見這種例子:
創(chuàng)建AppConf類

package uuiih.ddee.cddsp.zhujiexml.shiyi;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConf {

@Bean
public Car car() {
    Car car = new Car();
    car.setBrand("紅旗&CA72");
    car.setPrice(20000.0);
    car.setMaxSpeed(200);
    return car;
}

@Bean
public Boss boss() {
    Boss boss = new Boss();
    boss.setCar(car());
    return boss;
}    

}
測試主類類Test部分代碼如下改造

public static void main(String[] args) {
    
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConf.class);
    Car cat = (Car) ctx.getBean("car");
    System.out.println(cat.toString());     
    Boss boss = (Boss) ctx.getBean("boss");
    System.out.println(boss.toString());

}

測試結果仍與第一個例子相同惧浴。

第三個例子在網(wǎng)上的文章中存在普遍:
刪除AppConf類澎剥。
在Car類中加上個注解。

@Repository
public class Car {

在Boss類中加上兩個注解,這里加入了@Autowired注解哑姚。

@Repository
public class Boss { 

private String name;

@Autowired
private Car car;

把beans.xml中內容

<bean id="car" class="uuiih.ddee.cddsp.zhujiexml.shiyi.Car"
  p:brand="紅旗&amp;CA72"
  p:maxSpeed="200"
  p:price="20000.00"/>
<bean id="boss" class="uuiih.ddee.cddsp.zhujiexml.shiyi.Boss"
  p:car-ref="car"/>

用下面的替換掉

<context:component-scan base-package="uuiih.ddee.cddsp.zhujiexml.shiyi"/>

測試主類類Test部分代碼如下改造

public static void main(String[] args) {
    
    ApplicationContext ctx = new ClassPathXmlApplicationContext("zhujiexml/shiyi/beans.xml");
    Car cat = (Car) ctx.getBean("car");
    System.out.println(cat.toString());     
    Boss boss = (Boss) ctx.getBean("boss");
    System.out.println(boss.toString());

}

測試結果如圖


66.jpg

能得出結果祭饭,沒報異常,Bean是存在的叙量。與第一個例子比較就會發(fā)現(xiàn)有不同倡蝙,Car和Boss里面的數(shù)據(jù)是空的。那要如何讓基于注解配置方式出現(xiàn)第一個例子中的數(shù)據(jù)呢绞佩?這個問題先放一下寺鸥。

看第四個例子:
把beans.xml中內容

<context:component-scan base-package="uuiih.ddee.cddsp.zhujiexml.shiyi"/>

用下面的替換掉

<bean id="car" class="uuiih.ddee.cddsp.zhujiexml.shiyi.Car"
  p:brand="紅旗&amp;CA72"
  p:maxSpeed="200"
  p:price="20000.00" />
<bean id="boss" class="uuiih.ddee.cddsp.zhujiexml.shiyi.Boss" />

和第一個例子的beans.xml相比,少了p:car-ref="car"品山。
Car類和Boss類中的注解@Repository刪掉胆建,Boss類的注解@Autowired保留不變。進行測試肘交,測試結果為


777.jpg

測試結果顯示笆载,Car類Bean存在,數(shù)據(jù)也存在涯呻。Boss類的Bean存在凉驻,但數(shù)據(jù)是空的。表明了@Autowired注解不起作用复罐。
怎么樣才能讓@Autowired注解起作用涝登?

還有 30% 的精彩內容
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
禁止轉載,如需轉載請通過簡信或評論聯(lián)系作者效诅。
支付 ¥2.00 繼續(xù)閱讀
  • 序言:七十年代末胀滚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子乱投,更是在濱河造成了極大的恐慌咽笼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篡腌,死亡現(xiàn)場離奇詭異褐荷,居然都是意外死亡,警方通過查閱死者的電腦和手機嘹悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門叛甫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人杨伙,你說我怎么就攤上這事其监。” “怎么了限匣?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵抖苦,是天一觀的道長。 經(jīng)常有香客問我,道長锌历,這世上最難降的妖魔是什么贮庞? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮究西,結果婚禮上窗慎,老公的妹妹穿的比我還像新娘。我一直安慰自己卤材,他們只是感情好遮斥,可當我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扇丛,像睡著了一般术吗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上帆精,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天较屿,我揣著相機與錄音,去河邊找鬼实幕。 笑死吝镣,一個胖子當著我的面吹牛堤器,可吹牛的內容都是我干的昆庇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闸溃,長吁一口氣:“原來是場噩夢啊……” “哼整吆!你這毒婦竟也來了?” 一聲冷哼從身側響起辉川,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤表蝙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后乓旗,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體府蛇,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年屿愚,在試婚紗的時候發(fā)現(xiàn)自己被綠了汇跨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆距,死狀恐怖穷遂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情娱据,我是刑警寧澤蚪黑,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響忌穿,放射性物質發(fā)生泄漏抒寂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一掠剑、第九天 我趴在偏房一處隱蔽的房頂上張望蓬推。 院中可真熱鬧,春花似錦澡腾、人聲如沸沸伏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毅糟。三九已至,卻和暖如春澜公,著一層夾襖步出監(jiān)牢的瞬間姆另,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工坟乾, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迹辐,地道東北人。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓甚侣,卻偏偏與公主長得像明吩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子殷费,可洞房花燭夜當晚...
    茶點故事閱讀 44,974評論 2 355