Spring的IOC容器
本文最后更新于 2025年1月20日
基于spring framework 4.x, jdk1.8
1.集成Spring到项目中
IOC容器需要以下spring核心依赖项:spring-core
, spring-beans
, spring-context
, spring-expression
创建maven项目,并引入spring核心依赖以及单元测试junit到pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>example</groupId>
<artifactId>Spring</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>4.3.18.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.新建spring配置文件spring.xml
在main/resources
文件夹下
<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
</beans>
3.新建一个测试类com.example.test.MainTest
在main/java
下
package com.example.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
}
2.基于XML配置Bean
2.1通过反射配置Bean
1.通过全类名反射的方式在ioc容器中创建bean
新建一个JavaBean对象com.example.bean.Bean
在main/java
下,通过全类名反射的方式需要bean实现无参构造器
package com.example.bean;
public class Bean {
private String name;
public Bean() {
System.out.println("bean 无参构造");
}
public Bean(String name) {
System.out.println("bean 有参构造");
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bean{" +
"name='" + name + '\'' +
'}';
}
}
spring.xml
中通过<bean>
配置bean,class
设置为bean的全类名,id
用于引用bean,id
在ioc容器中必须是唯一的
<?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:util="http://www.springframework.org/schema/util"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="bean" class="com.example.bean.Bean">
<property name="name" value="lzj"/>
</bean>
<bean id="bean2" class="com.example.bean.Bean" p:name="lzj"/>
</beans>
Spring提供了两种ioc容器的实现,BeanFactory和ApplicationContext,BeanFactory是ioc容器的基本实现,ApplicationContext是BeanFactory的子接口,提供了更加高级的特性
ApplicationContext的主要实现类有
- ClassPathXmlApplicationContext 从类路径下加载配置文件
- FileSystemXmlApplicationContext 从文件系统加载配置文件
- WebApplicationContext 专门为web应用所准备,从web根目录的路径中完成初始化
ApplicationContext在初始化上下文时就会实例化所有单例的Bean
package com.example.test;
import com.example.bean.Bean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainTest {
@Test
public void testBean() {
// 根据spring.xml配置文件启动spring-ioc容器,ioc容器启动,并且会调用无参构造器
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
//从ioc容器中获取bean实例
Bean bean = (Bean) context.getBean("bean");
System.out.println(bean);
Bean bean2 = (Bean) context.getBean("bean2");
System.out.println(bean2);
}
}
输出
bean 无参构造
Bean{name='lzj'}
bean 无参构造
Bean{name='lzj'}
Spring的IOC容器
https://blog.liuzijian.com/post/spring-ioc.html