- 浏览: 523631 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
rgqancy:
终于明白为啥XML里要带jdbcType=XXXX了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
rzh0001:
Thanks a lot
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
guji528:
学习了,谢谢
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
AKka:
彻底清楚这个错误的原因了。向楼主学习了。
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201 -
远去的渡口:
武汉小吃,我最爱热干面和鸭脖,想念啊~~
过年时候还学习编程, ...
过年的心情
在我工作这几年里,spring aop 用得最多的有两点
1 事务通过aop来配置
2 判断service 或者dao 层 运行时间
那么原理是怎么样的呢? 我也没有想去细致的理解
首先 我们想实现一个功能
请看如下的类:
2 添加代理类来绑定接口
代理类首先 需要实现 InvocationHandler
所以 定义个代理类
ok ! 代理类写好了 我们需要写意个测试类 :
运行结果如下:
2013-02-15 17:26:18,844 INFO main com.aop.HelloProxy:invoke(36) - I am invoking starting
Hello come on
2013-02-15 17:26:18,847 INFO main com.aop.HelloProxy:invoke(38) - I am invoking ending
另外在mybatis 里 当我们在log4j里配置好 输出的时候 比如:
就会打印响应的sql ,在mybatis里 涉及到的类是: ConnectionLogger
它的调用方式是:
1 事务通过aop来配置
2 判断service 或者dao 层 运行时间
那么原理是怎么样的呢? 我也没有想去细致的理解
首先 我们想实现一个功能
请看如下的类:
packagecom.aop; /** * Created with IntelliJ IDEA. * User: zhangyong * Date: 13-2-11 * Time: 下午10:23 * To change this template use File | Settings | File Templates. */ publicinterfaceIHello { publicvoidsayHello(); } 1111 实现类如下: packagecom.aop.impl; importcom.aop.IHello; importjava.lang.reflect.Proxy; /** * Created with IntelliJ IDEA. * User: zhangyong * Date: 13-2-11 * Time: 下午10:24 * To change this template use File | Settings | File Templates. */ publicclassIHelloImplimplementsIHello { @Override publicvoidsayHello() { System.out.println("Hello come on"); } }
2 添加代理类来绑定接口
代理类首先 需要实现 InvocationHandler
所以 定义个代理类
packagecom.aop; importorg.apache.log4j.Logger; importjava.lang.reflect.InvocationHandler; importjava.lang.reflect.Method; importjava.lang.reflect.Proxy; importjava.sql.Connection; /** * hello的代理类 * User: zhangyong * Date: 13-2-11 * Time: 下午10:26 * To change this template use File | Settings | File Templates. */ publicclassHelloProxyimplementsInvocationHandler { privatestaticLogger logger = Logger.getLogger(HelloProxy.class); privateIHello hello; publicHelloProxy(IHello hello) { this.hello = hello; } publicstaticIHello newInstance(IHello hello) { InvocationHandler handler =newHelloProxy(hello); ClassLoader classLoader = IHello.class.getClassLoader(); return(IHello) Proxy.newProxyInstance(classLoader,newClass[]{IHello.class}, handler); } @Override publicObject invoke(Object proxy, Method method, Object[] args)throwsThrowable { logger.info("I am invoking starting"); Object returnObj = method.invoke(hello, args); logger.info("I am invoking ending"); returnreturnObj; } }
ok ! 代理类写好了 我们需要写意个测试类 :
packagecom.aop; importcom.aop.impl.IHelloImpl; importorg.apache.commons.logging.Log; importorg.apache.commons.logging.LogFactory; importjava.sql.Connection; /** * 测试aop * User: zhangyong * Date: 13-2-11 * Time: 下午10:25 * To change this template use File | Settings | File Templates. */ publicclassTestAop { privatestaticfinalLog log = LogFactory.getLog(Connection.class); publicstaticvoidmain(String[] args) { IHello hello = HelloProxy.newInstance(newIHelloImpl()); hello.sayHello(); } }
运行结果如下:
2013-02-15 17:26:18,844 INFO main com.aop.HelloProxy:invoke(36) - I am invoking starting
Hello come on
2013-02-15 17:26:18,847 INFO main com.aop.HelloProxy:invoke(38) - I am invoking ending
另外在mybatis 里 当我们在log4j里配置好 输出的时候 比如:
log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG
就会打印响应的sql ,在mybatis里 涉及到的类是: ConnectionLogger
package org.apache.ibatis.logging.jdbc; import org.apache.ibatis.logging.Log; import org.apache.ibatis.logging.LogFactory; import org.apache.ibatis.reflection.ExceptionUtil; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.Statement; /** * Connection proxy to add logging 添加日志的代理(好方法) */ public class ConnectionLogger extends BaseJdbcLogger implements InvocationHandler { private static final Log log = LogFactory.getLog(Connection.class); private Connection connection; private ConnectionLogger(Connection conn) { super(); this.connection = conn; if (log.isDebugEnabled()) {//在log4j中配置 log.debug("ooo Connection Opened"); } } public Object invoke(Object proxy, Method method, Object[] params) throws Throwable { try { if ("prepareStatement".equals(method.getName())) { PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params); stmt = PreparedStatementLogger.newInstance(stmt, (String) params[0]); return stmt; } else if ("prepareCall".equals(method.getName())) { PreparedStatement stmt = (PreparedStatement) method.invoke(connection, params); stmt = PreparedStatementLogger.newInstance(stmt, (String) params[0]); return stmt; } else if ("createStatement".equals(method.getName())) { Statement stmt = (Statement) method.invoke(connection, params); stmt = StatementLogger.newInstance(stmt); return stmt; } else if ("close".equals(method.getName())) { if (log.isDebugEnabled()) { log.debug("xxx Connection Closed"); } return method.invoke(connection, params); } else { return method.invoke(connection, params); } } catch (Throwable t) { Throwable t1 = ExceptionUtil.unwrapThrowable(t); log.error("Error calling Connection." + method.getName() + ':', t1); throw t1; } } /** * Creates a logging version of a connection * * @param conn - the original connection * @return - the connection with logging */ public static Connection newInstance(Connection conn) { InvocationHandler handler = new ConnectionLogger(conn); ClassLoader cl = Connection.class.getClassLoader(); return (Connection) Proxy.newProxyInstance(cl, new Class[]{Connection.class}, handler); } /** * return the wrapped connection * * @return the connection */ public Connection getConnection() { return connection; } }
它的调用方式是:
/** 根据日志级别 封装connection 若是DEBUG级别 则封装log **/ private Connection wrapConnection(Connection connection) { if (log.isDebugEnabled()) { return ConnectionLogger.newInstance(connection); } else { return connection; } }
发表评论
-
四位计算机的原理及其实现
2015-09-05 19:23 897你是否想过,计算机为什么会加减乘除?或者更直接一点,计算机的原 ... -
ubuntu13.04安装mysql5.6RPM包1、使用的安装包MySQL-5.6.12-2.l
2014-11-20 23:08 980ubuntu13.04安装mysql5.6 RPM包 1、 ... -
字典树相关代码
2014-08-10 18:21 969package com.myway.study; i ... -
两有序数组求交集
2014-05-01 00:27 1027package com.myway.study; i ... -
JVM垃圾收集器异同
2014-04-22 09:48 1212VM 垃圾收集器有3类,这里主要介绍我们常用的 并行和并发收集 ... -
idea 11 如何实现热部署
2014-02-17 13:37 987idea 如何配置 热部署呢? 如图: 然后配置 t ... -
java位操作符总结
2013-08-04 20:42 897二进制负数以它正值的 ... -
快速排序简要算法
2013-07-21 22:21 1072package math; import jav ... -
memcached安装
2013-03-10 09:32 4811今天 ,心血来潮 想安装下memcached 先给自己测试一下 ... -
URL编码以及GET和POST提交乱码解决方案
2012-09-14 16:59 16391. 什么是URL编码。 ... -
Struts2 IF 判断 SESSION值
2012-08-16 15:12 1151<s:if test="ticke ... -
@me 如何处理
2012-07-28 22:37 1126红薯 分享了这个代码 ,我觉得很好 在这个社区与大家分享 。 ... -
mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201
2012-07-27 22:59 161515前天遇到一个问题 异常显示如下: 引用 Exception i ... -
猜测 javaye的分页设计
2012-07-05 21:32 1080非常喜欢javaeye的分页 ,自己也写了一个 按照逻辑测试了 ... -
java控制事务级别
2012-06-18 20:40 1128JDBC事务并发产生的问题和事务隔离级别 原子操作使用事务,一 ... -
ibatis / mybatis 存储过程调用 区别 以及例子
2012-06-11 21:16 1532ibatis: 如下: xml配置文件: 请看 ... -
java timerTask timer分析
2012-06-07 20:37 1527首先看一看 timer timerTask如何调用 ? ... -
MapWrapper 学习
2012-01-04 16:25 1500MetaObject 有一个 setValue方法 这个方 ... -
mybatis 学习
2011-12-24 22:59 2383这篇博客是我学习mybatis的心得。也是对自己的鞭策。 这些 ... -
struts2
2011-12-08 15:50 1564struts2 的web 项目中为了方便的编写jsp, ...
相关推荐
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
展示了java aop原理 展示了java aop原理
Spring AOP面向方面编程原理:AOP概念,主要介绍面向对象的概念及原理,及作者的一些理解。
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
spring中动态代理机制的实现原理及AOP实现原理,JDK的反射,cglib类。
spring ioc容器初始化流程图 spring ioc容器依赖注入流程图 spring aop实现原理流程图
Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理Spring AOP面向方面编程原理
为了说明Spring的AOP原理,本人使用代理模式中的动态代理完成演示AOP编程的原理的演示。相信,如果你耐心看完整个程序(几乎一行注释一行代码),那么你对Spring这个东西就不是觉得有什么神秘了! 阅读对象:凡是喜爱...
用java项目写的aop的工作原理形成,动态生成代理类和静态生成代理类,用到了日志Logger
浅谈 Spring 原理 透析,ioc aop
aop原理使用demo
代理模式与动态代理--Spring AOP原理.doc
Spring 框架之 AOP 原理剖析.html 抓下来打包成了HTML文件, 方便离线观看
介绍Spring AOP的原理,还有例子
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
Spring Aop的底层实现技术 --- Jdk动态代理原理 很不错的一篇文章
AOP原理1
java AOP实现原理.jpg
SpringAOP原理及拦截器.pdf