前言

我们来学习加载IOC容器的几种方式,先从BeanFactory说起。

BeanFactory与ApplicationContext的区别与联系

BeanFactory是Spring框架中IoC容器的顶层接⼝,它只是⽤来定义⼀些基础功能,定义⼀些基础规范,⽽

ApplicationContext是它的⼀个⼦接⼝,所以ApplicationContext是具备BeanFactory提供的全部功能的

通常,我们称BeanFactory为SpringIOC的基础容器ApplicationContext是容器的⾼级接⼝,⽐BeanFactory要拥有更多的功能,⽐如说国际化⽀持和资源访问(xml, java配置类)等等。

启动 IoC 容器的⽅式

JavaSE环境

JavaSE环境下启动IOC容器有三种方式:

①.ClassPathXmlApplicationContext:从类的根路径下加载配置⽂件(推荐使⽤)

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("beans.xml")

②.FileSystemXmlApplicationContext:从磁盘路径上加载配置⽂件

ApplicationContext applicationContext=new FileSystemXmlApplicationContext("c:/beans.xml")

③.AnnotationConfigApplicationContext:纯注解模式下启动Spring容器

ApplicationContext applicationContext=new AnnotationConfigApplicationContext(SpringConfig.class)

JavaWeb环境

ContextLoaderListener(监听器去加载xml或者配置类)

举例——xml文件启动bean容器

我们以xml来启动bean容器来举例说明加载IOC容器的方式。

此处我们只列出核心代码,详细代码见文末源码。

pom.xml中添加jar包:

1
2
3
4
5
6
<!--引入Spring IoC容器功能-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>

beans.xml,我们改名为applicationContext.xml,加上spring的一些引用头:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 <?xml version="1.0" encoding="UTF-8"?>
<!--跟标签beans,里面配置一个又一个的bean子标签,每一个bean子标签都代表一个类的配置-->
<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

https://www.springframework.org/schema/beans/spring-beans.xsd">




<!--id标识对象,class是类的全限定类名-->
<bean id="accountDao" class="com.lagou.edu.dao.impl.JdbcTemplateDaoImpl">
<property name="ConnectionUtils" ref="connectionUtils"/>
</bean>
<bean id="transferService" class="com.lagou.edu.service.impl.TransferServiceImpl">
<!--set+ name 之后锁定到传值的set方法了,通过反射技术可以调用该方法传入对应的值-->
<property name="AccountDao" ref="accountDao"></property>
</bean>


<!--配置新增的三个Bean-->
<bean id="connectionUtils" class="com.lagou.edu.utils.ConnectionUtils"></bean>

<!--事务管理器-->
<bean id="transactionManager" class="com.lagou.edu.utils.TransactionManager">
<property name="ConnectionUtils" ref="connectionUtils"/>
</bean>

<!--代理对象工厂-->
<bean id="proxyFactory" class="com.lagou.edu.factory.ProxyFactory">
<property name="TransactionManager" ref="transactionManager"/>
</bean>
</beans>

JavaSE下的容器启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class IoCTest {


@Test
public void testIoC() throws Exception {

// 通过读取classpath下的xml文件来启动容器(xml模式SE应用下推荐)
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");

// 不推荐使用
//ApplicationContext applicationContext1 = new FileSystemXmlApplicationContext("文件系统的绝对路径");


// 第一次getBean该对象

AccountDao accountDao = (AccountDao) applicationContext.getBean("accountDao");

accountDao.queryAccountByCardNo("1111111");
System.out.println("accountDao:" + accountDao);
}

Web环境下的容器启动 :

pom.xml中需要引入:

1
2
3
4
5
6
<!--引入spring web功能-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.12.RELEASE</version>
</dependency>

webapp/WEB-INF目录下的web.xml文件中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 <!DOCTYPE web-app PUBLIC

"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"

"http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>

<display-name>Archetype Created Web Application</display-name>

<!--配置Spring ioc容器的配置⽂件-->

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:applicationContext.xml</param-value>

</context-param>

<!--使⽤监听器启动Spring的IOC容器-->

<listener>

<listenerclass>org.springframework.web.context.ContextLoaderListener</listenerclass>

</listener>

</web-app>

web应用中加载bean:

核心代码:

1
2
3
4
5
6
7
import 
org.springframework.web.context.WebApplicationContext;
import
org.springframework.web.context.support.WebApplicationContextUtils;

WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
transferService = (TransferService) webApplicationContext.getBean("transferService");

源码

spring-ioc测试demo

总结

我们首先介绍了BeanFactory与ApplicationContext的区别与联系,其次介绍了xml及注解方式启动IOC容器的方式,最后通过代码示例来讲解了不同环境下的加载bean容器方式的区别。