zoukankan      html  css  js  c++  java
  • Spring---bean的实例化

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

    • 使用构造器实例化Bean
    • 使用静态工厂方式实例化Bean
    • 使用实例工厂方法实例化Bean

    构造器实例化

    构造器实例化 Bean 是最简单的方式,Spring IoC容器既能使用默认空构造器也能使用有参数构造器两种方式创建Bean

    空构造器实例化:要求java Bean必须要有构造方法

    • 空构造器实例化:

      <bean id="helloServiceNoWithArgs" class="com.jike.***.HelloWorldImpl" />

    • 有参数构造器实例化:

      <bean id="helloServiceWithArgs" class="com.jike.***.HelloWorldmpl">

        <!-- 指定构造器参数,index指定位置 -->

        <constructor-arg index="0" value="Hello Spring!"/> 

      </bean>

    静态工厂实例化

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

    • <!--使用有参数构造参数--> 

      <bean id="helloServiceStaticFactory" class="com.jike.***.HelloWorldStaticFactory" factory-method="newInstance">

        <!-- 指定构造器参数 --> 

        <constructor-arg index="0" value="Hello Static Factory!"/> 

      </bean>

    实例工厂实例化

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

      <!-- 1、定义实例工厂Bean -->

      <bean id="beanInstanceFactory" class="com.jike.***.HelloWorldInstanceFactory" />

      <!-- 2、使用实例工厂Bean创建Bean -->

      <bean id=“helloWorldInstance" factory-bean="beanInstanceFactory" factory-method="newInstance">

        <constructor-arg index="0" value="Hello  Instance Factory!"></constructor-arg>

      </bean>

    实例化示例

    配置文件配置见上文

    基础类HelloWord.java

    public interface HelloWorld {
        public void sayHello();
    }

    基础类HelloWordImpl.java

    public class HelloWorldImpl implements HelloWorld {
    
        private String message;
    
        /**
         * 空构造器
         */
        public HelloWorldImpl() {
            this.message = "Hello World!";
        }
    
        /**
         * 带参构造器
         * 
         * @param message
         */
        public HelloWorldImpl(String message) {
            this.message = message;
        }
    
        public void sayHello() {
            System.out.println(message);
        }
    
    }

    静态工厂实例化类HelloWorldInstanceFactory.java

    public class HelloWorldStaticFactory {
         /**
         * 工厂方法 
         * 
         * @param message
         * @return
         */
        public static HelloWorld newInstance(String message) {
            // 返回需要的Bean实例
            return new HelloWorldImpl(message);
        }
    
    }

    实例工厂实例化类HelloWorldStaticFactory.java

    public class HelloWorldInstanceFactory {
         
        /**
         * 工厂方法 
         * 
         * @param message
         * @return
         */
        public HelloWorld newInstance(String message) {
            // 返回需要的Bean实例
            return new HelloWorldImpl(message);
        }
    
    }

    程序入口类Main.java

    public class Main {
    
        public static void main(String[] args) {
            helloWorldInstanceFactory();
        }
        
        //使用无参数构造器来实例化Bean
        public static void sayHelloWithNoArgs() {
            BeanFactory beanFactory = 
                    new ClassPathXmlApplicationContext("conf/conf-instance.xml");
            HelloWorld helloWorld = beanFactory.getBean("helloWorldWithNoArgs", HelloWorld.class);
            helloWorld.sayHello();
        }
        //使用有参数构造器来实例化Bean
        public static void sayHelloWithArgs() {
            BeanFactory beanFactory = 
                    new ClassPathXmlApplicationContext("conf/conf-instance.xml");
            HelloWorld helloWorld = beanFactory.getBean("helloWorldWithArgs", HelloWorld.class);
            helloWorld.sayHello();
        }
        
    
        //使用静态工厂方法来实例化Bean
        public static void helloWorldStaticFactory() {
            // 1、读取配置文件实例化一个IOC容器
            BeanFactory beanFactory = 
                    new ClassPathXmlApplicationContext("conf/conf-instance.xml");
            // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现”
            HelloWorld helloWorld 
            = beanFactory.getBean("helloWorldStaticFactory", HelloWorld.class);
            // 3、执行业务逻辑
            helloWorld.sayHello();
        }
    
        //使用实例化工厂方法来实例化Bean
        public static void helloWorldInstanceFactory() {
            // 1、读取配置文件实例化一个IOC容器
            BeanFactory beanFactory = 
                    new ClassPathXmlApplicationContext("conf/conf-instance.xml");
            // 2、从容器中获取Bean,注意此处完全“面向接口编程,而不是面向实现编程”
            HelloWorld helloWorld 
            = beanFactory.getBean("helloWorldInstance", HelloWorld.class);
            // 3、执行业务逻辑
            helloWorld.sayHello();
        }
    }
  • 相关阅读:
    CSS——background-size实现图片自适应
    Python手势识别
    Electron把网页打包成桌面应用并进行源码加密
    CSS——对position定位和margin-top的理解
    function(){}、var fun=function(){}和function fun(){}的区别
    Python+OpenCV图像处理(十六)—— 轮廓发现
    Python+OpenCV图像处理(十五)—— 圆检测
    Macbook pro快捷键
    修改MacBook Pro主机名,共享电脑名
    Mac安装java8
  • 原文地址:https://www.cnblogs.com/xiaobaizhiqian/p/7821153.html
Copyright © 2011-2022 走看看