Spring实例化Bean

9 篇文章 0 订阅

Spring实例化Bean

前言:
    SpringIoc容器如何实例化Bean呢?传统应用程序可以通过new和反射方式进行实例化Bean.而Spring Ioc容器则需要根据Bean定义里的配置元数据使用反射机制来创建Bean.在Spring Ioc容器中根据Bean定义创建Bean主要有以下几种方式:

1.使用构造器实例化Bean

    这是最简单的方式,Spring Ioc容器即只能使用默认空构造器也能使用有参构造器这两种方式创建Bean,如以下方式指定要创建的Bean类型:
    使用空构造器进行定义,使用此种方式,class属性指定的类必须有空构造器:

<bean name="bean1" class="cn.hh.spring.HelloWorld">

    使用有参数构造器进行定义,使用此种方式,可以使用标签指定构造器参数值,其中index表示位置,value表示常量值,也可以指定引用,指定引用使用ref来引用另一个Bean定义,后边会详细介绍:

<bean name="bean2" class="cn.hh.spring.HelloWorld">
<!--指定构造器参数-->
  <constructor-arg index = "0" value="Hello Spring!">
</bean>

    知道如何配置了,接下来举个例子来时间一下吧:
        (1)准备Bean class(Hello.java),该类有一个构造器和一个有参构造器:

package cn.hh.spring.hello;
public class Hello implements HelloWorld{
  private String message;
  public Hello(){
    this.message = "Hello World";
  public Hello(String message){
    this.message = message;
  }
  public void sayHello(){
    System.out.println(message);
  }
  }
}

        (2)在配置文件(resources/spring/hello.xml)里配置Bean定义,如下所示:

<!--使用默认构造参数-->
<bean name="bean1" class= "cn.hh.spring.Hello"/>

<!--使用有参数构造函数-->
<bean name = "bean1" class = "cn.hh.spring.Hello">
  <constructor-arg index = "0" value="Hello Spring"/>

        (3)配置完了,让我们写段代码测试一下吧:

public void HelloTest(){
//使用构造器
BeanFactory beanFactory = new ClassPathXmlApplication("spring/hello.xml");
HelloWorld bean1 = beanFactory.getBean("bean1",HelloWorld.class);
bean1.sayHello();
HelloWorld bean2 = beanFactory.getBean("bean2",HelloWorld.class);
bean2.sayHello();
}

2.使用静态工厂实例化Bean

    使用这种方式除了指定必须的class属性,还要指定factory-method属性来指定实例化Bean方法,而且使用静态工厂方法也允许指定方法参数,spring Ioc容器靖调用此属性指定的方法来获取Bean,配置如下所示:
    (1).先看静态工厂代码HelloStaticFactory:

public class HelloStaticFactory{
  //工厂方法
  public static HelloWorld newInstance(String message){
  //返回需要的Bean实例
  return new Hello(message);
  }
}

    (2).静态工厂写完了,让我们在配置文件(resources/spring/hello.xml)配置Bean定义:

<!--使用静态工厂方法-->
<bean id = "bean3" class="cn.hh.spring.HelloStaticFactory" factory-method="newInstance">
  <constructor-arg index="0" value="Hello Spring!"/>
</bean>

    (3).配置写完了,写写测试代码来测试一下:

public void HelloStaticFactoryTest(){
  //使用静态工厂方法
  BeanFactory beanFactory = new 
  ClassPathXmlApplicationContext("spring/hello.xml");
  HelloWorld bean3 = beanFactory.getBean("bean3",HelloWorld.class);
  bean3.sayHello();
}

3.使用实例化工厂方法实例化Bean

    使用这种方式不能指定class属性,此时必须使用factory-bean属性来指定工厂Bean,factory-method属性指定实例化Bean的方法,而且使用实例化工厂方法允许指定方法参数,方法和使用构造器方式一样,配置如下:
        (1).实例工厂类代码(HelloFactory.java)如下:

package cn.hh.spring.hello;
public class HelloFactory{
  public HelloWorld newInstance(String message){
    return new Hello(message);
  } 
}

        (2).让我们在配置文件(resource/spring/hello.xml)配置Bean定义:

<!--1.定义实例化工厂-->
<bean id = "beanInstanceFactory" class = "cn.hh.spring.hello.HelloFactory"/>
<!--2.使用实例化工厂Bean创建Bean-->
<bean id = "bean4" factory-bean="beanInstanceFactory"
factory-method = "newInstance">
<constructor-arg index="0" value="Hello Spring!"></contructor-arg>
</bean>

        (3).测试代码HelloFactoryTest:

public void HelloFactoryTest(){
  //使用实例化工厂方法
  BeanFactory beanFactory = new 
  ClassPathXmlApplicationContext("spring/hello.xml");
  HelloWorld bean4 = beanFactory.getBean("bean4",HelloWorld.class);
  bean4.sayHello();
}

总结

    通过上面的例子我们已经掌握了如何实例化Bean了,其实这三种只是配置不一样,从获取方式来看,没有什么不同,这也是Spring Ioc的魄力,Spring Ioc帮你创建Bean,我们只管使用就可以了!

关注下面微信公众号获得更多学习资源!
关注微信公众号获得更多学习资源

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值