• spring04-----Ioc容器实例化Bean


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

    一. 使用构造器实例化Bean

    这是最简单的方式,Spring IoC容器即能使用默认空构造器也能使用有参数构造器两种方 式创建Bean,如以下方式指定要创建的Bean类型:

    1. 使用空构造器进行定义,使用此种方式,class属性指定的类必须有空构造器。

     <bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/>

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

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

    知道如何配置了,下面介绍一个例子来实践一下:

    (1)准备Bean class(HelloImpl2.java),该类有一个空构造器和一个有参构造器。

    public interface HelloApi {
        public void sayHello();
    
    }
    
    public class HelloImpl2 implements HelloApi{
        private String message;
        public HelloImpl2() {
            this.message="Hello World";
        }
        public HelloImpl2(String message) {
            this.message=message;
        }
        public void sayHello() {
            System.out.println(message);
        }
        
    
    }

    (2)准备配置文件(resources/bean.xml)

        <!-- 使用默认构造函数 -->
        <bean id="bean1" class="com.test.spring.HelloImpl2">
        </bean>
        
        <!-- 使用有参构造函数 -->
        <bean id="bean2"  class="com.test.spring.HelloImpl2">
            <constructor-arg index="0" value="Hello Spring"/>
        </bean>    

    (3)实例化对象进行测试

    public class HelloTest {
        public static void main(String args[]) {
            ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
            HelloImpl2 aHelloImpl2=(HelloImpl2) context.getBean("bean1");
            HelloImpl2 bHelloImpl2=(HelloImpl2) context.getBean("bean2");
            aHelloImpl2.sayHello();
            bHelloImpl2.sayHello();
        }
            
    }
    
    
    Hello World
    Hello Spring

    二. 使用静态工厂方式实例化Bean

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

    public class HelloApiStaticFactory {
        //工厂方法
        public static HelloApi newInstance(String message) {
            //返回需要的Bean实例
            return new HelloImpl2(message);
        }
    
    }
    
    
    <bean id="bean3" class="com.test.spring.HelloApiStaticFactory" factory-method="newInstance">
            <constructor-arg index="0" value="Hello Spring"/>
        </bean>
    
    
    public class HelloTest {
        public static void main(String args[]) {
            ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
            HelloImpl2 aHelloImpl2=(HelloImpl2) context.getBean("bean3");
            aHelloImpl2.sayHello();
        }
            
    }
    
    Hello Spring

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

    此时必须使用factory-bean属性来指定工厂 Bean,factory-method属性指定实例化Bean的方法,而且使用实例工厂方法允许指定方法参数,方式和使用构造器方 式一样,配置如下:

    public class HelloApiInstanceFactory {
        public HelloApi newInstance(String message) {
            return new HelloImpl2(message);
        }
    
    }
    
    
        <!-- 1.定义实例工厂Bean -->
        <bean id="beanInstanceFactory" class="com.test.spring.HelloApiInstanceFactory"/>
        
        <!-- 2.使用实例工厂Bean创建Bean -->
        <bean id="bean4" factory-bean="beanInstanceFactory" factory-method="newInstance">
            <constructor-arg index="0" value="Hello Spring"></constructor-arg>
        </bean>
    
    public class HelloTest {
        public static void main(String args[]) {
            ApplicationContext context=new ClassPathXmlApplicationContext("bean.xml");
            HelloImpl2 aHelloImpl2=(HelloImpl2) context.getBean("bean4");
            aHelloImpl2.sayHello();
        }
            
    }
    
    Hello Spring

    这三种方式只是配置不一样,从获取方 式看完全一样,没有任何不同。这也是Spring IoC的魅力,Spring IoC帮你创建Bean,我们只管使用就可以了,是不是 很简单。

    参考文献:

    http://jinnianshilongnian.iteye.com

  • 相关阅读:
    win7 64位操作系统下使用OFFICE2007 导入表格报错 未在本地计算机上注册 Microsoft.ACE.OLEDB.12.0
    armxilinxeabigcc 不是内部或外部命令,也不是可运行的程序
    上位机 串口 通信 协议
    ZYNQ 调试遇到的种种问题汇总[转帖]
    ZedBoard 安装 Ubuntu11.04
    What the difference between .ipa and .app
    How to create a .ipa file for ios app?
    获取IOS客户端系统版本号
    ios软件支持双语(本地化、国际化)
    objectivec中判断对象是否属于某个类的方法
  • 原文地址:https://www.cnblogs.com/Hermioner/p/10028951.html
Copyright © 2020-2023  润新知