- 浏览: 673369 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (198)
- 编程经验 (12)
- 移动端 (2)
- linux (1)
- 基础理论 (10)
- 开发工具 (8)
- 开发语言_java (21)
- 开源框架_Axis2 (8)
- GIS开发_OpenLayers (9)
- GIS开发_ArcGIS (6)
- GIS开发_googleAPI (4)
- GIS开发_AO (2)
- Web前端_Javascript (7)
- Web前端_CSSDIV (2)
- Web前端_WebGL (5)
- Web前端_HTML5 (1)
- 数据库 (17)
- 项目管理 (6)
- REST服务_Restlet (0)
- REST服务_RestEasy (5)
- 连接池 (6)
- 框架组合_SSI (7)
- 框架组合_SSH (37)
- 异常处理 (10)
- 测试 (1)
- ASP/ASP.NET (3)
- 我所遇到的JavaScript (1)
- cas (1)
- CI (1)
- nginx (1)
- 大数据 (1)
- maven (1)
- 机器学习 (0)
最新评论
-
章元o:
正解,问题解决了,要换tomcat的
webservice开发时项目启动过程中出现版本问题 -
dcloud:
大师,按照你的指点进行初始化工作,但是在connection. ...
AO连接sde出现java.lang.UnsatisfiedLinkError: no ntvauth in java.library.path -
yiran0314:
您好 关于这个问题能描述得更详细一点吗?
CXF异常处理 -
tianhandigeng:
找了半个小时了也没小号到m2e最新的地址,既然这个都让你找得这 ...
Myeclipse8.6安装Maven插件------ -
wxb880114:
这个发的比较早了,现在在myeclipse中有自带的,ecli ...
Myeclipse8.6安装Maven插件------
目前的项目中接触了一些Spring的AOP的部分,比如声明式事务管理。
1. 几个重要的概念(详细的情况参见Spring的在线文档)
· PointCut:一组JointPoint。在Spring中我们可以通过一些正则表达式定义那些JointPoint组成了我们需要的一个PointCut,从而使我们的Advice可以被编制进来。
· Introduction:Introduction可以我们在已经存在的类中在不修改这个类的情况下增加属性和方法,从而增加其状态和动作;
· Target:满足PointCut定义的条件的一个类,我们可以把Advice用于这个类。大多Spring的AOP是通过动态代理的机制实现的,这个Target就是那个被代理的对象;
· Proxy:为了将一个Advice应用到另外一个类中,比如实现Around Advice,就是在一个方法执行前后加上其他的代码,那么实际的实现一定是先执行一段Advice的代码,然后执行Target的那个方法,之后再执行一段Advice的代码,也就是客户端执行某个类的时候,实际执行的是一个代理,由代理再把调用传递到那个Target中。
· Weaving(编织):有了Target和Advice,在什么时机将这两个模块编织在一起呢?可以选择的方法包括编译的时候(这样我们需要一个特殊的编译器),装载类的时候(这样我们需要一个特殊的ClassLoader)和运行的时候(AOP容易可以动态的创建一个代理从而将调用由这个代理传递到Target类中)。
2. Throws Advice
目前的项目中有这么一个要求,对于某些处理流程如果在运行的时候抛出了一些异常,需要将这些异常的信息记录下来,保存在数据库或发邮件给开发人员。我们切不说这个需求跟TDD有什么冲突的地方,先看看如何实现吧。
按照上面概念的描述,我们应该主要注意三个概念:Target,Advice和Proxy。
2.1 Target的实现
Target就是上面所说的业务流程类,我们按照正常的开发编写代码即可,没有什么特殊的要求。如:
public interface IBizProcess {
void doOneThing();
void doAnotherThing();
}
public class BizProcessImpl {
public void doOneThing() {
}
public void doAnotherThing() {
throw new RuntimeException("Boom");
}
}
2.2 Advice
为了实现当业务流程抛出异常时的Advice,我们需要定义个一个Advice类,实现ThrowsAdvice接口。这个接口里面没有定义方法,我们要求我们的类必须实现afterThrows这个方法,如下:
public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );
这个方法的前面三个参数都是可选的。我们在同一个类中定义这个方法的多个版本,如:
public void afterThrowing( MyException1 ex ) {}
public void afterThrowing( MyException2 ex ) {}
具体那个方法被调用则根据具体的Exception来判断,由AOP容易自动识别执行。
2.3 Proxy(代理)
Spring中一个简单的实现是用它的org.springframework.aop.framework.ProxyFactoryBean。这个Bean包含了很多个属性,其中有三个我们需要设置:target,proxyInterfaces和interceptorNames,如下:
<bean id=”bizOneTarget” class=”com.company.biz.impl.BizProcessImpl”/>
<bean id=”throwsAdvice” class=”com.company.advice.MyThrowsAdvice”/>
<bean id=”bizOne” class=”org.springframework.aop.framework.ProxyFactoryBean”>
<property name=”target”><ref bean=”bizOneTargte”/></property>
<property name=”proxyInterfaces”>
<value>com.company.biz.IBizProcessImpl</value>
</property>
<property name=”interceptorNames”>
<list>
<value>throwsAdvice</value>
</list>
</property>
</bean>
通过上面的配置,Spring就把Target和Advice编织在了一起。需要说明的是,proxyInterfaces和interceptorNames都可以是多个,如果是多个的话就需要用list来定义。interceptorNames的先后次序决定了这些Advice执行的先后次序。
3. 简化配置
从上面的例子可以看出,如果有多个BizProcess的对象需要代理,我们在Spring配置中为每一个Bean都配置一个代理,那么配置文件的维护就成了麻烦。为此,Spring提供了比较方便的方法解决这个问题,比如BeanNameAutoProxyCreator、DefaultAdviceAutoProxyCreator和metadata autoproxying。我们采用了BeanNameAutoProxyCreator,因为他比较直观和简单。
配置如下:
<bean id=”beanNameAutoProxyCreator” class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>
<property name=’beanNames”>
<list>
<value>*Service</value>
</list>
</property>
<property name=”interceptorNames”>
<value>throwsAdvice</value>
</property>
</bean>
从中我们可以看到,所有以Service结尾的bean都会由Spring自动创建代理,从而实现Advice的织入。
1. 几个重要的概念(详细的情况参见Spring的在线文档)
· PointCut:一组JointPoint。在Spring中我们可以通过一些正则表达式定义那些JointPoint组成了我们需要的一个PointCut,从而使我们的Advice可以被编制进来。
· Introduction:Introduction可以我们在已经存在的类中在不修改这个类的情况下增加属性和方法,从而增加其状态和动作;
· Target:满足PointCut定义的条件的一个类,我们可以把Advice用于这个类。大多Spring的AOP是通过动态代理的机制实现的,这个Target就是那个被代理的对象;
· Proxy:为了将一个Advice应用到另外一个类中,比如实现Around Advice,就是在一个方法执行前后加上其他的代码,那么实际的实现一定是先执行一段Advice的代码,然后执行Target的那个方法,之后再执行一段Advice的代码,也就是客户端执行某个类的时候,实际执行的是一个代理,由代理再把调用传递到那个Target中。
· Weaving(编织):有了Target和Advice,在什么时机将这两个模块编织在一起呢?可以选择的方法包括编译的时候(这样我们需要一个特殊的编译器),装载类的时候(这样我们需要一个特殊的ClassLoader)和运行的时候(AOP容易可以动态的创建一个代理从而将调用由这个代理传递到Target类中)。
2. Throws Advice
目前的项目中有这么一个要求,对于某些处理流程如果在运行的时候抛出了一些异常,需要将这些异常的信息记录下来,保存在数据库或发邮件给开发人员。我们切不说这个需求跟TDD有什么冲突的地方,先看看如何实现吧。
按照上面概念的描述,我们应该主要注意三个概念:Target,Advice和Proxy。
2.1 Target的实现
Target就是上面所说的业务流程类,我们按照正常的开发编写代码即可,没有什么特殊的要求。如:
public interface IBizProcess {
void doOneThing();
void doAnotherThing();
}
public class BizProcessImpl {
public void doOneThing() {
}
public void doAnotherThing() {
throw new RuntimeException("Boom");
}
}
2.2 Advice
为了实现当业务流程抛出异常时的Advice,我们需要定义个一个Advice类,实现ThrowsAdvice接口。这个接口里面没有定义方法,我们要求我们的类必须实现afterThrows这个方法,如下:
public void afterThrows( [Method method,] [Object args,] [Object target,] Throwable throwable );
这个方法的前面三个参数都是可选的。我们在同一个类中定义这个方法的多个版本,如:
public void afterThrowing( MyException1 ex ) {}
public void afterThrowing( MyException2 ex ) {}
具体那个方法被调用则根据具体的Exception来判断,由AOP容易自动识别执行。
2.3 Proxy(代理)
Spring中一个简单的实现是用它的org.springframework.aop.framework.ProxyFactoryBean。这个Bean包含了很多个属性,其中有三个我们需要设置:target,proxyInterfaces和interceptorNames,如下:
<bean id=”bizOneTarget” class=”com.company.biz.impl.BizProcessImpl”/>
<bean id=”throwsAdvice” class=”com.company.advice.MyThrowsAdvice”/>
<bean id=”bizOne” class=”org.springframework.aop.framework.ProxyFactoryBean”>
<property name=”target”><ref bean=”bizOneTargte”/></property>
<property name=”proxyInterfaces”>
<value>com.company.biz.IBizProcessImpl</value>
</property>
<property name=”interceptorNames”>
<list>
<value>throwsAdvice</value>
</list>
</property>
</bean>
通过上面的配置,Spring就把Target和Advice编织在了一起。需要说明的是,proxyInterfaces和interceptorNames都可以是多个,如果是多个的话就需要用list来定义。interceptorNames的先后次序决定了这些Advice执行的先后次序。
3. 简化配置
从上面的例子可以看出,如果有多个BizProcess的对象需要代理,我们在Spring配置中为每一个Bean都配置一个代理,那么配置文件的维护就成了麻烦。为此,Spring提供了比较方便的方法解决这个问题,比如BeanNameAutoProxyCreator、DefaultAdviceAutoProxyCreator和metadata autoproxying。我们采用了BeanNameAutoProxyCreator,因为他比较直观和简单。
配置如下:
<bean id=”beanNameAutoProxyCreator” class=”org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator”>
<property name=’beanNames”>
<list>
<value>*Service</value>
</list>
</property>
<property name=”interceptorNames”>
<value>throwsAdvice</value>
</property>
</bean>
从中我们可以看到,所有以Service结尾的bean都会由Spring自动创建代理,从而实现Advice的织入。
发表评论
-
java.lang.NullPointerException at org.apache.jsp.index_jsp._jspInit(index_jsp.ja
2014-06-15 21:54 967java.lang.NullPointerException ... -
Spring处理id相同的bean
2013-05-22 09:34 12081、在spring同一个配置文件中,不能存在id相同的两个be ... -
普通Java类获取Spring的ApplicationContext(转载)
2013-02-25 10:20 1875普通Java类获取Spring的App ... -
Spring AOP使用过程中出现PointCut is not well-formed
2013-02-20 13:53 9217Exception in thread "main& ... -
ApplicationContext创建:FileSystemXmlApplicationContext(String)
2013-02-20 13:13 1427ApplicationContext提供了三种方式实现: 1. ... -
JPA与Hibernate的优缺点
2013-01-17 09:49 1563JPA与Hibernate的优缺点 2009-06-19 18 ... -
JDBC与Hibernate比较(转载)
2013-01-14 09:57 767刚开始学习JAVA时,认为 ... -
Hibernate连接池配置问题
2013-01-08 09:47 8881.连接池的概述 我 ... -
[转]Hibernate VS iBATIS比较
2012-12-20 10:54 1585项目也做过几个, 使用IB ... -
(转载)hibernate 的保存方法的区别
2012-12-19 16:57 706hibernate 的保存方法的区别---引用来自http:/ ... -
Configuration problem: Unable to locate Spring NamespaceHandler for XML schema
2012-12-14 13:31 1121严重: Exception sending context i ... -
Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from tr
2012-12-14 11:47 955org.springframework.dao.Invalid ... -
HIbernate连接ORACLE数据库时,出现connot open Connection问题
2012-12-06 16:46 2053HIbernate连接ORACLE数据库时,出现connot ... -
This is usually caused by using Struts tags without the associated filter.
2012-11-30 09:59 1082严重: Servlet.service() for servl ... -
Spring异常汇总
2012-11-28 14:29 969java.lang.IllegalStateException ... -
严重: Exception starting filter hibernateFilter
2012-11-27 11:41 1696严重: Exception starting filter h ... -
struts1.2中ActionForm和ServletFileUpload.parseRequest(request)不能同时使用
2012-07-24 11:02 1008struts1.2中ActionForm和ServletFil ... -
Uploadify在Struts2中的应用
2012-07-24 09:25 1307Uploadify在Struts2中的应用 步骤一: 到 ... -
Struts2获取httpServlet 对象
2012-07-24 09:16 846在struts1.x Action类的execute方法中,有 ... -
用Hibernate建表时出现语句输出,但表未建成功。
2012-07-21 21:03 1135用Hibernate建表时出现语句输出,但表未建成功。 仔细查 ...
相关推荐
spring aop jar 包
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
一、适合人群 1、具备一定Java编程基础,初级开发者 2、对springboot,mybatis,mysql有基本认识 3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 ...4、spring boot,mybatis,druid,spring aop的使用
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
Spring框架的关键组件之一是面向方面编程(AOP)框架。 面向方面的编程需要将程序逻辑分解成不同的部分。 此教程将通过简单实用的方法来学习Spring框架提供的AOP/面向方面编程。
springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足
AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析-SpringAOP中定义的类图AOP流程源码分析...
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
spring aop的demo spring aop的demo
Spring AOP 几个不同使用方法的完整例子,使用Junit4c测试, 在我的博客上有不同配置组合的说明,可以参考
spring之AOP(动态代理),包括jdk动态代理和CGLib动态代理
开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...
NULL 博文链接:https://306963591.iteye.com/blog/1129837
Spring源码最难问题:当Spring AOP遇上循环依赖.docx
springAOP所需jar包 springAOP所需jar包 springAOP所需jar包 springAOP所需jar包 springAOP所需jar包
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器