spring内部创建对象的方式(或bean实例化方式)
方式一:采用默认构造函数创建对象(重点)
<bean id="helloWorld" class="cn.zzu.spring.bean.HelloWorld"></bean>
方式二:采用静态工厂的方式
首先提供一个工厂类
public class HelloWorldFactory {
/**
* 静态方法
* 创建HelloWorld对象
* @return
*/
public static HelloWorld getInstance(){
return new HelloWorld();
}
}
配置静态工厂方法即把其放入spring容器
<bean id="helloWorld2" class="cn.zzu.spring.bean.HelloWorldFactory" factory-method="getInstance"></bean>
第三种方式:采用实例工厂方式
创建一个类对象如下
public class HelloWorld2Factory {
public HelloWorld getInstance(){
return new HelloWorld();
}
}
配置文件的写法
<bean id="helloWorldFactory" class="cn.zzu.spring.bean.HelloWorld2Factory"></bean>
<!--
利用实例工厂模式创建对象
factory-bean
指向某一个工厂
factory-method
工厂方法
-->
<bean id="helloWorld3" factory-bean="helloWorldFactory" factory-method="getInstance"></bean>
spring容器创建对象的时机
1、在默认的情况下(lazy-init='default/false'),在spring容器初始化的时候创建对象
2、lazy-init为true的情况
当客户端调用context.getBean的方式时创建对象
3、说明:
1、lazy-init为default/false的情况,可以过早的发现错误,过早的进行修改
lazy-init为true,不能过早发现错误
2、如果一个bean中存放过大的数据,我们不希望该数据过早的加入到内存中,希望的情况是什么时候用什么时候加载
这个时候用lazy-init为true比较好
Bean的作用域
企业开发时:最常用 singleton 和 prototype
SingletonBean在容器初始化时,就构造
PrototypeBean在使用Bean (getBean) 才去构造
1、默认情况下,spring容器中的bean是单例模式(singleton)
2、prototype 原型模式 多实例
3、如果一个bean的scope为"prototype",那么lazy-init无论为什么值,都是getBean时才要创建对象
4、struts2的action是多实例,所以如果把action放入到spring容器中,action在spring容器中的配置必须是
scope="prototype"
Bean的初始化与销毁
spring容器的init和detroy
在spring的配置文件中
<bean id="helloWorld" class="cn.itcast.spring1107.initdestroy.bean.HelloWorld"
init-method="init" destroy-method="destroy"></bean>
执行顺序:
1、启动spring容器
2、采用默认的构造函数创建对象
3、执行init-method指向的方法
该方法是由spring容器来调用的,并且是在执行完构造函数之后立刻调用的
4、对象调用方法
5、执行destroy-method方法
注:不管是初始化方法还是销毁方法,实际上都是由spring容器内部执行的,但是销毁方式的前提条件:
1、spring容器关闭
2、必须是单例的