💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] # ApplicationContext与BeanFactory关系 ![](https://box.kancloud.cn/d2c5e8ecac968919fa318578b2c38423_1434x1342.png) ApplicationContext它是扩展BeanFactory接口。 BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean 在开发中我们一般使用的是ApplicationContext,真正使用的是其实现类, FileSystemXmlAppliCationContext 根据文件路径获取 ClassPathXmlApplicationContext 根据类路径获取 AppliCationContext它会在配置文件加载时,就会初始化Bean, 并且ApplicationContext它提供不同的应用层的Context实现。 例如在web开发中可以使用WebApplicationContext. # Bean实例化方式 ## 无参数构造 对于这种方式,注意Bean类中必须提供无参数构造 ~~~ <bean name="user" class="studySpring.User"></bean> ~~~ ## 静态工厂方法 需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以。 ~~~ <!-- 创建方式2:静态工厂创建 调用UserFactory的createUser方法创建名为user2的对象.放入容器 --> <bean name="user2" class="hello.UserFactory" factory-method="createUser" ></bean> ~~~ UserFactory ~~~ public static User createUser() { System.out.println("静态工厂创建User"); return new User(); } ~~~ ## 实例工厂方法 需要创建一个工厂类,在工厂类中提供一个非static的创建bean对象的方法,在配置文件中需要将工厂配置,还需要配置bean ~~~ <!-- 创建方式3:实例工厂创建 调用UserFactory对象的createUser2方法创建名为user3的对象.放入容器 --> <bean name="UserFactory" class="hello.UserFactory"></bean> <bean name="user3" factory-bean="UserFactory" factory-method="createUser2" ></bean> ~~~ UserFactory ~~~ public User createUser2() { System.out.println("实例工厂创建User"); return new User(); } ~~~ # Bean的作用域 ![](https://box.kancloud.cn/4008ff4e272bf27d53a4185ca437d671_494x258.png) 在bean声明时它有一个scope属性,它是用于描述bean的作用域。 可取值有: singleton:单例 代表在spring ioc容器中只有一个Bean实例 (默认的scope) prototype多例 每一次从spring容器中获取时,都会返回一个新的实例 request 用在web开发中,将bean对象request.setAttribute()存储到request域中 session 用在web开发中,将bean对象session.setAttribute()存储到session域中 在开如常用的值是singleton与prototype # Bean的生命周期 ![](https://box.kancloud.cn/814f34b6ed89b87f070724604aafc8d5_1730x1338.png) 1. instantiate bean对象实例化 2. populate properties 封装属性 3. 如果Bean实现BeanNameAware执行setBeanName 4. 如果Bean实现BeanFactoryAwar或ApplicationContextAwar设置工厂setBeanFactory或上下文对象setApplicationContext 5. 如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization 6. 如果Bean实现InitializingBean执行afterPropertiesSet 7. 调用自定义的init-method方法 8. 如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization 9. 执行业务处理 10. 如果Bean实现DisposableBean执行destroy 11. 调用自定义的destroy-method 对于bean的生命周期方法: 第三步与第四步是让Bean了解spring容器。 第五步与第八步 可以针对指定的Bean进行功能增强,这时一般会使用动态代理. 第六步与第十步:通过实现指定的接口来完成init与destroy操作 但是在开发中一般不使用第6步与第10步,原因是我们可以使用第7步与第11步来完成。 第7步与第11步的初始化与销毁操作它无耦合,推荐使用的。但是必须在配置文件中指定初始化与销毁的方法 ~~~ <bean name="user" class="studySpring.User" init-method="init" destroy-method="destory"></bean> ~~~ 然后在User类中写init和destory方法 然后再写测试方法 ~~~ // 1.创建容器对象,因为直接在src下,就写applicationContext.xml ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml"); // 2.向容器要User对象 Object u = ac.getBean("user"); // 打印User对象 System.out.println(u); // 关闭容器,触发销毁方法,close方法在ClassPathXmlApplicationContext中 ac.close(); ~~~ 总结: 对于bean的生命周期,我们需要关注的主要有两个方法: 1. 增强bean的功能可以使用后处理Bean, BeanPostProcessor 2. 如果需要初始化或销毁操作我们可以使用init-method destroy-method 注意:destroy-method只对scope=singleton有效果。