8方法注入之替换方法实现
Spring
提供了一种替换方法实现的机制,可以让我们改变某个bean
某方法的实现。打个比方我们有一个bean
,其中拥有一个add()
方法可以用来计算两个整数的和,但这个时候我们想把它的实现逻辑改为如果两个整数的值相同则把它们相乘,否则还是把它们相加,在不改变或者是不能改变源码的情况下我们就可以通过Spring
提供的替换方法实现机制来实现这一要求。
替换方法实现机制的核心是MethodReplacer
接口,其中定义了一个reimplement ()
方法,我们的替换方法实现的主要逻辑就是在该方法中实现的,具体定义如下:
public interface MethodReplacer {
/**
* Reimplement the given method.
* @param obj the instance we're reimplementing the method for
* @param method the method to reimplement
* @param args arguments to the method
* @return return value for the method
*/
Object reimplement(Object obj, Method method, Object[] args) throws Throwable;
}
我们可以看到reimplement()
方法将接收三个参数,其中obj
表示需要替换方法实现的bean
对象,method
需要替换的方法,args
则表示对应的方法参数。针对前面打的比方,假设我们有如下这样一个类定义对应的bean
。
public class BeanA {
public int add(int a, int b) {
return a+b;
}
}
<bean id="beanA" class="com.app.BeanA"/>
如果我们需要替换add()
方法的实现为a
与b
相等时则相乘,否则就相加,则我们可以针对该方法提供一个对应的MethodReplacer
的实现类,具体实现如下所示。
public class BeanAReplacer implements MethodReplacer {
/**
* @param obj 对应目标对象,即beanA
* @param method 对应目标方法,即add
* @param args 对应目标参数,即a和b
*/
public Object reimplement(Object obj, Method method, Object[] args)
throws Throwable {
Integer a = (Integer)args[0];
Integer b = (Integer)args[1];
if (a.equals(b)) {
return a * b;
} else {
return a + b;
}
}
}
之后就需要在定义beanA
时指定使用BeanAReplacer
来替换beanA
的add()
方法实现,这是通过replaced-method
元素来指定的。其需要指定两个属性,name
和replacer
。name
用来指定需要替换的方法的名称,而replacer
则用来指定用来替换的MethodReplacer
对应的bean
。所以,此时我们的beanA
应该如下定义:
<bean id="beanAReplacer" class="com.app.BeanAReplacer"/>
<bean id="beanA" class="com.app.BeanA">
<replaced-method name="add" replacer="beanAReplacer"/>
</bean>
如果我们的MethodReplacer
将要替换的方法在对应的bean
中属于重载类型的方法,即存在多个方法名相同的方法时,我们还需要通过在replaced-method
元素下通过arg-type
元素来定义对应方法参数的类型,这样就可以区分需要替换的是哪一个方法。所以,针对上述示例,我们也可以如下定义:
<bean id="beanAReplacer" class="com.app.BeanAReplacer"/>
<bean id="beanA" class="com.app.BeanA">
<replaced-method name="add" replacer="beanAReplacer">
<arg-type match="int"/>
<arg-type match="int"/>
</replaced-method>
</bean>
对应方法名的方法只存在一个时,arg-type
将不起作用,即Spring
此时不会根据arg-type
去取对应的方法进行替换,或者换句话说就是当replaced-method
指定名称的方法只存在一个时,无论arg-type
如何定义都是可以的。
(注:本文是基于Spring4.1.0所写)
相关推荐
2. **setter 注入**:使用 setter 方法设置依赖对象。 DI 的使用减少了代码的耦合,提高了代码的可测试性和可维护性,使得替换或扩展依赖对象变得更加容易。 综上所述,Spring 框架凭借其全面的特性和灵活的设计,...
### Spring核心机制——依赖注入详解 #### 一、引言 Spring框架作为一款优秀的轻量级Java应用开发框架,其核心理念之一就是依赖注入(Dependency Injection, DI)。依赖注入不仅能够帮助开发者降低代码间的耦合度...
总的来说,Spring框架通过其IoC容器实现了对象的管理和依赖注入,带来了诸多好处,同时Eclipse作为强大的开发工具,为创建和管理Spring Web应用提供了便利。了解和掌握这些知识,对于提升Java开发效率和代码质量具有...
在Java开发中,Spring和Hibernate是两个非常重要的框架,Spring提供了全面的结构化和依赖注入功能,而Hibernate则是一个强大的对象关系映射(ORM)工具,使得Java开发者可以方便地操作数据库。本文将详细介绍如何在...
- **Spring Beans与依赖注入**:深入探讨Spring框架的核心概念之一——依赖注入,并介绍如何在Spring Boot应用中使用它。 - **使用@SpringBootApplication注解**:详细介绍该注解的作用及其实现原理。 #### 四、...
在Spring中,依赖注入主要通过构造器注入、属性注入或方法注入实现。依赖注入使得组件之间的耦合度降低,提高了代码的可读性和可维护性。 四、Spring Bean工厂与ApplicationContext 1. **BeanFactory**:...
综上所述,"Spring3.1.3 Ioc在Web容器中的建立"涵盖了Spring的核心特性之一——IoC,以及在Web环境下的具体配置和使用方法。这个过程涉及到Spring容器的初始化、bean的定义与依赖注入,以及Web应用的结构配置。通过...
标题 "STRUTS+SPRING" 提到的是两种在Java Web开发中广泛使用的框架——Struts和Spring。这两个框架在企业级应用开发中扮演着重要角色,尤其在构建MVC(Model-View-Controller)架构的应用程序时。下面将详细阐述...
这允许单元测试中轻松替换真实的`RantService`实现为Mock对象。 #### 单元测试Spring MVC控制器 为了有效地进行单元测试,可以通过以下几种方式: 1. **使用Mockito等库创建Mock对象**:通过创建`RantService`的...
Spring框架的核心特性之一是控制反转(Inversion of Control,IoC),这与依赖注入(Dependency Injection,DI)密切相关。这两个概念都是为了实现软件组件之间的松耦合,从而提高系统的可扩展性和可维护性。 控制...
首先,我们来理解Spring的核心概念——依赖注入。依赖注入是Spring中的关键设计模式,它允许组件之间的关系在运行时通过外部配置确定,而不是硬编码在组件内部。这样做的好处是提高了代码的可测试性和可维护性,因为...
### Spring 源码分析——设计模式篇 #### 一、引言 Spring框架作为Java企业级开发领域中不可或缺的一部分,其内部集成了多种设计模式,不仅有助于提高系统的可维护性和扩展性,还能够帮助开发者更好地理解和应用...
《Spring3.x企业应用开发实战》是在《精通Spring2.x——企业应用开发详解》的基础上,经过历时一年的重大调整改版而成的,本书延续了上一版本追求深度,注重原理,不停留在技术表面的写作风格,力求使读者在熟练使用...
《Spring框架中的beans配置文件详解——以spring-beans-3.0.xsd和3.1.xsd为例》 在Spring框架中,`spring-beans`是核心组件之一,它负责管理对象的生命周期和依赖关系。`spring-beans`的配置文件通常以`.xsd`为后缀...
在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...
Spring的两大核心特性——IoC(Inversion of Control,控制反转)和DI(Dependency Injection,依赖注入),使得应用程序各组件间的耦合度大幅降低,提高了系统的灵活性和可测试性。 #### 控制反转(IoC) 控制...