- 浏览: 684011 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (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 1042java.lang.NullPointerException ... -
Spring处理id相同的bean
2013-05-22 09:34 12821、在spring同一个配置文件中,不能存在id相同的两个be ... -
普通Java类获取Spring的ApplicationContext(转载)
2013-02-25 10:20 1912普通Java类获取Spring的App ... -
Spring AOP使用过程中出现PointCut is not well-formed
2013-02-20 13:53 9311Exception in thread "main& ... -
ApplicationContext创建:FileSystemXmlApplicationContext(String)
2013-02-20 13:13 1527ApplicationContext提供了三种方式实现: 1. ... -
JPA与Hibernate的优缺点
2013-01-17 09:49 1605JPA与Hibernate的优缺点 2009-06-19 18 ... -
JDBC与Hibernate比较(转载)
2013-01-14 09:57 801刚开始学习JAVA时,认为 ... -
Hibernate连接池配置问题
2013-01-08 09:47 9261.连接池的概述 我 ... -
[转]Hibernate VS iBATIS比较
2012-12-20 10:54 1627项目也做过几个, 使用IB ... -
(转载)hibernate 的保存方法的区别
2012-12-19 16:57 742hibernate 的保存方法的区别---引用来自http:/ ... -
Configuration problem: Unable to locate Spring NamespaceHandler for XML schema
2012-12-14 13:31 1153严重: Exception sending context i ... -
Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from tr
2012-12-14 11:47 1003org.springframework.dao.Invalid ... -
HIbernate连接ORACLE数据库时,出现connot open Connection问题
2012-12-06 16:46 2120HIbernate连接ORACLE数据库时,出现connot ... -
This is usually caused by using Struts tags without the associated filter.
2012-11-30 09:59 1119严重: Servlet.service() for servl ... -
Spring异常汇总
2012-11-28 14:29 1005java.lang.IllegalStateException ... -
严重: Exception starting filter hibernateFilter
2012-11-27 11:41 1742严重: Exception starting filter h ... -
struts1.2中ActionForm和ServletFileUpload.parseRequest(request)不能同时使用
2012-07-24 11:02 1045struts1.2中ActionForm和ServletFil ... -
Uploadify在Struts2中的应用
2012-07-24 09:25 1344Uploadify在Struts2中的应用 步骤一: 到 ... -
Struts2获取httpServlet 对象
2012-07-24 09:16 891在struts1.x Action类的execute方法中,有 ... -
用Hibernate建表时出现语句输出,但表未建成功。
2012-07-21 21:03 1202用Hibernate建表时出现语句输出,但表未建成功。 仔细查 ...
相关推荐
在讨论Spring AOP(面向切面编程)时,首先需要理解几个核心概念。Spring AOP 是Spring框架提供的一个功能模块,它允许开发者将横切关注点(cross-cutting concerns)从业务逻辑中解耦出来,通过在方法调用前后进行...
Spring AOP,即面向切面编程,是Spring框架的核心组件之一,它允许程序员在不修改原有业务代码的情况下,对程序进行功能增强。本篇文章将详细阐述Spring AOP的基本概念、种类、代理原理、通知类型以及切入点,帮助你...
Spring提供了`.ThrowsAdvice`接口来实现此类Advice。 随着Spring的发展,除了使用XML配置,还引入了基于注解的AOP,使得配置更加简洁。例如,使用`@Before`、`@After`、`@Around`和`@Throws`注解可以直接在方法上...
它是一个实现了`org.springframework.aop.MethodBeforeAdvice`、`org.springframework.aop.AfterReturningAdvice`或`org.springframework.aop.ThrowsAdvice`等接口的对象,可以在方法调用前后执行自定义逻辑。...
在Spring中,我们使用`org.springframework.aop.ThrowsAdvice`接口。例如: ```java public class ExceptionAdvice implements ThrowsAdvice { @AfterThrowing(pointcut = "execution(* com.example.service.*.*...
Spring提供了多种类型的Advice,包括MethodBeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。 2. Pointcut(切点): Pointcut是识别哪些连接点需要应用Advice的规则或模式。它定义了哪些方法应该被增强。在...
当方法抛出异常时,与之关联的ThrowsAdvice会触发。我们可以通过实现`ThrowsAdvice`接口,然后定义一系列以`throws`开头的方法,每个方法对应一种可能的异常类型。当目标方法抛出匹配的异常时,相应的`throws`方法会...
在Java世界中,Spring框架是应用最广泛的轻量级框架之一,它提供了众多特性来简化企业级应用的开发。在Spring中,`ThrowsAdvice`是一个重要的概念,它用于处理异常,提供了一种灵活的方式来增强方法的异常处理逻辑。...
首先,我们需要创建一个拦截器类,这个类通常会实现Spring的`MethodBeforeAdvice`、`AfterReturningAdvice`或`ThrowsAdvice`接口,或者自定义一个Advisor。在这个案例中,文件名为`LogInterceptor.java`的类可能是...
### Spring AOP 概念详解 #### 一、AOP基本概念 **Spring AOP** 是基于面向切面编程(Aspect Oriented Programming)的一种技术,主要用于处理横切关注点问题,比如日志记录、安全控制、事务管理等功能,这些功能...
### Spring应用中的AOP详解 #### 一、AOP概览 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过将横切关注点(cross-cutting concerns)从业务逻辑中分离出来,提高系统的模块化程度。在...
基于代理的经典 AOP 是 Spring 最早提供的 AOP 实现方式之一。它主要通过 `ProxyFactoryBean` 来创建代理对象。`ProxyFactoryBean` 是 Spring 提供的一个工厂 Bean,用于创建 AOP 代理对象。 - **按方法名字匹配**...
5. Weaving(编织):将切面应用到目标对象的过程,Spring AOP在运行时完成这个过程,通过ProxyFactory或ProxyFactoryBean。 二、AOP种类 1. 静态织入:在编译时完成,如AspectJ。 2. 动态织入:运行时进行,Spring...
首先,Spring AOP提供了多种通知类型,包括`MethodBeforeAdvice`、`AfterReturningAdvice`和`ThrowsAdvice`。`MethodBeforeAdvice`在目标方法执行前调用,`AfterReturningAdvice`在方法正常返回后调用,而`...
Spring AOP(Aspect Oriented Programming)是Spring框架的核心特性之一,它允许程序员实现关注点分离,将横切关注点(如日志、事务管理、安全检查)从核心业务逻辑中解耦出来。在AOP中,横切关注点被称为切面,而...
它们可以通过实现`org.springframework.aop.AfterReturningAdvice`和`org.springframework.aop.ThrowsAdvice`接口来创建,或者使用`@AfterReturning`和`@AfterThrowing`注解。 ```java @Aspect public class ...
**Spring的AOP**是Spring框架的一个核心特性,它提供了面向切面编程的能力,使得开发者可以将关注点从主要业务逻辑中分离出来,比如事务管理、日志记录、安全控制等。AOP允许我们在不修改原有业务代码的情况下,增强...
Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们在不修改源代码的情况下,对应用程序的特定部分(如方法调用)进行增强。本文将深入探讨Spring AOP中的通知类型及其创建方法,帮助你更好地理解和...