文章目录
Spring IoC 容器
Spring 提供了以下两种不同类型的容器。
- Spring BeanFactory 容器
- Spring ApplicationContext 容器
Spring 的 BeanFactory 容器
这是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持.
在 Spring 中,有大量对 BeanFactory 接口的实现。其中,最常被使用的是 XmlBeanFactory 类。这个容器从一个 XML 文件中读取配置元数据,由这些元数据来生成一个被配置化的系统或者应用。
在资源宝贵的移动设备或者基于 applet 的应用当中, BeanFactory 会被优先选择。否则,一般使用的是 ApplicationContext,除非你有更好的理由选择 BeanFactory。
BeanFactory :这是一个工厂,用于生成任意bean。采取延迟加载,第一次getBean时才会初始化Bean
BeanFactory的代码演示
- pom文件依赖
<?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>com.cc.study</groupId>
<artifactId>spring-study</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 4个核心(beans、core、context、expression) -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>3.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.7</source><!-- spring 3.0需要JDK1.7-->
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
- BookService
package com.cc.study.di;
public interface BookService {
public abstract void addBook();
}
- BookServiceImpl
package com.cc.study.di;
public class BookServiceImpl implements BookService {
// 方式1:之前,接口=实现类
// private BookDao bookDao = new BookDaoImpl();
// 方式2:接口 + setter
private BookDao bookDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void addBook(){
this.bookDao.addBook();
}
public BookServiceImpl(){
System.out.println("被实例化了");
}
}
- 配置文件
<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
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
模拟spring执行过程
创建service实例:BookService bookService = new BookServiceImpl() IoC <bean>
创建dao实例:BookDao bookDao = new BookDaoImpl() IoC
将dao设置给service:bookService.setBookDao(bookDao); DI <property>
<property> 用于进行属性注入
name: bean的属性名,通过setter方法获得
setBookDao ##> BookDao ##> bookDao
ref :另一个bean的id值的引用
-->
<!-- 创建service -->
<bean id="bookServiceId" class="com.cc.study.di.BookServiceImpl">
<property name="bookDao" ref="bookDaoId"></property>
</bean>
<!-- 创建dao实例 -->
<bean id="bookDaoId" class="com.cc.study.di.BookDaoImpl"></bean>
</beans>
- 配置文件位置:
- 测试
第一步利用框架提供的 XmlBeanFactory() API 去生成工厂 bean 以及利用 ClassPathResource() API 去加载在路径 CLASSPATH 下可用的 bean 配置文件。XmlBeanFactory() API 负责创建并初始化所有的对象,即在配置文件中提到的 bean。
第二步利用第一步生成的 bean 工厂对象的 getBean() 方法得到所需要的 bean。 这个方法通过配置文件中的 bean ID 来返回一个真正的对象,该对象最后可以用于实际的对象。一旦得到这个对象,你就可以利用这个对象来调用任何方法。
//BeanFactory :这是一个工厂,用于生成任意bean。采取延迟加载,第一次getBean时才会初始化Bean
@Test
public void demo(){
//延迟加载
//使用BeanFactory --第一次调用getBean实例化
String xmlPath = "di.xml";
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource(xmlPath));
System.out.println("配置文件被加载来");
BookService bookService = (BookService) beanFactory.getBean("bookServiceId");
bookService.addBook();
}
可以看出采取了延迟加载,第一次getBean时才会初始化Bean。
Spring ApplicationContext 容器
ApplicationContext:是BeanFactory的子接口,功能更强大。(国际化处理、事件传递、Bean自动装配、各种不同应用层的Context实现)。当配置文件被加载,就进行对象实例化。
- ClassPathXmlApplicationContext 用于加载classpath(类路径、src)下的xml
- 加载xml运行时位置 --> /WEB-INF/classes/…xml
- FileSystemXmlApplicationContext 用于加载指定盘符下的xml
- 加载xml运行时位置 --> /WEB-INF/…xml
通过java web ServletContext.getRealPath() 获得具体盘符
- 加载xml运行时位置 --> /WEB-INF/…xml
ApplicationContext 的代码演示
@Test
public void demo(){
//从spring容器获得
String xmlPath = "di.xml";
// ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\Users\\c\\Desktop\\Spring-Learning\\spring-study\\src\\main\\resources\\di.xml");
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
//BookService bookService = (BookService) applicationContext.getBean("bookServiceId");
//通过这种方式不需要进行强制转换
System.out.println("配置文件加载");
BookService bookService = applicationContext.getBean("bookServiceId",BookService.class);
bookService.addBook();
}
可以看出ApplicationContext 默认没有采取延迟加载。
当然可以通过设置lazy-init="true"来设置延迟加载
<bean id="bookServiceId" class="com.cc.study.di.BookServiceImpl" lazy-init="true">
<property name="bookDao" ref="bookDaoId"></property>
</bean>