• Spring学习之实例化bean的三种方式


    概述

    学习一下Spring IOC bean的三种实例化方式。

    默认构造方法实例化bean

    最常用的初始化bean方式, 必须提供默认构造方法

    public class Person {
    
        private String name;
        private Integer age;
    
        public Person() {
            System.out.println("这是一个无参构造函数");
        }
    
        public Person(String name) {
            this.name = name;
            System.out.println(name+"参数的构造函数");
        }
    
        public Person(String name, Integer age) {
            this.name = name;
            this.age = age;
            System.out.println("带有名字="+name+"和年龄="+age+"参数的构造函数");
        }
    
    }
    
    

    bean.xml

    <bean id="person" class="com.maple.Person"></bean>
    <bean id="personWithParam" class="com.maple.Person">
        <constructor-arg name="name" value="枫叶"/>
    </bean>
    <bean id="personWirhParams" class="com.maple.Person">
            <constructor-arg name="name" value="枫叶"/>
            <constructor-arg name="age" value="23"/>
    </bean>
    

    静态工厂初始化bean

    当采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法。Spring将调用此方法返回实例对象,就此而言,跟通过普通构造器创建类实例没什么两样。

    public class MyBeanFactory {
    	
    	/**
    	 * 创建实例
    	 * @return
    	 */
    	public static UserService createService(){
    		return new UserServiceImpl();
    	}
            
            public static UserService createService(String name){
    		return new UserServiceImpl(name);
    	}
    
            public static UserService createService(String name,int age){
    		return new UserServiceImpl(name,age);
    	}
    }
    
    

    bean.xml

    <bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService"></bean>
    <bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService">
    <constructor-arg name="name" value="枫叶"/>
    </bean>
    <bean id="userServiceId" class="com.maple.MyBeanFactory" factory-method="createService">
    <constructor-arg name="name" value="枫叶"/>
    <constructor-arg name="age" value="23"/>
    </bean>
    
    

    实例工厂初始化bean

    与使用静态工厂方法实例化类似,用来进行实例化的非静态实例工厂方法位于另外一个bean中(即下面的MyBeanFactory .java),容器将调用该bean的工厂方法来创建一个新的bean实例。

    为使用此机制,class属性必须为空,而factory-bean 属性必须指定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定。
    必须先有工厂实例对象,通过实例对象创建对象。提供所有的方法都是“非静态”的。

    
    /**
     * 实例工厂,所有方法非静态
     *
     */
    public class MyBeanFactory {
    	
    	/**
    	 * 实例化工厂
    	 */
    	public UserService createService(){
    		return new UserServiceImpl();
    	}
            
            /**
    	 * 实例化工厂1
    	 */
            public static UserService createService(String name){
    		return new UserServiceImpl(name);
    	}
            
            /**
    	 * 实例化工厂2
    	 */
            public static UserService createService(String name,int age){
    		return new UserServiceImpl(name,age);
    	}
    
            
    }
    
    

    bean.xml

    <!-- 创建工厂实例 -->
    	<bean id="myBeanFactoryId" class="com.maple.MyBeanFactory"></bean>
    	<!-- 获得userservice 
    		* factory-bean 确定工厂实例
    		* factory-method 确定普通方法
    	-->
    	<bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService"></bean>
    
            <bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">
                           <constructor-arg name="name" value="枫叶"/>
            </bean>
    
            <bean id="userServiceId" factory-bean="myBeanFactoryId" factory-method="createService">
                         <constructor-arg name="name" value="枫叶"/>
                         <constructor-arg name="age" value="23"/>
            </bean>
            
    
    
  • 相关阅读:
    找球号(一)
    拦截导弹
    开灯问题
    超级台阶
    小学生算术
    Financial Management
    三角形面积
    另一种阶乘问题
    并发环境下,先操作数据库还是先操作缓存?
    Flask框架Server和RequestHandler的爱恨纠缠
  • 原文地址:https://www.cnblogs.com/leihuazhe/p/7719539.html
Copyright © 2020-2023  润新知