spring的IoC框架有啥用?使用那框架一大好处就是解耦,不直接new一个对象。网上的教材很多,但感觉都只教很浅的部分,很多人看那些教材文章,基本处于一种似懂非懂状态,对于自动注入注解@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文件夹创建文件shiyi,在文件夹shiyi下创建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>
创建一个主类测试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注解有关。网上的教材很常见这种例子:
创建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());
}
测试结果仍与第一个例子相同。
第三个例子在网上的文章中存在普遍:
删除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是存在的。与第一个例子比较就会发现有不同,Car和Boss里面的数据是空的。那要如何让基于注解配置方式出现第一个例子中的数据呢?这个问题先放一下。
看第四个例子:
把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存在,数据也存在。Boss类的Bean存在,但数据是空的。表明了@Autowired注解不起作用。
怎么样才能让@Autowired注解起作用?
网友评论