- 浏览: 948474 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (423)
- mysql (37)
- hibernate (3)
- struts (9)
- spring (33)
- dom4j (2)
- junit (0)
- exception (1)
- 随笔杂谈 (12)
- google app engine (1)
- XMPP (1)
- OAuth安全授权 (1)
- 版本控制 (8)
- 心情感悟 (0)
- core java (19)
- log4j (7)
- jquery (12)
- javascript (10)
- 网站性能优化及工具 (11)
- 服务器架设配置等 (38)
- EXT (4)
- 正则表达式 (5)
- 日志统计分析 (2)
- htmlparse (4)
- httpclient (5)
- java随笔 (5)
- dhtmlxtree (1)
- freemarke (5)
- memcached (6)
- javamail (5)
- Linux命令 (10)
- 应用监控cpu web jdbc等 (4)
- jmagick (9)
- 第三方缓存策略 (9)
- ORM (2)
- hadoop (2)
- 大数据量处理 (8)
- 经典 (1)
- 权限设计 (1)
- andriod (1)
- mybatis (12)
- redis (24)
- 数据结构_算法 (5)
- 分布式系统 (1)
- php (1)
- 网络编程 (3)
- 服务器部署 (3)
- ios (2)
- IM (23)
- mina (1)
- 视讯和语音 (1)
- 代码生成 (1)
- 架构 (4)
- 建模工具 (1)
- oracle (4)
- solr (10)
- 构建工具 (7)
- html5 (1)
- nginx (5)
- css (1)
- 大数据-分布式 (2)
- 设计模式 (2)
- mq (2)
- jvm调优 (8)
- 并发编程 (2)
- 搜索引擎 (1)
- UML (2)
最新评论
-
天使建站:
jquery获取网页里多选框checkbox选中项的值的方法及 ...
JS jQuery分别获取选中的复选框值 -
abao1:
发现一个小问题 sortAndSave方法中的for循环 第二 ...
完整java实现外部排序 -
西巴拉古呀那:
Kafka分布式消息系统实战(与JavaScalaHadoop ...
消息系统kafka介绍 -
kafodaote:
Kafka分布式消息系统实战(与JavaScalaHadoop ...
消息系统kafka介绍 -
成大大的:
Kafka分布式消息系统实 ...
消息系统kafka介绍
在开发基于 Spring 的应用的过程中碰到了一个让我困惑了好久的问题,我在一个 Service 类的 doSomething1() 方法中通过 首先,来创建一个需要代理的接口:
this.doSomething2(); 语句调用了同一个类中的 doSomething2 方法,运行时通过调试发现 doSomething1 方法的执行前后正常地执行了自定义的 around 装备,但是在 doSomething2 方法执行前后并未如我所期望的那样执行自定义的 around advice 。今天终于恍然大悟,把它当作笔记写下来。Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的;二是基于 CGLIB 技术而实现的。今天的目标是探索基于 JDK Dynamic Proxy 的动态代理。首先来看看如何自己动手实现一个对 Service Bean 对象的动态代理。为了能够更清楚地看到 Spring AOP 动态代理的本质,我决定不使用 JDK 中提供的 Dynamic Proxy API,就使用最普通的 java 代码来模拟一个动态代理实例。package demo.interf;
public interface ICustomerService {
public void doSomething1();
public void doSomething2();
}
然后就是具体服务类:
package demo.interf.impl; import demo.interf.ICustomerService; public class CustomerServiceImpl implements ICustomerService { public void doSomething1() { System.out.println("Inside CustomerServiceImpl.doSomething1()"); doSomething2(); } public void doSomething2() { System.out.println("Inside CustomerServiceImpl.doSomething2()"); } }下面我们就来模拟动态生成代理类的过程,若使用 JDK Dynamic Proxy,这一过程是在运行时进行的。
CustomerServiceImpl 类对象的代理类:
package demo.interf.impl; import demo.interf.ICustomerService; public class CustomerServiceProxy implements ICustomerService { private ICustomerService customerService; public void setCustomerService(ICustomerService customerService) { this.customerService = customerService; } public void doSomething1() { doBefore(); customerService.doSomething1(); doAfter(); } public void doSomething2() { doBefore(); customerService.doSomething2(); doAfter(); } private void doBefore() { // 例如,可以在此处开启事务 System.out.println("do some important things before..."); } private void doAfter() { // 例如,可以在此处提交或回滚事务、释放资源等等 System.out.println("do some important things after..."); } }
使用代理对象调用业务逻辑操作的客户端程序:
package test; import demo.interf.ICustomerService; import demo.interf.impl.CustomerServiceImpl; import demo.interf.impl.CustomerServiceProxy; public class TestProxy { public static void main(String[] args) { // 创建代理目标对象。对于Spring来说,这一工作 // 是由Spring DI容器完成的。 ICustomerService serviceProxyTarget = new CustomerServiceImpl(); // 创建代理对象。对于Spring来说,这一工作 // 也是由Spring DI容器完成的。 CustomerServiceProxy serviceProxy = new CustomerServiceProxy(); serviceProxy.setCustomerService(serviceProxyTarget); ICustomerService serviceBean = (ICustomerService) serviceProxy; // 调用业务逻辑操作 serviceBean.doSomething1(); } }好了,完成了。现在以调试方式运行这个应用,你会发现在 doSomething1() 中调用 doSomething2() 方法的时候并未去执行CustomerServiceProxy 类的 doBefore()、doAfter() 方法。再来看看这句关键代码:doSomething2(); 把它隐含的意思也表达出来吧:this.doSomething2(); 哦,我明白了,在 CustomerServiceImpl 类中 this 关键字表示的是当前这个CustomerServiceImpl类的实例。那程序当然就会去执行 CustomerServiceImpl 类中的 doSomething2() 方法了,而不会去执行 CustomerServiceProxy 类中的 doSomething2() 方法!!
在使用 Spring AOP 的时候,我们从 IOC 容器中获取的 Service Bean 对象其实都是代理对象,而不是那些 Service Bean 对象本身,也就是说获取的并不是被代理对象或代理目标。当我在自己的 Service 类中使用 this 关键字嵌套调用同类中的其他方法时,由于 this 关键字引用的并不是该 Service Bean 对象的代理对象,而是其本身,故 Spring AOP 是不能拦截到这些被嵌套调用的方法的。
发表评论
-
各种数据库(oracle、mysql、sqlserver等)在Spring中数据源的配置和JDBC驱动包
2013-07-16 13:09 2826在开发基于数据库的应 ... -
springmvc rest框架搭建中遇到的问题-xml转换错误
2013-01-18 11:26 2002.bean to xml显示的xml不是我往Model ... -
spring3.5 mvc json view bug MappingJacksonJsonView
2013-01-18 11:27 1540在返回单一model的json的时候。 MappingJa ... -
Spring MVC的多视图解析器配置及与Freemarker的集成
2013-01-18 11:27 3682http://my249645546.iteye.com/ ... -
xStream完美转换XML、JSON
2013-01-17 16:02 1256http://www.cnblogs.com/hoojo/a ... -
SpringMVC 中整合JSON、XML视图一
2013-01-17 16:01 1371http://www.cnblogs.com/hoojo/a ... -
Spring MVC 之 视图解析器ResourceBundleViewResolver
2013-01-17 10:45 1276http://blog.csdn.net/q34982 ... -
spring3mvc自定义多视图解析器
2013-01-17 10:41 1662使用视图名后缀来判断选择相应的视图解析器自定义一个视图解析器 ... -
spring3.0.6 使用context:property-placeholder载不进属性
2012-12-15 14:43 1376我用spring3.0.6+mybatis3.0.6+myba ... -
Spring定时任务的多种使用方法总结
2012-10-18 09:48 1729这里使用的是Spring2.5,需要的jar包:spring. ... -
Spring3.0 + 自定义注解实现操作日志记录功能
2012-03-12 09:34 1491最近项目组长分配给我一个任务,让我完成一个操作日志的管理功能。 ... -
spring mvc例子
2012-03-11 11:35 2073使用拦截器 和Struts2一样,Spring MVC也可以 ... -
在 Spring Bean 內取得 HttpServletRequest
2011-10-11 16:13 1227使用 Java 去開發 Web 應用程式時,大部份時候都會使用 ... -
spring3+freemark自定义标签
2011-10-09 18:27 2750<bean id="viewResolver& ... -
OpenSessionInViewFilter作用及配置
2011-06-15 10:31 1335摘自:http://www.yybean.com/opense ... -
spring httpinvoke 例子
2011-04-21 17:15 1204http://ajava.org/course/open/11 ... -
Spring基于注解的缓存配置--EHCache AND OSCache
2011-04-02 23:38 2341本文将构建一个普通工程来说明spring注解缓存的使用方式,关 ... -
使用 ActiveMQ 示例
2011-03-30 17:38 1366企业中各项目中相互协作的时候可能用得到消息通知机制。比如有 ... -
使用Spring HTTP invoker进行远程调用
2011-03-30 10:34 1694使用Spring HTTP invoker进行远程调用Spri ... -
Java Spring2.5 Remote Invoke HTTP Invoker远程调用
2011-03-30 08:42 1971近日,一个项目涉及到系统间接口调用,考虑到系统间用的都是j ...
相关推荐
CGLib 采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截技术拦截所有父类方法的调用,并顺势织入横切逻辑。 四、Spring 事务管理 Spring 事务管理主要通过三个接口:...
在嵌套事务逻辑中,如果一个事务内的方法也被`@Transactional`注解,Spring会根据传播行为来决定如何处理。例如,`PROPAGATION_REQUIRED`会将新的方法调用加入到当前事务,而`PROPAGATION_NEW`则会启动一个新的独立...
12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器...
Spring 提供了一种轻量级的方式来管理和配置 Java 对象(Beans),并通过依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)等机制来实现这一目标。 **Spring** 的核心功能...
声明式事务管理依赖于Spring的AOP机制,它可以在不修改业务代码的情况下,通过代理对象拦截方法调用,实现事务的自动控制。AOP允许我们定义“切面”(Aspect),即关注点的模块化,如事务管理就是一个典型的横切...
12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...
12.2.4. 不使用回调的基于Spring的DAO实现 12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用...
10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过...
- **AOP代理**:Spring通过AOP(面向切面编程)实现事务的管理,当事务方法被调用时,Spring会创建一个代理对象,拦截方法调用并在适当的时候进行事务控制。 - **事务边界**:事务的边界由`@Transactional`注解...
9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring ...
4. **MethodProxy**:CGLib生成的代理对象会包含一个MethodProxy实例,这个对象可以调用实际的方法。在MethodInterceptor的`intercept`方法中,我们可以通过MethodProxy来调用目标方法。 5. **代理对象的创建**:...
10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC数据连接泄漏 10.7.3 通过DataSourceUtils获取数据连接 10.7.4 通过...
Spring Framework 开发参考手册 Rod Johnson Juergen Hoeller Alef Arendsen Colin Sampaleanu Rob Harrop Thomas Risberg Darren Davison Dmitriy Kopylenko Mark Pollack Thierry Templier Erwin ...
在`RedisProcess`类中,注入了`RedisTemplate`以操作Redis,并定义了一个`pointcutMethod()`方法作为切入点,它会拦截所有带有`RedisCache`注解的方法。`around()`方法作为环绕通知,负责在方法执行前后处理缓存逻辑...
5. **回调方法中的事务失效**:在Spring AOP中,后置处理器(AfterReturningAdvice)不能感知到事务,因此在这些回调方法中无法进行事务操作。如果需要在回调中处理事务,应考虑使用其他回调机制,如`@AfterThrowing...
9. **问题与解决**:在同一个类中,一个方法调用另一个方法时,AOP无法自动拦截内部方法,因为它们在同一个实例中执行。为解决此问题,可以使用`@Transactional(propagation = Propagation.REQUIRES_NEW)`来创建新...
- `@Transactional`注解仅在Spring AOP代理能够拦截到的方法上生效,因此,如果在非Spring管理的类或静态方法中使用,事务管理将不起作用。 - 如果事务属性设置不当,可能会导致数据不一致或并发问题,应谨慎调整...
事务传播行为是指当一个事务方法被另一个事务方法调用时,如何处理这些事务的方法。Spring通过`TransactionDefinition`接口定义了七种不同的事务传播行为类型,每一种都有其特定的用途和场景。了解这些事务传播行为...
当一个方法被标记为事务性的,Spring就会在该方法执行前后自动开启和提交/回滚事务,而无需在业务代码中显式编写事务管理代码。 #### 二、Hibernate框架面试题解析 **1. Hibernate为什么需要SessionFactory?** ...