spring实例化bean的三种方式

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=

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值