Spring实例化Bean对象的三种方式
构造函数,静态工厂类,实例工厂类实例化
1.构造函数
使用构造函数方法创建bean时,所有普通类都是可用的。也就是说,正在开发的类不需要实现任何特定的接口。是最常见也是最简单的一种实例化bean的方式。
2.静态工厂类
用于生成实例对象,所有的方法必须是static。定义使用静态工厂方法创建的bean时,使用class属性指定包含要指定的静态工厂方法和名为
factory-method的属性的类工厂方法本身的名称。 相对第一种实现方式,多了工厂类;
applicationContext.xml 配置文件
<!--通过静态工厂方法实例化bean-->
<bean id="instanceByStaticFactory" class="com.abin.spring.demo.demoService.DemoStaticFactory" factory-method="getBeanByStaticFactory"/>
InstanceByStaticFactoryImpl 需要被实例化的类
public class InstanceByStaticFactoryImpl implements InstanceByStaticFactoryI{
@Override
public void printByStaticFactory() {
System.out.println("===InstanceByStaticFactoryImpl===");
}
}
DemoStaticFactory 静态工厂类
public class DemoStaticFactory {
// 通过静态工厂类来实例化对象
private static InstanceByStaticFactoryI instanceByStaticFactory = new InstanceByStaticFactoryImpl();
public static InstanceByStaticFactoryI getBeanByStaticFactory(){
return instanceByStaticFactory;
}
}
实例化
// spring的配置文件
String applicationContextStr = "applicationContext.xml";
// 创建ClassPathXmlApplicationContext
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext(applicationContextStr);
// 通过bean 的 id 创建类
InstanceByStaticFactoryI instanceByStaticFactory = (InstanceByStaticFactoryI) classPathXmlApplicationContext.getBean("instanceByStaticFactory");
instanceByStaticFactory.printByStaticFactory();
结果
=InstanceByStaticFactoryImpl=
3.实例工厂类
必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。与通过静态工厂方法实例化类似,使用实例工厂方法实例化从容器中调用
现有bean的非静态方法来创建新bean。使用这个机制,保留class属性为空,在factory-bean属性中指定a的名称包含要调用的实例方法的当前(或父/父)
容器中的bean创建对象。
applicationContext.xml 配置文件
<!--通过实例工厂实例化bean-->
<!-- 因为不是静态的返回对象,所以要先获取到工厂对象,然后再通过工厂对象使用非静态成员方法-->
<bean id="instanceByInstanceFactory" class="com.abin.spring.demo.demoService.DemoInstanceFactory"/>
<!-- 这里的factory-bean中的值为前面写的指向实例工厂类bean的id -->
<bean id="instanceByInstanceFactorImpl" factory-bean="instanceByInstanceFactory" factory-method="getInstanceByInstanceFactory"/>
InstanceByInstanceFactoryImpl 被实例化的类
public class InstanceByInstanceFactoryImpl implements InstanceByInstanceFactoryI {
@Override
public void printByInstanceFactory() {
System.out.println("===InstanceByInstanceFactoryImpl===");
}
}
DemoInstanceFactory 实例工厂类
public class DemoInstanceFactory {
// 实例工厂类
private InstanceByInstanceFactoryI instanceByInstanceFactory = new InstanceByInstanceFactoryImpl();
public InstanceByInstanceFactoryI getInstanceByInstanceFactory(){
return instanceByInstanceFactory;
}
}
实例化
// spring的配置文件
String applicationContext = "applicationContext.xml";
// 创建ClassPathXmlApplicationContext
ClassPathXmlApplicationContext cxt = new ClassPathXmlApplicationContext(applicationContextStr);
// 通过bean 的 id 创建类
InstanceByInstanceFactoryI InstanceByInstanceFactor = (InstanceByInstanceFactoryI) cxt.getBean("instanceByInstanceFactorImpl");
InstanceByInstanceFactor.printByInstanceFactory();
结果
=InstanceByInstanceFactoryImpl=