spring的IoC框架有啥用漏峰?使用那框架一大好處就是解耦膜蠢,不直接new一個對象堪藐。網(wǎng)上的教材很多,但感覺都只教很淺的部分挑围,很多人看那些教材文章礁竞,基本處于一種似懂非懂狀態(tài),對于自動注入注解@Autowired杉辙,感到迷惑模捂。看完我寫的這篇文章蜘矢,你就明白了狂男。用Spring Framework,主要使用xml文件進行配置品腹。如果用springboot岖食,就只能用注解的方式配置。
先把工程構建好舞吭,目錄結構如圖
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="紅旗&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());
}
}
測試結果如下圖
下面第二個例子是基于注解的例子蔑穴,是與@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="紅旗&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());
}
測試結果如圖
能得出結果祭饭,沒報異常,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="紅旗&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保留不變。進行測試肘交,測試結果為
測試結果顯示笆载,Car類Bean存在,數(shù)據(jù)也存在涯呻。Boss類的Bean存在凉驻,但數(shù)據(jù)是空的。表明了@Autowired注解不起作用复罐。
怎么樣才能讓@Autowired注解起作用涝登?