- 浏览: 316143 次
- 性别:
- 来自: 宁波
文章分类
最新评论
-
bqlin1987:
请问是不是ITeye的代码莫名的换行了?
学习SSO-1 Tomcat启用ssl -
a6821122:
在data-config.xml 里的javascript 不 ...
solr导入Oracle日期时间数据的处理 -
jie_kong:
是flexigrid不是flexgrid
FlexGrid自己用的经验 -
zjnbshifox:
呵呵,我也在摸索阶段,谢谢提醒ligywin 写道还需要补充以 ...
CAS自定义Credentials登录 -
ligywin:
还需要补充以下方法import org.apache.comm ...
CAS自定义Credentials登录
在spring中,本来就是有对aop编程的支持,需要把需要管理的内容都注册到Spring中,像这样
<beans><bean id="businesslogicbean"><bean id="beanTarget" class="BusinessLogic"><bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"><bean id="loggingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
</bean>
简单描述一下:
<property name="proxyInterfaces"></property> <property name="target"><ref local="beanTarget"></ref>
这段话表示beanTarget注册的类必须实现IBussinessLogic接口,当然,这个也不是必须的,如果beanTarget指向的类没有实现任何接口,可以把
<property name="proxyInterfaces">
<value></value>
</property>
这部分去掉,这里需要注意的是,如果有接口的话,匹配的是接口中的方法。
<property name="patterns">
<value>
</value>
</property>
表示的是正则表达式来匹配方法,这里表示所有的方法,
<property name="advice">
<bean class="com.spring.aop.LoggingAdvice">
</bean>
可以是一个list列表,这里只有一个,下面看看com.spring.aop.LoggingAdvice这个类
package com.spring.aop;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;
public class LoggingAdvice implements MethodBeforeAdvice, AfterReturningAdvice,
ThrowsAdvice {
Log logger = LogFactory.getLog(LoggingAdvice.class);
public void before(Method method, Object[] args, Object target)//方法执行之前
throws Throwable {
if (logger.isInfoEnabled()) {
logger.info("About to call method: " + target.getClass().getName() + "." + method.getName());
}
}
//方法返回之后执行
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
if (logger.isInfoEnabled()) {
logger.info("Successfully returned from method: " + target.getClass().getName() + "." + method.getName());
}
}
//方法抛出异常的时候执行
public void afterThrowing(Method method, Object[] args, Object target, Throwable throwable) {
logger.error("Exception of type " + throwable.getClass().getName() + " thrown in method " + target.getClass().getName() + "." + method.getName() + ". Message: " + throwable.getMessage());
}
}
这种情况下,每个类都需要去注册,似乎做起来有点复杂了。而且如果对象不是通过spring的context得到的话,也是不行的。
幸好有AspectJ,从eclipse.org下载AspectJ的插件AJDT,在原来系统上增加AspectJ的特性,新建一个AJ:
package com.aspect;
public aspect ExceptionHandler {
org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(ExceptionHandler.class);
private DefaultExceptionHandler exceptionHandler;
public void setExceptionHandler(DefaultExceptionHandler exceptionHander) {
this.exceptionHandler = exceptionHander;
}
pointcut afterException():call(* *(..) );
after() throwing(Exception ex) : afterException() {
log.info(thisJoinPoint.getTarget().getClass().getName());
if (exceptionHandler != null) exceptionHandler.onException(ex);
}
}
这样在每次出现Exception的时候,都会去执行log了,当然这个也可以注册到spring中,让spring来管理:
<bean name="ExceptionHandlingAspect" class="com.aspect.ExceptionHandler" factory-method="aspectOf">
<bean name="MyExceptionHandler">
</bean>
com.aspect.DefaultExceptionHandler的源代码:
package com.aspect;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DefaultExceptionHandler {
Log log = LogFactory.getLog(DefaultExceptionHandler.class);
private int handledCount = 0;
public void onException(Exception ex) {
this.handledCount++;
log.error("Got an Exception",ex);
}
public int getHandledExceptionCount() {
return this.handledCount;
}
}
总结:
1、感觉Spring越来越强大,Spring已经集成了AspectJ5,不过我看到的只是皮毛
2、这种情况下,似乎只是静态加强,源代码似乎在被AspectJ的编译器重新编译过才有效,如果得到的是class文件,那会怎么样?应该怎么去做呢?有待于进一步了解…
</bean></property> </property> </bean></bean></bean></beans>
<beans><bean id="businesslogicbean"><bean id="beanTarget" class="BusinessLogic"><bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"><bean id="loggingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
xml 代码
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <bean id="businesslogicbean"
- class="org.springframework.aop.framework.ProxyFactoryBean">
- <property name="proxyInterfaces">
- <value>IBusinessLogic</value>
- </property>
- <property name="target">
- <ref local="beanTarget"/>
- </property>
- <property name="interceptorNames">
- <list>
- <value>loggingAdvisor</value>
- </list>
- </property>
- </bean>
- <bean id="beanTarget" class="BusinessLogic"/>
- <bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
- <property name = "proxyTargetClass" value = "true"/>
- </bean>
- <bean id="loggingAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
- <property name="patterns">
- <value>.*</value>
- </property>
- <property name="advice">
- <bean class="com.spring.aop.LoggingAdvice"/>
- </property>
- </bean>
- </beans>
</bean>
简单描述一下:
xml 代码
- <property name="proxyInterfaces">
- <value>IBusinessLogic</value>
- </property>
- <property name="target">
- <ref local="beanTarget"/>
- </property>
<property name="proxyInterfaces"></property> <property name="target"><ref local="beanTarget"></ref>
这段话表示beanTarget注册的类必须实现IBussinessLogic接口,当然,这个也不是必须的,如果beanTarget指向的类没有实现任何接口,可以把
xml 代码
- <property name="proxyInterfaces">
- <value>IBusinessLogic</value>
- </property>
<property name="proxyInterfaces">
<value></value>
</property>
这部分去掉,这里需要注意的是,如果有接口的话,匹配的是接口中的方法。
<property name="patterns">
<value>
xml 代码
- <property name="patterns">
- <value>.*</value>
- </property>
</property>
表示的是正则表达式来匹配方法,这里表示所有的方法,
<property name="advice">
xml 代码
- <property name="advice">
- <bean class="com.spring.aop.LoggingAdvice"/>
- </property>
</bean>
可以是一个list列表,这里只有一个,下面看看com.spring.aop.LoggingAdvice这个类
package com.spring.aop;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.ThrowsAdvice;
public class LoggingAdvice implements MethodBeforeAdvice, AfterReturningAdvice,
ThrowsAdvice {
Log logger = LogFactory.getLog(LoggingAdvice.class);
public void before(Method method, Object[] args, Object target)//方法执行之前
throws Throwable {
if (logger.isInfoEnabled()) {
logger.info("About to call method: " + target.getClass().getName() + "." + method.getName());
}
}
//方法返回之后执行
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
if (logger.isInfoEnabled()) {
logger.info("Successfully returned from method: " + target.getClass().getName() + "." + method.getName());
}
}
//方法抛出异常的时候执行
public void afterThrowing(Method method, Object[] args, Object target, Throwable throwable) {
logger.error("Exception of type " + throwable.getClass().getName() + " thrown in method " + target.getClass().getName() + "." + method.getName() + ". Message: " + throwable.getMessage());
}
}
这种情况下,每个类都需要去注册,似乎做起来有点复杂了。而且如果对象不是通过spring的context得到的话,也是不行的。
幸好有AspectJ,从eclipse.org下载AspectJ的插件AJDT,在原来系统上增加AspectJ的特性,新建一个AJ:
package com.aspect;
public aspect ExceptionHandler {
org.apache.commons.logging.Log log = org.apache.commons.logging.LogFactory.getLog(ExceptionHandler.class);
private DefaultExceptionHandler exceptionHandler;
public void setExceptionHandler(DefaultExceptionHandler exceptionHander) {
this.exceptionHandler = exceptionHander;
}
pointcut afterException():call(* *(..) );
after() throwing(Exception ex) : afterException() {
log.info(thisJoinPoint.getTarget().getClass().getName());
if (exceptionHandler != null) exceptionHandler.onException(ex);
}
}
这样在每次出现Exception的时候,都会去执行log了,当然这个也可以注册到spring中,让spring来管理:
<bean name="ExceptionHandlingAspect" class="com.aspect.ExceptionHandler" factory-method="aspectOf">
xml 代码
- <bean name="ExceptionHandlingAspect" class="com.aspect.ExceptionHandler" factory-method="aspectOf">
- <property name="exceptionHandler">
- <ref bean="MyExceptionHandler"/>
- </property>
- </bean>
- <bean name="MyExceptionHandler"
- class="com.aspect.DefaultExceptionHandler">
- </bean>
</bean>
com.aspect.DefaultExceptionHandler的源代码:
package com.aspect;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class DefaultExceptionHandler {
Log log = LogFactory.getLog(DefaultExceptionHandler.class);
private int handledCount = 0;
public void onException(Exception ex) {
this.handledCount++;
log.error("Got an Exception",ex);
}
public int getHandledExceptionCount() {
return this.handledCount;
}
}
总结:
1、感觉Spring越来越强大,Spring已经集成了AspectJ5,不过我看到的只是皮毛
2、这种情况下,似乎只是静态加强,源代码似乎在被AspectJ的编译器重新编译过才有效,如果得到的是class文件,那会怎么样?应该怎么去做呢?有待于进一步了解…
</bean></property> </property> </bean></bean></bean></beans>
发表评论
-
jasper report与Spring mvc整合
2015-10-19 16:02 1651配置jasper view resolver <be ... -
solr导入Oracle日期时间数据的处理
2013-02-08 10:01 5166参考文章: http://stackoverflow.com/ ... -
solr服务端加亮设置
2013-02-06 23:25 1321在${solr.home}/conf/solrconfig.x ... -
Solr客户端自定义开发
2013-02-06 16:52 1688@Service @Qualifier(" ... -
CAS 客户端获取Credentials额外信息
2013-02-06 09:40 4018服务端的配置 1、在deployerContext.xml中加 ... -
CAS自定义Credentials登录
2013-02-02 00:03 7993先看了这篇文章http://www.blogjava.net/ ... -
Spring data MongoDB DSL
2013-01-29 13:38 2614这两天自己配置了一个通过Spring Data来连接Mongo ... -
Spring MVC和freemarker配置
2013-01-21 13:45 2488参考文章:http://www.cnblogs.com/hoo ... -
我自己的maven环境
2013-01-17 14:37 1112今天把自己的maven环境记录下来,准备重装系统能找到 mav ... -
Spring-data jpa学习
2013-01-17 14:25 1822一个早上加一个中午就耗在这里了啊,就一个小问题,让我吐血不已, ... -
今天学会的DetachedCriteria用法
2013-01-12 22:01 10191以前用hibernate,一般都是使用hql语句的,因为和sq ... -
学习SSO-1 Tomcat启用ssl
2012-11-29 10:41 6995根据网上的http://www.kafeitu.me/sso/ ... -
Solr连接数据库
2012-04-10 09:40 6221要建立自己的全文检索 ... -
Solr试用小记
2012-04-10 09:15 15731、下载tomcat7、solr 3.5.0 以及IKAnal ... -
java生成二维码,qrcode
2012-03-22 15:41 7024通过barcode4j生成 @Controller @R ... -
使用HttpClient 4.1.2调用webservice
2012-01-19 14:22 19263下载httpclient,把压缩包里lib目录的所有jar放到 ... -
Spring MVC3 Hibernate3 Annotation 补充
2011-05-30 11:59 1411通过配置文件进行事务声明 app-config.xml & ... -
Spring MVC3 Hibernate3 Annotation
2011-05-30 11:56 1780web.xml <?xml version=&quo ... -
Tomcat Mod_jk负载均衡Session复制的几点补充
2010-02-24 16:49 1339tomcat和mod_jk进行负载均衡的时候,如果要实现Ses ... -
第一次实际应用Spring MVC
2009-11-17 08:37 1605要做一个简单的投票的东西,看spring mvc的文章已经很久 ...
相关推荐
Spring的AOP(面向切面编程)是一种强大的编程模型,它允许程序员在不修改源代码的情况下,通过插入额外的...在Spring4.3.7版本中,AspectJ的集成进一步完善了Spring的AOP框架,为开发者提供了更丰富的工具和可能性。
综上所述,为了在Spring中利用AspectJ的全部功能,你需要将对应的AspectJ JAR文件加入到项目类路径中,然后按照Spring文档或AspectJ文档的指导配置和使用AOP。这将使你的代码更加模块化,降低耦合,提高可维护性。
总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...
通过以上内容,我们可以理解如何使用@AspectJ配置Spring AOP,包括创建切面类、定义切点表达式、编写不同类型的通知,以及在Spring配置中启用和装配切面。实际操作中,你可以参考提供的资源文件进行学习和实践。
在Java世界中,Spring框架以其强大的功能和灵活性深受开发者喜爱,尤其在面向切面编程(AOP)方面,Spring提供了非常全面的支持。AOP是一种编程范式,它允许程序员定义“切面”,这些切面可以封装关注点,如日志、...
Spring 提供了两种主要的 AOP 实现方式:基于代理的和基于 AspectJ 的。基于代理的方式是 Spring 默认的实现,它通过 JdkDynamicProxy 或 CGLIB 创建代理对象来实现切面。而基于 AspectJ 的方式则更为强大,它允许...
一个基于@AspectJ的spring2.0 AOP应用实例,很小很简单,没有任何额外信息,最适合AOP入门学习。使用log4j打印信息。把项目直接import进myeclipse就可以使用啦......
织入(Weaving)是将切面应用到目标对象以创建新的代理对象的过程,这在Spring中通常是自动完成的。 在Spring Boot项目中启用AOP,我们需要以下步骤: 1. **引入依赖**:在`pom.xml`或`build.gradle`文件中添加...
在Spring中,我们可以使用AspectJ来实现AOP,AspectJ是一个强大的AOP框架,它可以与Spring无缝集成,提供更细粒度的控制。 首先,让我们了解一下AOP中的通知类型: 1. **前置通知**(Before Advice):在目标方法...
综上所述,《AspectJ in Action: Enterprise AOP with Spring Applications》这本书不仅是一本关于面向切面编程的权威指南,还提供了大量实用案例和最佳实践建议,对于希望深入了解Spring-AspectJ集成的企业级开发者...
标题"spring和aspectj的aop实验"表明我们将探讨如何在Spring中使用AspectJ进行AOP实践。这通常涉及到创建切面、定义通知、配置织入策略以及测试其效果。 1. **什么是AOP** AOP的核心概念是切面(Aspect),它封装...
在Spring中,Joinpoint主要指的是方法的调用。 2. Advice(通知):Advice是在特定Joinpoint上执行的代码片段。Spring AOP提供了五种不同类型的Advice:Before、Afterreturning、Afterthrowing、Around和...
在Spring中,使用XML配置AOP时,我们需要在配置文件中定义切入点(pointcut)和通知(advice)。切入点指定何时应用通知,而通知则定义了实际要执行的行为。例如,我们可以定义一个切入点表达式来匹配特定的方法...
**Spring AOP 概念理解** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架的一个重要组成部分,它允许我们通过...理解和熟练运用Spring AOP及其@AspectJ注解是每个Spring开发者必备的技能之一。
Spring AOP的AspectJ支持jar包; 包括: com.springsource.net.sf.cglib-2.2.0.jar com.srpingsource.org.aopalliance-1.0.0.jar com.srpingsource.org.aspectj.weaver-1.68.RELEASE.jar
描述中的“额外jar包”可能指的是如AspectJ的库,AspectJ是一个强大的静态和动态AOP框架,可以与Spring AOP集成。AspectJ的编译器(aspectjrt.jar和aspectjweaver.jar)用于在编译时或运行时织入切面,而...
为了在Spring中进行AOP编程,我们需要一些特定的JAR包。以下是对这些关键组件的详细说明: 1. **Spring核心包**: - `spring-core.jar`: 这是Spring框架的基础,包含了IoC(Inversion of Control,控制反转)容器...
4. **AOP Alliance**:AOP Alliance是一个较小的库,提供了AOP框架之间的公共接口,比如Spring AOP和AspectJ。它定义了一些通用的切面接口,使得在不同AOP框架间切换变得更加容易,增强了兼容性和互操作性。 使用...
Spring支持两种AOP的实现方式:Spring AspectJ注解风格和Spring XML配置风格。使用AspectJ注解风格是最常见的,它允许开发者直接在方法上使用注解来定义切面。 Spring AOP中有五种不同类型的的通知(Advice): 1....
综上所述,SpringBoot结合AspectJ实现SpringAOP拦截指定方法,主要涉及到Spring AOP的原理、切点和通知的定义、自定义注解的使用,以及如何在SpringBoot项目中整合AspectJ进行更复杂的切面编程。通过这些知识点,...