引言
近几年在java web项目中到处都是spring的身影,的确spring的出现给我的编程带来了翻天覆地的变化,尤其
是在AOP出现以后spring的地位更是独占鳌头了,所以对于java小白的小编来说spring是个学习的必经之路,下面就
现在总结一些,spring 创建bean的三种方式
1、调用构造器来创建bean
首先在在application.xml文件中配置下面代码:
<bean id="helloWorld" class="com.itheima.spring.helloword.Helloword"></bean>
具体类中的代码
package com.itheima.spring.helloword;
public class Helloword {
public Helloword() {
System.out.println("new instance");
}
public void hello() {
System.out.println("hello word");
}
}
测试代码:
@Test
public void springCreateObject_default() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Helloword helloword = (Helloword) context.getBean("helloWorld");
helloword.hello();
}
代码的执行过程如下:
1、程序创建BeanFactory实例
2、调用Helloword.java类默认的构造器创建默认实例
3、根据配置文件注入依赖关系,先实例化依赖bean,然后将依赖bean注入
4、返回一个完整的javabean实例
2、调用静态工厂创建bean
application.xml文件配置:
<bean id="helloWorld2"
class="com.itheima.spring.helloword.HelloWordFactory"
factory-method="getInstance"></bean>
静态工厂代码:
package com.itheima.spring.helloword;
public class HelloWordFactory {
public static Helloword getInstance() {
return new Helloword();
}
}
测试代码:
@Test
public void springCreateObject_factory() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Helloword helloword = (Helloword) context.getBean("helloWorld2");
helloword.hello();
}
代码的执行过程:
使用静态工厂方法创建bean实例时,class属性确定静态工厂类,而不是该bean的类。spring需要知道哪个静
态工厂方法创建的bean实例,使用factory-method属性来确定方法名。Spring调用工厂方法(也包含一组参数),并
返回一个有效的对象。之后,bean实例的使用与采用其他方法创建的完全一样。如果静态工厂方法需要参数,使用
<constructor-arg>元素传入。class元素不再是bean的实现类,而是静态工厂类; 必需有factory-method属性确定
产生实例的静态工厂方法; 静态工厂方法需要参数,则使用<constructor -arg>元素确定静态工厂方法.
3、调用实例工厂创建bean
application.xml配置代码:
<bean id="helloWorldFactory" class="com.itheima.spring.helloword.HelloWordFactory2"></bean>
<bean id="helloWorld3" factory-bean="helloWorldFactory" factory-method="getInstance" ></bean>
package com.itheima.spring.helloword;
public class HelloWordFactory2 {
public Helloword getInstance() {
return new Helloword();
}
}
测试代码:
@Test
public void springCreateObject_instanceFactory() {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Helloword helloword = (Helloword) context.getBean("helloWorld3");
helloword.hello();
}
代码执行过程:
通过实例工厂方法创建bean时,bean元素不能含有class属性.因为BeanFactory不再直接实例化该bean,BeanFactory
仅仅执行工厂的方法,工厂的方法返回bean实例.采用实例工厂方法创建bean应指定如下两个属性.工厂bean的id,该id
属性应该对应spring容器中的一个bean 工厂方法名,该方法可产生bean实例. 与静态工厂方法相似,如果需要在调
用工厂方法时传入参数,使用<constructor-arg>元素确定参数值
小结
一、使用类构造器实例化:通过bean的缺省构造函数
(org.springframework.beans.factory.support.DefaultListableBeanFactory)默认创建,当各个bean的业
务逻辑相互比较独立的时候或者和外界关联较少的时候可以使用。
二、静态工厂方法实例化:利用静态factory方法创建,可以统一管理各个bean的创建,如各个bean在创建之前
需要相同的初始化处理,则可用这个factory方法险进行统一的处理等等。
三、实例工厂方法实例化:利用实例化factory方法创建,即将factory方法也作为了业务bean来控制,觉得1可
用于集成其他框架的bean创建管理方法,2能够使bean和factory的角色互换。