1. Spring的BeanFactory和FactoryBean的区别
Spring的BeanFactory是顶层接口,定义了Spring容器的基本功能,ApplicationContenxt是BeanFactory的子接口,增强了BeanFactory,减少了读取配置文件和国际化等性能
BeanFactory -> ApplicationContenxt 子级接口 -> ClassPathXmlApplicationContenxt 基于XML的配置 -> FileSystemXmlApplicationContenxt -> AnnotationConfigApplicationContenxt 注解配置
- FactotyBean是一种结构简单Bean的形式的接口,能够自定义Bean的细节并退出Spring治理
2. Bean的生命周期
- 初始化Bean
- 注入属性值
- 如果实现
BeanNameAware
接口,调用BeanNameAware
的setBeanName
传入以后Bean的ID - 如果实现
BeanFactoryAware
接口,调用BeanFactoryAware
的setBeanFactory
传入以后工厂实例的援用 - 如果实现
ApplicationContextAware
接口,调用ApplicationContextAware
的setApplicationContext
传入以后ApplicationContext实例的援用 - 如果有Bean的前置初始化处理器,调用
postProcessBeforeInitialization
执行解决 - 如果实现
InitializingBean
接口,调用InitializingBean
的afterPropertiesSet
办法 - 调用init办法进行初始化
- 如果有Bean的后置初始化处理器,调用
postProcessAfterInitialization
执行解决 - 如果作用范畴是单例,则退出Ioc缓存池,否则完结
- 当ApplicationContext容器敞开时,调用设定的
preDestory
和destory
执行销毁
/** * 注解将Bean退出IOC */@Configuration@ComponentScan({"com.pal.entity"})public class SpringConfig { @Bean(value = "PoDemo",initMethod = "init",destroyMethod = "destroy") public PoDemo getInstance(){ PoDemo poDemo = new PoDemo(); poDemo.setName("poDemo"); return poDemo; }}
/** * 除process拦截器外的生命周期办法 */public class PoDemo implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean { private String name; private Integer age; @Override public void setBeanName(String name) { System.out.println("3.注册我成为Bean时定义的ID:"+name); } @Override public void setBeanFactory(BeanFactory beanFactory) throws BeansException { System.out.println("4.治理此Bean的BeanFactory为:"+beanFactory); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { System.out.println("5.治理此Bean的ApplicationContext为:"+applicationContext); } @Override public void afterPropertiesSet() throws Exception { System.out.println("7.属性设置之后执行 afterPropertiesSet()"); } public void init() { System.out.println("8.Bean的Init办法被执行"); } @PreDestroy public void preDestroy() { System.out.println("10.销毁Bean之前执行preDestroy"); } public void destroy() { System.out.println("11.调用destroy办法销毁Bean"); } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }}
/** * 拦挡实例化、属性注入之后的对象 */@Componentpublic class BeanPostProcessorDemo implements BeanPostProcessor { /** * Init办法执行前的操作 */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if ("PoDemo".equalsIgnoreCase(beanName)) { System.out.println("6.Init办法前的解决!"); } return null; } /** * Init办法执行后的操作 */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { if ("PoDemo".equalsIgnoreCase(beanName)) { System.out.println("9.Init办法后的解决!"); } return null; }}
/** * 启动办法 */@Testvoid BeanLifeTest() { // 在config类中将Bean退出治理用 AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class); PoDemo poDemo = (PoDemo) applicationContext.getBean("PoDemo"); System.out.println("加载Bean -> "+poDemo.getName()); applicationContext.close();}
3. Bean加载形式
2.1 XML形式
// 通常引入xml形式ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");BeanClass bean = applicationContext.getBean("beanId");
<!-- Spring ioc 实例化Bean的三种形式 --><!-- 一:应用无参结构器(举荐) --><bean id = "beanId" class = "com.lagou.xxx."></bean><!-- 另外两种是为了将new的对象退出spring治理 --><!-- 二:静态方法 --><bean id = "beanId" class = "com.lagou.xxx.xxxFactory" factory-method = "getInstance"></bean>public class Factory{ public static XXBean getinstance(){ return new XXBean(); }}<!-- 三:实例化办法 --><bean id = "factoryBeanId" class = "com.lagou.xxx.xxxFactory"></bean><bean id = "beanId" factory-bean = "factoryBeanId" factory-method = "getInstance"></bean>public class Factory{ public XXBean getinstance(){ return new XXBean(); }}
3. Bean的作用范畴与生命周期
3.1 作用范畴
- Singleton -> 单例 bean对象生命周期与容器雷同。
- Prototype -> 多例 bean对象,spring框架只负责创立,不负责销毁(JVM回收)。
- Request,session
<bean id = "beanId" class = "com.lagou.xxx." scope = "xxx"></bean>