zoukankan      html  css  js  c++  java
  • Spring lookup-method,replace-method,factory-method使用示例

        在这里会介绍如下知识点:

    1. factory-method
    2. factory-bean
    3. lookup-method
    4. replace-method

     

     factory-method

        在Spring中如果对一个bean的创建使用工厂方法模式就可以使用factory-method

    /**
     * factory-method  demo
     * @author zhangwei_david
     * @version $Id: FactoryMethodDemo.java, v 0.1 2015年7月8日 下午11:03:58 zhangwei_david Exp $
     */
    public class FactoryMethodDemo {
    
        public static Person getPerson() {
            return new Person() {
    
                @Override
                public String getSex() {
                    return "male";
                }
            };
        }
    }
    <bean id="male" class="com.cathy.demo.spring.FactoryMethodDemo"
    		factory-method="getPerson" />

     factory-bean

       在上一个示例中class指向的是一个工厂方法类,如果这个工厂方法类对多个bean中都有使用,可以通过factory-bean 进行优化处理

    /**
     *
     * @author zhangwei_david
     * @version $Id: FactoryBeanDemo.java, v 0.1 2015年7月8日 下午10:08:58 zhangwei_david Exp $
     */
    public class FactoryBeanDemo {
    
        public Man getMan() {
            return new Man();
        }
    
        public Person getPerson() {
            System.out.println("getPerson");
            return new Person() {
    
                @Override
                public String getSex() {
                    return "femal";
                }
            };
        }
    }
    <bean id="factoryBeanDemo" class="com.cathy.demo.spring.FactoryBeanDemo" />
    	<bean id="person" factory-bean="factoryBeanDemo" factory-method="getPerson" />

     lookup-method

                  在Spring中多数的bean都是单例的,但是如果有一个单例bean需要引用一个prototype bean怎么处理了,不可能每次都需要查询加载bean吧。在这样的场景下lookup-method可以很好的解决。

    /**
     *  lookup-method使用示例
     *  
     * @author zhangwei_david
     * @version $Id: LookupMethodDemo.java, v 0.1 2015年7月8日 下午2:55:38 zhangwei_david Exp $
     */
    public abstract class LookupMethodDemo {
        
        
        protected Man man = getMan();
    
        /**抽象方法**/
        public abstract Man getMan();
    
        public int getId() {
            return man.getId();
        }
    
    }
    /**
     *
     * @author zhangwei_david
     * @version $Id: Man.java, v 0.1 2015年6月7日 下午6:46:30 zhangwei_david Exp $
     */
    public class Man extends Person implements InitializingBean {
    
        private int id = (int) (Math.random() * 100);
    
        /**
         * @see com.cathy.demo.spring.Person#getSex()
         */
        @Override
        public String getSex() {
            return "Male";
        }
    
        /**
         * Getter method for property <tt>id</tt>.
         *
         * @return property value of id
         */
        public int getId() {
            return id;
        }
    
        /**
         * Setter method for property <tt>id</tt>.
         *
         * @param id value to be assigned to property id
         */
        public void setId(int id) {
            this.id = id;
        }
    
        /**
         * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
         */
        public void afterPropertiesSet() throws Exception {
            System.out.println(" 初始化 Man [id=" + getId() + "]");
        }
    
    }
    
    <bean id="lookupMethodDemo" class="com.cathy.demo.spring.LookupMethodDemo">
    		<lookup-method name="getMan" bean="man" />
    	</bean>
    	<bean id="man" class="com.cathy.demo.spring.Man" scope="prototype" />
    /**
     *
     * @author zhangwei_david
     * @version $Id: MySpringTest.java, v 0.1 2015年6月7日 下午5:50:50 zhangwei_david Exp $
     */
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = "classpath*:META-INF/spring/test-beans.xml")
    public class MySpringTest {
    
        @Autowired
        private LookupMethodDemo lookupMethodDemo;
    
        @Autowired
        private Man              man;
    
    
        @Test
        public void test() {
            System.out.println(man.getId());
            System.out.println(lookupMethodDemo.getId());
    
        }
    
    }
    

    测试的结果是:

     初始化 Man [id=4]
     初始化 Man [id=13]
     初始化 Man [id=48]
    48
    13

      replace-method

         我们知道在Spring中可以使用AOP增强一个方法也可以替换一个方法的功能,可是有不少人却不知道在Spring中还有更简单的方式,就是使用replece-method替换一个方法。

    /**
     *  一个方法替换的简单示例
     * @author zhangwei_david
     * @version $Id: ReplacMethodDemo.java, v 0.1 2015年7月8日 下午10:26:22 zhangwei_david Exp $
     */
    public class ReplaceMethodDemo {
    
        public String getName() {
            return "original";
        }
    
    }
    
    /**
     *
     * @author zhangwei_david
     * @version $Id: Replacer.java, v 0.1 2015年7月8日 下午10:27:18 zhangwei_david Exp $
     */
    public class Replacer implements MethodReplacer {
    
        /**
         * @see org.springframework.beans.factory.support.MethodReplacer#reimplement(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
         */
        public Object reimplement(Object obj, Method method, Object[] args) throws Throwable {
            return "replacer";
    
        }
    
    }
    
    <bean id="replacer" class="com.cathy.demo.spring.Replacer" />
    	<!-- 方法替换的demo -->
    	<bean id="replaceMethodDemo" class="com.cathy.demo.spring.ReplaceMethodDemo">
    		<replaced-method name="getName" replacer="replacer" />
    	</bean>

      通过调用replceMethodDemo.getName()的结果是:replacer

  • 相关阅读:
    49.把字符串转发为整数(python)
    48.不用加减乘除做加法(python)
    47.1+2+3+...+n(python)
    46.孩子们的游戏(python)
    45.扑克牌顺子(python)
    44.翻转单词序列(python)
    43.左旋转字符串(python)
    42.和为S的两个数字(python)
    41.和为S的连续整数序列(python)
    39.平衡二叉树(python)
  • 原文地址:https://www.cnblogs.com/wei-zw/p/8797754.html
Copyright © 2011-2022 走看看