- 浏览: 1431569 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
luhouxiang:
写的很不错,学习了
Extjs 模块化动态加载js实践 -
kingkongtown:
如果想改成淘宝后台那样,可以在编辑器批量上传图片呢?
kissy editor 阶段体会 -
317966578:
兄弟我最近也在整jquery和caja 开放一些接口。在git ...
caja 原理 : 前端 -
liuweihug:
Javascript引擎单线程机制及setTimeout执行原 ...
setTimeout ,xhr,event 线程问题 -
辽主临轩:
怎么能让浏览器不进入 文档模式的quirks模式,进入标准的
浏览器模式与文本模式
由于一直以来小项目做的多,造成了轻后端重前端的恶果,结果后端现在还在使用陈旧的jsp,数据访问层重复代码也不少,近来看了下 spring in action决定对这一部分进行一些修改
1。原先架构
每个模块一个类,层层继承,形成模块功能链
public class Module { public void actionA(){} public void actionC(){} ..... } public class ModuleA extend Module{ public void actionA(){ Connection con=DB.getConnection(); try{ }catch(....){ logger.error(...); }finally{ con.close(); } } //other actions } public class ModuleB extends ModuleA{ public void actionB(){ } //other actions }
调用时,只需调用ModuleB的操作(继承最低层功能类,包含所有操作),
Module getModule() { return new ModuleB(); } getModule().action..(...);
一方面connection处理在各个方法冗余,另一方面那么当新增加模块时,有两个选择
1.三处源代码修改
public class Module { //added action } public class ModuleC extends ModuleB{ public void actionC(){ } //other actions } Module getModule() { return new ModuleC(); }
2.还是三处源代码修改
public class Module { //added action } public class ModuleB extends ModuleC{ public void actionB(){ } //other actions } public class ModuleC extends ModuleA{ public void actionC(){ } //other actions }
即关键为维护链状继承结构。
2.利用aop重构
利用spring的aop特性将connection创建过程抽离出来,利用aop前置将connection先创建出来保存在模块中,后置销毁成员变量connection。
1.首先修改基类,将连接做为成员变量:
public class Module { private Connection con; public void setConnection(Connection con){this.con=con;} public Connection getConnection(){return this.con;} public void actionA(){} // .. other actions }
其他模块数据库操作改变
public class ModuleA extends Module{ public void actionA(){ Connection con=this.getConnection(); //.. 数据库操作 //不用关闭,不用处理异常 } //other action }
在各个模块的操作中,不用关闭连接,也不用处理异常 ,将这些功能切面独立出来
2.创建 aspect
2.1 xml配置
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> <bean id="Op" class="ModuleB" scope="prototype"/> <bean id="DbOp" class="DbOp" /> <aop:config> <aop:aspect ref="DbOp"> <aop:pointcut id="DbOpPointcut" expression="execution(* Module*.action*(..)) and target(bean)" /> <aop:before method="prepareConnection" pointcut-ref="DbOpPointcut" arg-names="bean" /> <aop:after-returning method="closeConnection" pointcut-ref="DbOpPointcut" arg-names="bean" /> <aop:after-throwing method="exceptionHandle" pointcut-ref="DbOpPointcut" arg-names="bean" /> </aop:aspect> </aop:config> </beans>
其中Op指向继承最低层的模块对象(包含所有模块操作),对 Module*类的action*方法创建pointcut,并且给advise传递target参数,即module功能对象。
2.2 aspect
public class DbOp { static Logger logger = Logger.getLogger(DbOp.class); public void prepareConnection(Module impl) throws SQLException { Connection con = null; con =DB.getConnection(); impl.setConnection(con); logger.info("prepareConnection"); } public void closeConnection(Module impl) throws SQLException { Connection con = impl.getConnection(); con.close(); con = null; impl.setConnection(con); logger.info("closeConnection"); } public void exceptionHandle(Module impl) { Connection con = impl.getConnection(); if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } con = null; impl.setConnection(con); } logger.info("exceptionHandle"); } }
将创建连接,销毁连接,异常处理分离开,并将连接保存到模块功能对象 即可。
3.最后改变获取模块功能对象的方式
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); Module getModule(){ return (Module)ctx.get("Op"); }
这样的话以后添加新的模块,只需更改两处源码:
public class Module { //added action } public class ModuleC extends ModuleB{ public void actionB(){ } //other actions }
以及一处xml配置即可:
<bean id="Op" class="ModuleC" scope="prototype"/>
且代码更清晰易懂。
发表评论
-
continuation, cps
2013-09-12 16:49 2711起 随着 nodejs 的兴起,异步编程成为一种潮流 ... -
using mustache with spring mvc
2011-06-16 20:30 4657spring 基本不用介绍了,是目前最好的 IOC 容器了 ... -
备忘:使用 intellij idea 进行远程调试
2011-05-03 18:56 33539以前都是很土得打 log ,发现一篇关于 java 调试器架构 ... -
前后端编码传递
2010-10-21 00:12 1982背景: 关于编码是 BS 的开发是个大问题,包 ... -
javabean与attribute
2010-07-15 21:02 2370以前很忽视 javabean , ... -
JAVA学习路线图
2010-06-20 23:24 0最近论坛上看到好几个朋友都在问,如何学习 Java的问题, ... -
linux下定位java应用
2010-06-09 02:48 1379场景: java 应用不同于其它程序,在ps查看时程 ... -
java中的协变
2010-05-27 23:17 3309一个一直有点模糊的概念,记录一下,协变是指一个类型随着它关联的 ... -
验证码图片生成
2010-04-29 22:15 0<%@ page contentType="i ... -
struts2讲义
2009-11-07 11:53 0struts2讲义 -
xml transfer for beyond compare
2009-10-22 17:33 0xml transfer for beyond compare ... -
Digester 空白保留问题
2009-10-17 16:40 1921Digester 详细介绍 : apach ... -
Jsp - pageEncoding 解析
2009-09-29 22:28 2389pageEncoding 作为 Jsp page 指令 ... -
图解JVM在内存中申请对象及垃圾回收流程
2009-09-15 20:33 0http://longdick.ite ... -
javarebel
2009-09-11 22:23 0使用JavaRebel实现即时重载javaclass更改 ... -
mac java web开发配置备忘
2009-09-05 17:02 89基本上和linux配置差不多,mac 可算兼具 linux 命 ... -
10个让我去寻找比Java更好的语言的理由
2009-08-26 13:02 0别误会我. 在我的职业生涯中我写了无数的Java代码,我当 ... -
生僻用法:finally and return
2009-08-26 12:55 1447本质上还是 reference 与 primitive val ... -
事件人工详情整理Pattern
2009-08-09 16:13 0事件人工详情整理Pattern -
VJO 简要学习笔记
2009-07-16 18:47 2405VJO 简单来说是一套ebay (已经在java这 ...
相关推荐
演示了使用spring aop拦截方法进行数据验证,并结合注解实现
本文通过一个Web Service访问的实例,具体描述了SOA应用中所遇到的一系列具体问题,并描述如何利用IoC和AOP等技术进行代码重构,构建更加结构良好、灵活的SOA应用。综上所述,我们可以看到:使用IoC框架来实现对象的...
java springAOP实现数据字典
spring boot AOP注解方式实现多数据源整合(从零开始搭建框架到配置多数据源实践小例子)
用springboot 集成mybatis多数据源,用aop实现的动态切换,支持事务,不会使aop动态切换失效。注意:此代码不涉及分布式事务,如果需要分布式事务 需要采取其他方案。
通过SpringAop实现多数据源的动态切换 并采用Druid连接池,可扩展继续增加数据库配置。
spring jdbcTemplate 多数据源切换数据库操作,junit测试。
NULL 博文链接:https://incan.iteye.com/blog/296563
SpringMVC利用AOP实现自定义注解记录日志
使用SpringAop使用Oracle数据权限控制
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
AOP正在成为软件开发的下一个圣杯。使用AOP,你可以将处理aspect的代码注入主程序, 通常主程序的主要目的并不在于处理这些aspect。 AOP可以防止代码混乱。 为了理解AOP 如何做到这点,考虑一下记日志的工作。日志...
Spring+SpringMvc+MybatisPlus实现多数据源切换、利用自定义Aop注解,只需要在需要切换数据库的方法上加上注解即可实现、极大避免了代码冗余。
AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一...下面这篇文章主要给大家介绍了关于利用C#实现AOP常见的几种方法,需要的朋友可以参考借鉴,下面来一起看看吧。
最近一直在研究怎么更好更便捷的来保存异常,传统的log4j都是对每个类进行异常每个控制层的方法都有些try,catch感觉很麻烦,于是,自己用AOP和注解的方式结合log4j来实现统一的异常保存,废话不多说,上传项目。
spring mvc利用aop日志实现对controller层的拦截
Spring Boot AOP权限控制模块开发,利用AOP功能完成属于自己的权限模块开发
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等。AOP似乎一时之间成了潮流。Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP...
SpringBoot使用AOP完成多数据源切换,下载后导入即可使用,JDK1.8