`
zhangwei_david
  • 浏览: 476106 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 

3
1
分享到:
评论

相关推荐

    深入理解Spring中的Lookup(方法注入)

    &lt;lookup-method name="getClassB" bean="classB"/&gt; ``` Java配置: ```java @Configuration public class AppConfig { @Bean @Scope("prototype") public ClassB classB() { return new ClassB(); } @...

    RevitLookup-2020.0.0.4.zip

    RevitLookup-2020.0.0.4.zip文件包含了2020版本的RevitLookup安装包,版本号为2020.0.0.4,提供了一个编译好的MSI安装文件,使得安装过程变得简单快捷。 首先,让我们详细了解一下RevitLookup的功能和用途。Revit...

    spring-beans-3.0.xsd

    在`&lt;bean&gt;`元素中,`lookup-method`和`replaced-method`属性的引入,使得在运行时动态查找或替换bean的方法成为可能,这是对AOP(面向切面编程)的一种补充,提供了更细粒度的控制。 除此之外,`&lt;util&gt;`命名空间在...

    RevitLookup-dev

    为了使用RevitLookup-dev,用户通常需要有一定的编程基础,尤其是对于.NET框架和Revit API的理解。Revit API提供了丰富的功能,如创建自定义族、自动化工作流程以及与其他应用程序集成,而RevitLookup-dev则简化了这...

    RevitLookup-2021.0.0.13

    RevitLookup-2021.0.0.13是该插件的一个特定版本,适用于Revit 2021软件。 Revit是Autodesk公司推出的一款三维建筑设计和施工软件,广泛应用于建筑、结构和MEP(机械、电气、管道)工程领域。Revit二次开发是指利用...

    RevitLookup-2016.0.0.6 已编译 直接使用

    revit开发必备工具 本包中是已经编译过的文件,可以直接使用 ...编辑其中RevitLookup.dll 路径为编译路径 C:\RevitLookup-2016.0.0.6\CS\bin\Debug\RevitLookup.dll 重启revit: 即可在菜单栏看到工具

    RevitLookup-2017.0.0.5

    RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5RevitLookup-2017.0.0.5

    Spring-Data-MongoDB3.2

    使用示例** 例如,定义一个UserRepository接口: ```java public interface UserRepository extends MongoRepository, String&gt; { User findByUsername(String username); } ``` Spring Data MongoDB会自动为这...

    前端开源库-nsq-lookup-jc

    `nsq-lookup-jc`库的使用,首先需要确保你已经部署了nsqlookupd和nsqd。部署完成后,开发者可以利用这个库在前端应用程序中查找并连接到提供所需服务的nsqd节点。这个库提供了API接口,使得前端应用可以方便地查询...

    spring-jdbc-4.2.xsd.zip

    在实际开发中,`spring-jdbc-4.2.xsd`的使用方式通常是将其引入到Spring的配置文件中,例如: ```xml &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=...

    PyPI 官网下载 | drf-multi-lookup-0.0.14.tar.gz

    标题中的"PyPI 官网下载 | drf-multi-lookup-0.0.14.tar.gz"表明这是一个从Python Package Index (PyPI)官方下载的软件包,名为`drf-multi-lookup`,版本为0.0.14,且以tar.gz格式压缩。这个包可能是针对Python...

    RevitLookup - 2017

    RevitLookup - 2017 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2017下即可

    RevitLookup - 2016

    RevitLookup - 2016 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2016下即可

    RevitLookup-2019源码

    RevitLookup-2019源码是针对Revit 2019版本的源代码,允许开发者查看和分析其内部运作机制。 源代码的获取对于开发者来说至关重要,因为它提供了直接编译和修改项目的机会。当你下载了"RevitLookup-2019.0.0.6"这个...

    Python库 | iso3_lookup-0.3.0-py3-none-any.whl

    资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:iso3_lookup-0.3.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    PyPI 官网下载 | drf-multi-lookup-0.0.19.tar.gz

    《PyPI上的drf-multi-lookup-0.0.19.tar.gz:Python库与分布式系统集成解析》 在IT领域,Python作为一种强大且灵活的编程语言,被广泛应用于各种项目,尤其是Web开发。PyPI(Python Package Index)是Python开发者...

    RevitLookup-2016.zip

    该压缩包“RevitLookup-2016.zip”包含的是RevitLookup的源代码,版本号为2016.0.0.13。这意味着它已经过时,因为Revit现在已经更新到了更高版本,但仍然对那些使用Revit 2016或需要研究旧版本插件的开发者具有价值...

    lookup-dns-cache:通过避免线程池并为特定主机名使用DNS TTL缓存来加速nodejs`dns.lookup`方法的实现

    lookup-dns- dns.lookup替换dns.lookup标准方法的DNS缓存超级简单易用const request = require ( 'request' ) ;const { lookup } = require ( 'lookup-dns-cache' ) ;// With "request" modulerequest ( { url : '...

    RevitLookup-2018.0.0.8

    RevitLookup - 2018 的 源码,需要自己编译 用法:将RevitLookup.addin和RevitLookup.dll放到C:\ProgramData\Autodesk\Revit\Addins\2018下即可

    Python库 | spacy_lookup-0.0.5-py2.py3-none-any.whl

    - 要安装这个库,用户可以使用pip,命令通常是`pip install spacy_lookup-0.0.5-py2.py3-none-any.whl`,前提是在Python环境中已经安装了`spaCy`库。 - 安装完成后,用户可以在自己的代码中导入`spacy_lookup`,并...

Global site tag (gtag.js) - Google Analytics