zoukankan      html  css  js  c++  java
  • spring-第六篇之创建bean的3种方式

    1、创建bean的方式有3种:

        1》使用构造器创建bean,即设值注入、构造注入本质都是使用bean的构造器创建bean的。

        2》使用静态工厂方法创建bean。

        3》调用实例工厂方法创建bean。

    2、使用静态工厂方法创建bean

         使用静态工厂方法创建bean实例,<bean.../>元素需要指定如下两个属性:

             class:值为静态工厂类

             factory-method:该属性指定静态工厂方法生产bean实例。如果静态工厂方法需要参数,则使用<constructor-arg.../>元素传入。

         举个例子:

         

         Being.java

    package com.lfy.bean;
    
    public interface Being {
      public void testBeing();
    }

        Cat.java

    package com.lfy.impl;
    
    import com.lfy.bean.Being;
    
    public class Cat implements Being {
    
        private String msg;
        
        public void setMsg(String msg) {
            this.msg=msg;
        }
        
        @Override
        public void testBeing() {
            System.out.println(msg+",猫喜欢吃老鼠");
    
        }
    
    }

         Dog.java

    package com.lfy.impl;
    
    import com.lfy.bean.Being;
    
    public class Dog implements Being {
    
        private String msg;
        
        public void setMsg(String msg) {
            this.msg=msg;
        }
        
        @Override
        public void testBeing() {
            System.out.println(msg+",狗爱啃骨头");
        }
    
    }

         BeingFactory.java

    package com.lfy.factory;
    
    import com.lfy.bean.Being;
    import com.lfy.impl.Cat;
    import com.lfy.impl.Dog;
    
    /**
     * 静态工厂类
     * @author lfy
     *
     */
    public class BeingFactory {
        
       //返回Being实例的静态工厂方法
       //arg参数决定返回哪个Being类的实例
       public static Being getBeing(String arg) {
           
           if(arg.equalsIgnoreCase("dog")) {
               return new Dog();
           }else {
               return new Cat();
           }
       }
    }

         beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
          <!-- 一旦为<bean.../>元素指定了factory-method属性,spring就不再调用构造器来创建bean实例 -->
          <bean id="dog" class="com.lfy.factory.BeingFactory" factory-method="getBeing">
             <!-- 配置静态工厂方法的参数  -->
             <constructor-arg value="dog"/>
             <property name="msg" value="我是狗"/>
          </bean>
          <bean id="cat" class="com.lfy.factory.BeingFactory" factory-method="getBeing">
             <!-- 配置静态工厂方法的参数  -->
             <constructor-arg value="cat"/>
             <property name="msg" value="我是猫"/>
          </bean>
    </beans>

         SpringTest.java

    package com.lfy.main;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.lfy.bean.Being;
    import com.lfy.impl.Cat;
    import com.lfy.impl.Dog;
    
    /**
     * 2、使用静态工厂方法创建bean
     * @author lfy
     *
     */
    public class SpringTest {
    
        public static void main(String[] args) {
            ApplicationContext ctx=new ClassPathXmlApplicationContext("beans.xml");
            Being b1=ctx.getBean("dog", Dog.class);
            b1.testBeing();
            Being b2=ctx.getBean("cat", Cat.class);
            b2.testBeing();
        }
    
    }

         运行结果:

    3、调用实例工厂方法创建bean

        实例工厂方法与静态工厂方法只有一点不同:调用静态工厂方法只需要工厂类即可,而实例工厂方法则需要工厂实例。

        配置实例工厂方法与静态工厂方法也只有一点不同:配置静态工厂方法使用class指定静态工厂类,而配置实例工厂方法则使用factory-bean指定工厂实例。

        使用实例工厂方法创建bean实例,<bean.../>元素需要指定如下两个属性:

             factory-bean:该属性值为工厂bean的id。

             factory-method:该属性指定实例工厂的工厂方法。如果实例工厂方法需要参数,则使用<constructor-arg.../>元素传入。

         以前面的静态工厂方法例子进行些许的修改:

         BeingFactory.java的getBeing(...)的static属性去掉,则得到的是实例工厂方法

    package com.lfy.factory;
    
    import com.lfy.bean.Being;
    import com.lfy.impl.Cat;
    import com.lfy.impl.Dog;
    
    /**
     * 静态工厂类
     * @author lfy
     *
     */
    public class BeingFactory {
        
       //返回Being实例的静态工厂方法
       //arg参数决定返回哪个Being类的实例
       public Being getBeing(String arg) {
           
           if(arg.equalsIgnoreCase("dog")) {
               return new Dog();
           }else {
               return new Cat();
           }
       }
    }

          修改beans.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- spring配置文件的根元素,使用spring-beans-4.0.xsd语义约束 -->
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.springframework.org/schema/beans"
           xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
           
          <bean id="beingFactory" class="com.lfy.factory.BeingFactory"/>
          
          <bean id="dog" factory-bean="beingFactory" factory-method="getBeing">
             <constructor-arg value="dog"/>
             <property name="msg" value="我是狗"/>
          </bean>
          
          <bean id="cat" factory-bean="beingFactory" factory-method="getBeing">
             <constructor-arg value="cat"/>
             <property name="msg" value="我是猫"/>
          </bean>
    </beans>

        运行结果与静态工厂方法的一致。

  • 相关阅读:
    Datawhale编程实践(LeetCode 腾讯精选练习50)Task2
    Datawhale编程实践(LeetCode 腾讯精选练习50)Task1
    关于深度学习中样本权重取0的问题
    对多维numpy数组使用random.shuffle的问题
    Ubuntu18.04LTS左上角光标闪烁原因之一:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver.
    pycharm 报错ImportError: could not import module 'PySide2.QtWidgets'
    pyinstaller 打包pyside2项目遇到plugins window问题
    git pull的时候出错: Git Couldn't reserve space for cygwin's heap
    angularjs鼠标移入移出实现显示隐藏
    gulp编译出现Cannot find module 'internal/util/types'——node环境的变更
  • 原文地址:https://www.cnblogs.com/ZeroMZ/p/11328186.html
Copyright © 2011-2022 走看看