Spring中bean的初始化方法

来源:互联网 发布:微信群发软件 编辑:程序博客网 时间:2024/06/05 03:03

在Spring中有3种初始化bean的方式。分别是1.构造器初始化、2.静态工厂方法初始化、3.实力工厂初始化


1.构造器初始化

使用构造器初始化对象的时候,使用的是类的默认构造方法。如果要使用有参数的构造方法的话,那属于属性注入的部分了,暂时不讲

在配置文件中做如下配置

 

<bean id="demo2" class="com.hwkj.demo.action.Demo2"/>

   class中的值为类的全路径名,id中的值类似于key


使用默认的配置,spring中创造出来的bean是单例的,如下代码的结果是


ApplicationContext ctx = new ClassPathXmlApplicationContext( "applicationContext.xml");                Demo2 demo2 = (Demo2) ctx.getBean("demo2");        Demo2 demo21 = (Demo2) ctx.getBean("demo2");        Demo2 demo22 = (Demo2) ctx.getBean("demo2");        System.out.println(demo2);        System.out.println(demo21);        System.out.println(demo22);

结果:

     

this is Demo2 constructor...com.hwkj.demo.action.Demo2@69a0bc8acom.hwkj.demo.action.Demo2@69a0bc8acom.hwkj.demo.action.Demo2@69a0bc8a

2.静态工厂方法初始化bean

在Demo3这个类中 提供一个静态方法,用来返回Demo2对象

public class Demo3 {public Demo3(){System.out.println("this is Demo3 constructor...");}public static Demo2 getDemo2() {return new Demo2();}}

配置文件中关键就是加一个属性factory-method

 <bean id = "demo2" class="com.hwkj.demo.action.Demo3" factory-method="getDemo2"></bean><pre name="code" class="html">factory-method 中的值是Demo3中的静态方法名
初始化出来的bean依然是单例的

Demo3类代码如下:

public class Demo3 {public Demo3(){System.out.println("this is Demo3 constructor...");}public static Demo2 getDemo2() {return new Demo2();}}




运行以下代码
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");Demo2 demo2 = (Demo2) ctx.getBean("demo2");Demo2 demo21 = (Demo2) ctx.getBean("demo2");Demo2 demo22 = (Demo2) ctx.getBean("demo2");System.out.println(demo2);System.out.println(demo21);System.out.println(demo22);System.out.println("========================");System.out.println(Demo3.getDemo2());System.out.println(Demo3.getDemo2());

<span style="color:#FF0000;"><strong>结果</strong></span>:
this is Demo2 constructor...com.hwkj.demo.action.Demo2@8ecf5c7com.hwkj.demo.action.Demo2@8ecf5c7com.hwkj.demo.action.Demo2@8ecf5c7========================this is Demo2 constructor...com.hwkj.demo.action.Demo2@7cfbe064this is Demo2 constructor...com.hwkj.demo.action.Demo2@7c490556

从结果中可以看出,使用 new ClassPathXmlApplicationContext(String name);这种方式将配置文件加载到内存中,Spring就会去初始化配置文件中的bean,并且初始化出来的bean是单例的。

分隔线下方的Demo2的对象就不属于Spring管理,它不是由Spring创建出来的

而且从结果中我们可以看出Sping在初始Demo2对象的时候,并没有去执行Demo3的构造方法,也就是说使用静态工厂方法初始化bean的时候,不需要去实例化这个工厂类。换个思路也可以理解,getDemo2()这个方法本来就是Demo3的静态方法,因此不需要Demo3的实例就可以直接是Dmo3类来调用getDemo2()方法。


3.实例工厂方法初始化

实例工厂类代码如下:

public class Demo4 {public Demo4(){System.out.println("this is Demo4 constructor...");}public Demo2 getDemo2() {return new Demo2();}}
配置文件如下:

<bean id="demo2" factory-bean="demo4"  factory-method="getDemo2"></bean>   <bean id="demo4" class="com.hwkj.demo.action.Demo4"></bean>

使用实例工厂方法初始化bean的时候必须也要初始化实例工厂类

运行如下代码

ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");Demo2 demo2 = (Demo2) ctx.getBean("demo2");Demo2 demo21 = (Demo2) ctx.getBean("demo2");Demo2 demo22 = (Demo2) ctx.getBean("demo2");System.out.println(demo2);System.out.println(demo21);System.out.println(demo22);System.out.println("=========================");Demo4 demo4 = (Demo4) ctx.getBean("demo4");Demo4 demo41 = (Demo4) ctx.getBean("demo4");Demo4 demo42 = (Demo4) ctx.getBean("demo4");Demo4 demo43 = (Demo4) ctx.getBean("demo4");System.out.println(demo4);System.out.println(demo41);System.out.println(demo42);System.out.println(demo43);

结果:

this is Demo4 constructor...this is Demo2 constructor...com.hwkj.demo.action.Demo2@1dfd90d9com.hwkj.demo.action.Demo2@1dfd90d9com.hwkj.demo.action.Demo2@1dfd90d9=========================com.hwkj.demo.action.Demo4@7230a5f0com.hwkj.demo.action.Demo4@7230a5f0com.hwkj.demo.action.Demo4@7230a5f0com.hwkj.demo.action.Demo4@7230a5f0

从结果可以看到,在将配置文件载入内存后就是实例化了Demo2和Demo4的对象,并且是单例的

0 0
原创粉丝点击