1. BeanpostProcessor,BeanFactoryPostProcessor区别
spring初始化bean流程
定义bean标签 > 将bean标签解析成BeanDefinition > 调用构造方法实例化(IOC) > 属性值依赖注入(DI) > init-method
BeanpostProcessor | BeanFactoryPostProcessor |
---|---|
发生在Spring容器的实例化和依赖注入之后,init-method前后 | BeanDefinition之后,IOC之前 |
2. BeanFactory和ApplicationContext作用与区别
BeanFactory:
是Spring里面最低层的接口,提供了最简单的容器的功能,只提供了实例化对象和拿对象的功能;
ApplicationContext:
应用上下文,继承BeanFactory接口,它是Spring的一各更高级的容器,提供了更多的有用的功能;
- 国际化(MessageSource)
- 访问资源,如URL和文件(ResourceLoader)
- 载入多个(有继承关系)上下文 ,使得每一个上下文都专注于一个特定的层次,比如应用的web层
- 消息发送、响应机制(ApplicationEventPublisher)
- AOP(拦截器)
3. 如何从文件系统加载spring xml文件
一: XmlBeanFactory 引用资源
Resource resource = new ClassPathResource(“appcontext.xml”);
BeanFactory factory = new XmlBeanFactory(resource);
二: ClassPathXmlApplicationContext 编译路径
ApplicationContext factory=new ClassPathXmlApplicationContext(“classpath:appcontext.xml”);
// src目录下的
ApplicationContext factory=new ClassPathXmlApplicationContext(“appcontext.xml”);
ApplicationContext factory=new ClassPathXmlApplicationContext(new String[] {“bean1.xml”,“bean2.xml”});
// src/conf 目录下的
ApplicationContext factory=new ClassPathXmlApplicationContext(“conf/appcontext.xml”);
ApplicationContext factory=new ClassPathXmlApplicationContext(“file:G:/Test/src/appcontext.xml”);
三: 用文件系统的路径
ApplicationContext factory=new FileSystemXmlApplicationContext(“src/appcontext.xml”);
//使用了 classpath: 前缀,作为标志, 这样,FileSystemXmlApplicationContext 也能够读入classpath下的相对路径
ApplicationContext factory=new FileSystemXmlApplicationContext(“classpath:appcontext.xml”);
ApplicationContext factory=new FileSystemXmlApplicationContext(“file:G:/Test/src/appcontext.xml”);
ApplicationContext factory=new FileSystemXmlApplicationContext(“G:/Test/src/appcontext.xml”);
四: XmlWebApplicationContext是专为Web工程定制的。
ServletContext servletContext = request.getSession().getServletContext();
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext );
五: 使用BeanFactory
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg);
reader.loadBeanDefinitions(new ClassPathResource(“bean1.xml”));
reader.loadBeanDefinitions(new ClassPathResource(“bean2.xml”));
BeanFactory bf=(BeanFactory)reg;
六:Web 应用启动时加载多个配置文件 【目前项目中xml比较多】
通过ContextLoaderListener 也可加载多个配置文件,在web.xml文件中利用
<context-pararn>元素来指定多个配置文件位置,其配置如下:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:config/*.xml //代表加载类路径下config下的所有xml文件
</param-value>
</context-param>
4. 多个bean初始化顺序
- 构造方法依赖
- @DependOn 注解
需要注意的是 bean 的初始化方法调用顺序无法保证 - BeanPostProcessor手动控制
重写postProcessAfterInstantiation方法