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

spring的IoC框架有啥用?使用那框架一大好處就是解耦,不直接new一個(gè)對(duì)象。網(wǎng)上的教材很多,但感覺都只教很淺的部分,很多人看那些教材文章,基本處于一種似懂非懂狀態(tài),對(duì)于自動(dòng)注入注解@Autowired,感到迷惑??赐晡覍懙倪@篇文章,你就明白了。用Spring Framework,主要使用xml文件進(jìn)行配置。如果用springboot,就只能用注解的方式配置。
先把工程構(gòu)建好,目錄結(jié)構(gòu)如圖


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>

下面給出十個(gè)例子,請(qǐng)按順序做完。
先來一個(gè)基于xml的配置例子
第一個(gè)例子:
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)建一個(gè)主類測(cè)試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());
}
}

測(cè)試結(jié)果如下圖


22222.jpg

下面第二個(gè)例子是基于注解的例子,是與@Configuration注解有關(guān)。網(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;
}    

}
測(cè)試主類類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());

}

測(cè)試結(jié)果仍與第一個(gè)例子相同。

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

@Repository
public class Car {

在Boss類中加上兩個(gè)注解,這里加入了@Autowired注解。

@Repository
public class Boss { 

private String name;

@Autowired
private Car car;

把beans.xml中內(nèi)容

<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"/>

測(cè)試主類類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());

}

測(cè)試結(jié)果如圖


66.jpg

能得出結(jié)果,沒報(bào)異常,Bean是存在的。與第一個(gè)例子比較就會(huì)發(fā)現(xiàn)有不同,Car和Boss里面的數(shù)據(jù)是空的。那要如何讓基于注解配置方式出現(xiàn)第一個(gè)例子中的數(shù)據(jù)呢?這個(gè)問題先放一下。

看第四個(gè)例子:
把beans.xml中內(nèi)容

<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" />

和第一個(gè)例子的beans.xml相比,少了p:car-ref="car"。
Car類和Boss類中的注解@Repository刪掉,Boss類的注解@Autowired保留不變。進(jìn)行測(cè)試,測(cè)試結(jié)果為


777.jpg

測(cè)試結(jié)果顯示,Car類Bean存在,數(shù)據(jù)也存在。Boss類的Bean存在,但數(shù)據(jù)是空的。表明了@Autowired注解不起作用。
怎么樣才能讓@Autowired注解起作用?

還有 30% 的精彩內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
支付 ¥2.00 繼續(xù)閱讀

友情鏈接更多精彩內(nèi)容