在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@69a0bc8a
com.hwkj.demo.action.Demo2@69a0bc8a
com.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@8ecf5c7
com.hwkj.demo.action.Demo2@8ecf5c7
com.hwkj.demo.action.Demo2@8ecf5c7
========================
this is Demo2 constructor...
com.hwkj.demo.action.Demo2@7cfbe064
this 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@1dfd90d9
com.hwkj.demo.action.Demo2@1dfd90d9
com.hwkj.demo.action.Demo2@1dfd90d9
=========================
com.hwkj.demo.action.Demo4@7230a5f0
com.hwkj.demo.action.Demo4@7230a5f0
com.hwkj.demo.action.Demo4@7230a5f0
com.hwkj.demo.action.Demo4@7230a5f0
从结果可以看到,在将配置文件载入内存后就是实例化了Demo2和Demo4的对象,并且是单例的