天天用 Spring,bean 实例化原理你懂吗?
Java技术栈
www.javastack.cn
关注阅读更多优质文章
www.cnblogs.com/wyc1994666/p/10650480.html
本次主要想写spring bean的实例化相关的内容。创建spring bean 实例是spring bean 生命周期的第一阶段。
如我们在xml里定义的
以及用注解标识的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();
}
}
"1.0" encoding="UTF-8"?>"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">
"factoryInstance" class="spring.service.instance.MyBeanFactory" factory-method="getInstanceStatic"/>
输出结果为:
instance by FactoryInstance
2.实例工厂方法
public class MyBeanFactory {
/**
* 实例工厂创建bean实例
*
* @return
*/
public FactoryInstance getInstance() { return new FactoryInstance();
}
}
"1.0" encoding="UTF-8"?>
"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">