bean 的生命周期主要有如下几个步骤:
- 创建bean的实例
- 给实例化出来的bean填充属性
- 初始化bean
- 通过IOC容器使用bean
- 容器关闭时销毁bean
在实例化bean之前在BeanDefinition里头已经有了所有需要实例化时用到的元数据,接下来spring 只需要选择合适的实例化方法以及策略即可。实例化方法有两大类分别是工厂方法和构造方法实例化,后者是最常见的。
spring默认的实例化方法就是无参构造函数实例化。
如我们在xml里定义的 <bean id="xxx" class="yyy"/> 以及用注解标识的bean都是通过默认实例化方法实例化的。
- 两种实例化方法(构造函数 和 工厂方法)
- 源码阅读
- 实例化策略(cglib or 反射)
两种实例化方
使用适当的实例化方法为指定的bean创建新实例:工厂方法,构造函数实例化。
代码演示
启动容器时会实例化所有注册的bean(lazy-init懒加载的bean除外),对于所有单例非懒加载的bean来说当从容器里获取
bean(getBean(String name))的时候不会触发,实例化阶段,而是直接从缓存获取已准备好的bean,而生成bean的时机则是下面这行代码运行时触发的。
@Test public void testBeanInstance(){ // 启动容器 ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml"); }
一 使用工厂方法实例化(很少用)
1.静态工厂方法
public class FactoryInstance { public FactoryInstance() { System.out.println("instance by FactoryInstance"); } } public class MyBeanFactory { public static FactoryInstance getInstanceStatic(){ return new FactoryInstance(); } }
<?xml version="1.0" encoding="UTF-8"?><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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <bean id="factoryInstance" class="spring.service.instance.MyBeanFactory" factory-method="getInstanceStatic"/> </beans>
输出结果为:
instance by FactoryInstance
2.实例工厂方法
public class MyBeanFactory { /** * 实例工厂创建bean实例 * * @return */ public FactoryInstance getInstance() { return new FactoryInstance(); } }
<?xml version="1.0" encoding="UTF-8"?> <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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">