package aspect1;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* @author zhuc
*
*/
@Aspect
@Component
public class Aspect1 {
public Aspect1(){
System.out.println("Aspect1() 构造器");
}
// @Pointcut(value = "execution(* add*(..)) || execution(* del*(..))")
@Pointcut(value = "execution(* aspect1..*(..))") // 参数(..)可以写完整的package名+类名
// @Pointcut(value = "within(aspect1..*)")
// @Pointcut(value = "within(aspect1.Service2Impl)") //匹配目标类Service1Impl(包名可以省略)的所有方法
// @Pointcut(value = "args(String)")
private void pointCut() {
}
@Before(value = "pointCut()")
public void doBefore() {
System.out.println("doBefore......");
}
@After(value = "pointCut()")
public void doAfter() {
System.out.println("doAfter......");
}
/**
* AfterReturning 增强处理处理只有在目标方法成功完成后才会被织入。<br>
* After 增强处理不管目标方法如何结束(保存成功完成和遇到异常中止两种情况),它都会被织入。<br>
* @param obj
*/
@AfterReturning(value = "pointCut()", returning = "obj")
public void doAfterReturning(Object obj) {
System.out.println("返回的值是:" + obj);
System.out.println("doAfterReturning+Obj......");
}
/**
* Around 增强处理近似等于 Before 增强处理和 AfterReturning 增强处理的总和<br>
* 它可改变执行目标方法的参数值,也可改变目标方法之后的返回值<br>
* @param pjp
* @return
* @throws Throwable
*/
@Around(value = "pointCut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
System.out.println("before doAround......");
Object obj = pjp.proceed();
System.out.println("doAround......");
System.out.println("after doAround......");
return obj;
}
/**
* @param ex
*/
@AfterThrowing(value = "pointCut()", throwing = "ex")
public void doAfterThrowing(Throwable ex) {
System.out.println("抛出的异常是:" + ex);
System.out.println("doAfterThrowing......");
}
}
关于PointCut中execution表达式规范,请参考 http://zhuchengzzcc.iteye.com/blog/1504014
package aspect1;
/**
* @author zhuc
*
*/
public interface Service1 {
public void addDomain();
public void delDomain() throws Exception;
public String modifyDomain(String name);
}
package aspect1;
public interface Service2 {
public void buy();
}
package aspect1;
/**
* @author zhuc
*
*/
public class Service1Impl implements Service1 {
@Override
public void addDomain() {
System.out.println("Service1 添加");
}
@Override
public String modifyDomain(String name) {
System.out.println("Service1 修改" + name);
return name;
}
@Override
public void delDomain() throws Exception {
System.out.println("Service1 删除");
int i = 1 / 0;
}
}
package aspect1;
public class Service2Impl implements Service2{
@Override
public void buy() {
System.out.println("Service2 买");
}
}
aspect1.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<context:component-scan base-package="aspect1" />
<aop:aspectj-autoproxy />
<bean id="service1" class="aspect1.Service1Impl" />
<bean id="service2" class="aspect1.Service2Impl" />
</beans>
测试方法:
package aspect1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author zhuc
*
*/
public class Test1 {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) {
ApplicationContext ac = new ClassPathXmlApplicationContext(
"aspect1/aspect1.xml");
Service1 s = (Service1) ac.getBean("service1");
s.addDomain();
System.out.println();
s.modifyDomain("哈哈");
System.out.println();
try {
s.delDomain();
} catch (Exception e) {
}
System.out.println();
Service2 s2 = (Service2) ac.getBean("service2");
s2.buy();
}
}
运行结果如下:
Aspect1() 构造器
doBefore......
before doAround......
Service1 添加
doAfter......
返回的值是:null
doAfterReturning+Obj......
doAround......
after doAround......
doBefore......
before doAround......
Service1 修改哈哈
doAfter......
返回的值是:哈哈
doAfterReturning+Obj......
doAround......
after doAround......
doBefore......
before doAround......
Service1 删除
doAfter......
抛出的异常是:java.lang.ArithmeticException: / by zero
doAfterThrowing......
doBefore......
before doAround......
Service2 买
doAfter......
返回的值是:null
doAfterReturning+Obj......
doAround......
after doAround......
分享到:
相关推荐
spring aspectj aspectrt.jar
spring通过aspectj来实现事务控制
Spring 使用AspectJ 实现 AOP之前置通知小例子,实际跑过,验证可信。
NULL 博文链接:https://fei-xiang.iteye.com/blog/521637
aspectj.jar的1.9.0版本,下载后粘贴到所属的lib文件下即可
Spring4.3.7的AOP依赖包-AspectJ
NULL 博文链接:https://rain1109.iteye.com/blog/1838100
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
Spring AOP之基于AspectJ注解总结与案例 ,具体效果和过程看博文 http://blog.csdn.net/evankaka/article/details/45394409
主要对Spring AOP的相关概念和简单的静态代理、动态代理以及常见的几种AOP配置方式做总结学习。主要包括:1. AOP的常见概念 2. 静态代理 3. jdk动态代理 4. Aspectj and Aspectjweaver 5. **aop-config** 6. CGLIB ...
Spring 使用AspectJ 实现 AOP(基于xml文件、基于注解)
spring和aspectj的aop实验,详细内容可以移步至博客:https://mp.csdn.net/postedit/97750888
NULL 博文链接:https://hbiao68.iteye.com/blog/1487107
aspectj
AspectJ shows its real power when combined with Spring. This new edition focuses on Spring-AspectJ integration, which is a major feature of Spring 2.5. Readers will find this edition immensely helpful...
主要介绍了Spring AspectJ AOP框架注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
aspectj的jar spring使用aop需要的jar 使用aop
spring-aspectj-compiletime-weaving 这是一个示例项目,说明了如何在 java 8 环境中结合 spring 使用 aspectj。 UnmanagedClass 类用于说明如何在非托管 bean 中自动装配 bean。
要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar等jar包,文件已打包上传。
Spring spectJ AOP 前置通知 后置通知 返回通知 异常通知 环绕通知