1、bean的加载
import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; import org.springframework.core.io.Resource; import org.springframework.web.context.support.XmlWebApplicationContext; /** * @加载方式 spring有两种加载配置文件的方式ApplicationContext和BeanFactory * @区别 ApplicationContext在容器启动就会实例化scope为singleton的bean,而BeanFactory不会,在应用使用时才创建 */ public class Model { public static void main(String[] args) { //上下文加载,从类路径加载 ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); //上下文加载,从文件系统加载 //ApplicationContext ac = new FileSystemXmlApplicationContext("D:\software\workspace\IOC\src\main\resources\applicationContext.xml"); //上下文加载,从web系统加载,默认配置文件路径及名称/WEB-INF/applicationContext.xml,web项目启动会自动加载 //ApplicationContext ac = new XmlWebApplicationContext(); //通过工厂获取,已弃用,不再多说 //BeanFactory bf = new XmlBeanFactory((Resource) new ClassPathXmlApplicationContext("beans.xml")); } }
2、bean的注入
分为两种:设值注入、构造注入
3、bean作用域
spring的bean作用域分为5种
singleton:单例,整个spring容器只存在一个实例
prototype:原型,每次使用都会创建一个实例
request:每次request请求都会创建一个实例
session:每次会话创建一个实例
global session:一个全局的HTTP Session中,一个bean定义对应一个实例
测试例子
/** * @五中scope * @ 1.singleton 整个spring容器只存在一个实例,此时bean生命周期由spring容器管理 * @ 2.prototype 每次调用都会创建一个实例,此时bean创建后则不由spring容器管理 * @ 3.request 每次request请求创建一个实例 * @ 4.session 每次会话创建一个实例 * @ 5.global session */ public class Model { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml"); User user1 = (User) ac.getBean("user"); User user2 = (User) ac.getBean("user"); System.out.println(user1 == user2);//当scope为singleton时为true,当scope为prototype时为false } }
4、bean的生命周期
基本步骤顺序
1)实例化bean
2)调用set方法设值属性
3)如果实例实现了BeanNameAware接口,则调用setBeanName()方法(获取当前bean的引用)
4)如果实例实现了BeanFactoryAware接口,则调用setBeanFactory()方法(获取当前工厂及容器中的bean引用信息)
5)如果实例实现了ApplicationContextAware接口,则调用setApplicationContext()方法(获取上下文信息,包括容器创建时间等内容)
6)如果实现了BeanPostProcessor接口,则调用postProcessBeforeInitialization()方法(进行预初始化处理)
7)如果实例实现了InitializingBean接口,则调用afterPropertiesSet()方法(初始化后处理)
8)调用自己的初始化方法(bean属性init-method="myInit"自定义的方法)
9)如果实现了BeanPostProcessor接口,则调用postProcessAfterInitialization()(进行预初始化后处理)
10)容器初始化完成,执行正常调用
11)使用结束销毁容器
12)调用DisposableBean的distroy()方法
13)调用自己的destroy方法(bean属性destroy-method="myDestroy"自定义方法)
本文代码:https://github.com/shaoyesun/spring_ioc.git