在上一篇文章里,我们使用了基于事件传递的机制来对企业应用的子系统进行解耦,但是由于需要强制地继承或者实现一个广播事件的接口EventBrocast,实际上,就职责分离和功能单一的角度来看,前篇文章中的例子中,这个机制对OrderService侵入太大了,我们必须寻找更为有效的方法,不需要程序实现某个接口或继承某个超类来完成这个工作,这一切必须对具体程序完全透明,这个责任谁能承担呢,毫无疑问,历史的重担就落在了AOP身上 ;) 。下面我们来看看具体的实现:
OrderService已经实现,除了订单的处理,没有任何的职责,为了完成事件的广播,必须要有一个途径能够拦截到OrderService的所有方法调用,然后分析调用的语义(参数),并根据这些内容给广播出去。而恰好,AOP组织统一的接口MethodInterceptor可以完成这个功能。于是上篇文章的程序可以这样修改:
// 订单服务只负责做好自己的事
public class OrderService {
public Order saveOrder(Order order){
。。。。处理订单
。。。保存
}
}
而为了拦截任何的方法调用,则实现了拦截器EventBrocaster:
public class EventBrocaster extends LifeEventBrocast implements MethodInterceptor {
private List eventListeners;
public void setEventListener(List list){
this.eventListeners=list;
}
public List geteEventListeners(){
return eventListeners;
}
public Object invoke(MethodInvocation invoke) {
obj = invoke.proceed();// 执行被拦截的方法完成业务操作
Object[] params = invoke.getArguments();
Object param = params.length > 1 ? params : params[0];
Event le = new Event(param, eventType);
brocast(le);// 广播
}
}
事件侦听器:
public OrderEventListener implements EventListener{
private FinancialService financialService;
public void setFinancialService(FinancialService fs){
this.financialService=fs;
}
public void performed(Event e){
Order order =(Order) e.getObject();
financialService.createRequestOfMoney(order.getAmount());
}
}
然后,在Spring配置里将这些组件全部连接起来:
1.OrderService实现:
<bean id="orderServiceImpl" class="OrderService" autowire="byName">
</bean>
2. 声明OrderService代理:
<bean id="orderService" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target">
<ref local="orderServiceImpl"/>
</property>
<property name="interceptorNames"> <!--拦截器列表-->
<list>
<value>eventBrocaster</value>
</list>
</property>
<property name="singleton">
<value>true</value>
</property>
</bean>
3.事件广播拦截器
<bean id="eventBrocaster" class="com.wolfsquare.core.service.EventBrocaster" singleton="true">
<property name="lifecycleListeners">
<list>
<ref bean="orderEventListener"/>
</list>
</property>
</bean>
4.具体的财务子系统的侦听器实现与财务系统的通讯:
<bean id="orderEventListener" class="OrderEventListener" autowire="byName">
<propety name="financialService"><ref bean="financialService"/></property>
</bean>
这样,我们与具体实现无关的事件广播就做到了,聪明的朋友看到这里,肯定想到了拦截器方式不仅仅适用与事件广播,还可以实现事务的统一管理,事实上Spring的事务管理就是这样完成的,还可以实现权限的控制例如Acegi,简直有点象万能的胶水,呵呵。
从两篇文章的逐步探讨下,同一个机器,同一个虚拟机之内的数据通讯都可以实现了,那么异构系统和多虚拟机间的通讯又如何处理呢,于是ESB(企业服务总线)的概念就慢慢浮现出来了,不过这个不在本文探讨的范畴了,也许在不久的将来,我会补上这一篇。
(全文完)
分享到:
相关推荐
1. **MyBatis拦截器**:MyBatis提供了一种插件机制,即拦截器(Interceptor),它基于Java的动态代理,可以在SQL执行前或执行后进行干预。例如,我们可以创建一个自定义的拦截器,来实现特定的功能,如日志记录、...
MyBatis拦截器是基于Java的动态代理机制,通过实现`Interceptor`接口,我们可以定义拦截规则,然后在`intercept`方法中执行自定义逻辑。拦截器链是由多个拦截器组成,当执行一个SQL时,每个拦截器的`intercept`方法...
- 配置拦截器时,还可以定义特定的拦截规则,如哪些Action需要应用这个拦截器,或者在哪些情况下跳过这个拦截器。 4. **前端处理** - 在客户端,通常在表单提交时,将服务器生成的令牌作为一个隐藏字段一并发送。...
MyBatis拦截器是一种动态拦截MyBatis核心组件行为的组件,它是基于Java的动态代理机制实现的,可以拦截到MyBatis中执行的方法,比如Executor、StatementHandler、ParameterHandler和ResultSetHandler。拦截器允许...
为了解决这些问题,我们可以利用 Axios 的拦截器功能来实现请求的管理和取消。 Vue Axios 拦截器的常用功能之一就是取消重复请求。拦截器允许我们在请求发送前和响应返回后执行额外的操作。在本例中,我们将探讨...
124 8.5.2 拦截器的实现原理 124 8.5.3 Struts2的内置拦截器 124 8.5.4 拦截器的配置和使用 125 8.5.5 自定义拦截器 126 8.6 一个简单的Struts2应用 130 8.7 小结 140 第9章 JSF 141 9.1 JSF技术简介 141 9.1.1 JSF...
15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2...
在自动化推荐系统的设计中,作者陈利军引入了拦截器设置,这包括页面跳转拦截器和会话控制拦截器。页面跳转拦截器可以监测用户在网站上的行为,而会话控制拦截器则负责维护用户会话状态,两者均与中心处理模块相连,...
15.7.2 装配拦截器 15.7.3 异常处理 15.8 小结 第5篇 测试及实战 第16章 实战型单元测试 16.1 单元测试概述 16.1.1 为什么需要单元测试 16.1.2 单元测试之误解 16.1.3 单元测试之困境 16.1.4 单元测试基本概念 16.2...
### Java EE应用开发基础——第五章知识点概览 #### 5.1 Spring概述 - **定义**: Spring框架是由Rod Johnson创建的一个开源项目,... - 可以通过继承`Interceptor`接口来自定义拦截器类,并在`struts.xml`中进行配置。
- **依赖注入(Dependency Injection, DI)**: Spring 的核心功能之一,它允许通过构造函数、setter 方法或基于注解的方式注入依赖关系,从而简化了组件间的连接。 - **面向切面编程(Aspect-Oriented Programming, ...
通过实例分析,我们可以看到拦截器的实际应用。例如,在一个简单的安全验证场景中,服务提供者可以配置一个拦截器,检查调用者是否具有合法的身份凭证,只有验证通过后才允许继续服务调用。这样,拦截器可以用来实现...
`Policy`是一组规则,它定义了何时、何地以及如何应用拦截器。`Advice`则表示一个具体的行动,比如一个方法调用前后要执行的代码块。通过组合不同的策略和建议,你可以构建复杂的AOP场景。 教程中还会介绍如何使用...
综上所述,MyBatis通过预编译SQL、使用参数化、提供插件支持、动态SQL构造以及通过拦截器和业务层验证等方式,有效地解决了SQL注入问题,为Java应用提供了强大的数据库操作支持,并保证了系统的安全性。对于开发者来...
3. **拦截器实现**:在Mybatis-Plus中,我们可以创建一个自定义拦截器,注入租户ID到SQL语句中。当执行查询、插入、更新或删除操作时,拦截器会自动添加租户条件。 4. **实体类扩展**:在实体类中增加一个表示租户...
Enhancer提供了许多配置选项,如设置拦截器、指定构造函数等,使得我们可以灵活地控制生成的子类的行为。这在实现动态代理或AOP切面时非常有用。例如,在Spring AOP框架中,CGLib就是用来生成代理对象的技术之一。 ...
【标题】"maven构造spring+springmvc+mybatisplus的web项目"涉及的主要知识点是构建一个基于Maven的Web应用程序,其中整合了Spring、SpringMVC和MybatisPlus框架。下面将详细介绍这三个核心组件以及它们如何协同工作...
Java Web是基于Java技术构建Web应用程序的一种方式,它包括了Servlet、JSP(JavaServer Pages)、JavaBean、MVC设计模式等多个方面。 1. **Servlet**:Servlet是Java提供的一门用于开发动态Web应用的技术。它是一个...
PowerMock的核心功能在于其能够通过提供定制的类加载器和应用一些字节码操作技巧,实现对静态方法、构造方法、私有方法和final方法的模拟。例如,在进行单元测试时,有时候我们并不希望测试数据进入实际的数据库,...