aspectJ 是基于java语言的aop框架,提供了强大的aop功能。

aspectJ的实现主要有两种,一种是基于xml的声明式aspectJ,另一种是基于注解的aspectJ。

1.基于xml的声明式aspectJ

接口userDao

public interface userDao {
public void addUser();
public void deleteUser();
}
接口实现类UserDaoImp
public class UserDaoImp implements userDao {
    @Override
public void addUser() {
System.out.println("添加用户");
}
@Override
public void deleteUser() {
System.out.println("删除用户");
}
}
//切面类MyAspect
public class MyAspect {
//前置通知
//JoinPoint连接点
public void myBefore(JoinPoint joinPoint) {
System.out.println("前置通知的目标类:" + joinPoint.getTarget());
System.out.println("被植入增强的方法是:" + joinPoint.getSignature().getName());
} //后置通知
public void myAfterReturning(JoinPoint joinPoint) {
System.out.println("后置通知,被植入增强的目标方法是:" + joinPoint.getSignature().getName());
} /*环绕通知
* ProceedingJoinPoint 是JoinPoint子接口,表示可执行目标方法
* 类型必须是Object类型的返回值
* 必须接收一个参数,类型为ProceedingJoinPoint
* 必须抛出异常throws Throwable
* */
public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕开始");
//执行当前目标方法
Object obj = proceedingJoinPoint.proceed();
System.out.println("环绕结束");
return obj;
} //异常通知
public void myAfterThrowing(JoinPoint joinPoint, Throwable e) {
System.out.println("异常通知开始,出错了" + e.getMessage());
} //最终通知
public void myAfter() {
System.out.println("最终通知,始终要执行");
}
}
在xml中的配置
<!-- 1 目标类 -->
<bean id="userDao" class="com.itheima.ioc.aspectJ.UserDaoImp"/>
<!-- 2 切面 -->
<bean id="myAspect" class="com.itheima.ioc.aspectJ.MyAspect"/>
<!-- 3 aop编程 -->
<aop:config>
<!-- 配置切面 -->
<aop:aspect id="myaspect" ref="myAspect">
<!-- 3.1 配置切入点,通知最后增强哪些方法 -->
<aop:pointcut expression="execution(* com.itheima.ioc.aspectJ.*.*(..))"
id="myPointCut"/>
<!-- 3.2 关联通知Advice和切入点pointCut -->
<!-- 3.2.1 前置通知 -->
<aop:before method="myBefore" pointcut-ref="myPointCut"/>
<!-- 3.2.2 后置通知,在方法返回之后执行,就可以获得返回值
returning属性:用于设置后置通知的第二个参数的名称,类型是Object -->
<aop:after-returning method="myAfterReturning"
pointcut-ref="myPointCut" returning="joinPoint"/>
<!-- 3.2.3 环绕通知 -->
<aop:around method="myAround" pointcut-ref="myPointCut"/>
<!-- 3.2.4 抛出通知:用于处理程序发生异常-->
<!-- * 注意:如果程序没有异常,将不会执行增强 -->
<!-- * throwing属性:用于设置通知第二个参数的名称,类型Throwable -->
<aop:after-throwing method="myAfterThrowing"
pointcut-ref="myPointCut" throwing="e"/>
<!-- 3.2.5 最终通知:无论程序发生任何事情,都将执行 -->
<aop:after method="myAfter" pointcut-ref="myPointCut"/>
</aop:aspect>
</aop:config>
</beans>
测试代码
public class xmlAspectJTest {
public static void main(String[] args) {
ApplicationContext applicationContext =
new ClassPathXmlApplicationContext("applicationContext.xml");
userDao userdao = (userDao) applicationContext.getBean(userDao.class);
userdao.deleteUser();
// userdao.addUser();
}
}
测试结果

前置通知的目标类:com.itheima.ioc.aspectJ.UserDaoImp@291f18
被植入增强的方法是:deleteUser
环绕开始
删除用户
最终通知,始终要执行
环绕结束
后置通知,被植入增强的目标方法是:deleteUser

2.基于注解的aspectJ

@Aspect//注册声明切面
@Component//将这个切面标示为spring中的bean public class MyAspect {
    //前置通知
@Pointcut("execution(* com.itheima.ioc.aspectJ.*.*(..))")
//使用一个返回值为空,方法体为空的方法来命名切入点
//一般为私有的
private void myPointCut(){} @Before("myPointCut()")
public void myBefore(JoinPoint joinPoint) {
System.out.println("前置通知的目标类:" + joinPoint.getTarget());
System.out.println("被植入增强的方法是:" + joinPoint.getSignature().getName());
} //后置通知
@AfterReturning("myPointCut()")
public void myAfterReturning(JoinPoint joinPoint) {
System.out.println("后置通知,被植入增强的目标方法是:" + joinPoint.getSignature().getName());
} /*环绕通知
* ProceedingJoinPoint 是JoinPoint子接口,表示可执行目标方法
* 类型必须是Object类型的返回值
* 必须接收一个参数,类型为ProceedingJoinPoint
* 必须抛出异常throws Throwable
* */
@Around("myPointCut()")
public Object myAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕开始");
//执行当前目标方法
//如果不调用则不执行目标方法
Object obj = proceedingJoinPoint.proceed();
System.out.println("环绕结束");
return obj;
} //异常通知
@AfterThrowing(value = "myPointCut()",throwing = "e")
public void myAfterThrowing(JoinPoint joinPoint, Throwable e) {
System.out.println("异常通知开始,出错了" + e.getMessage());
} //最终通知
@After("myPointCut()")
public void myAfter() {
System.out.println("最终通知,始终要执行");
}
}
接口Dao
public interface Dao {
public void addUser();
public void deleteUser();
}
实现接口UserDaoImp 类
@Repository("Dao")//spring注解,标示为spring中的bean,相当于在spring中的配置<bean id="Dao" class="类的全限定路径.UserDaoImp"/>
public class UserDaoImp implements Dao {
@Override
public void addUser() {
System.out.println("添加用户");
} @Override
public void deleteUser() {
System.out.println("删除用户");
}
}

 在xml中的配置

指定需要扫描的包

<contxt:component-scan base-package="com.itheima.ioc"/>
使注解生效
<aop:aspectj-autoproxy/>

最后测试和基于xml声明的测试是一样的,结果也一样。

 
												

AspectJ开发的更多相关文章

  1. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring使用AspectJ开发AOP基于XML和基于Annotation

    AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言.Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 Aspe ...

  2. Spring学习之Aspectj开发实现AOP

    Aspectj是一个基于Java语言的Aop框架,它提供了强大的Aop功能. Aspectj简介: 1.Aspectj是一个面向切面的框架,它扩展了Java语言,它定义了一个Aop语法. 2.所以它有 ...

  3. Spring使用AspectJ开发AOP:基于XML

    基于XML的声明式 基于 XML 的声明式是指通过 Spring 配置文件的方式定义切面.切入点及声明通知,而所有的切面和通知都必须定义在 <aop:config> 元素中. 下面通过案例 ...

  4. Spring使用AspectJ开发AOP:基于Annotation

    基于 Annotation 的声明式 在 Spring 中,尽管使用 XML 配置文件可以实现 AOP 开发,但是如果所有的相关的配置都集中在配置文件中,势必会导致 XML 配置文件过于臃肿,从而给维 ...

  5. Spring使用@AspectJ开发AOP(零配置文件)

    前言: AOP并不是Spring框架特有的.Spring只是支持AOP编程 (面向切面编程) 的框架之一. 概念: 1.切面(Aspect) 一系列Advice + Pointcut 的集合. 2.通 ...

  6. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  7. Spring基于AspectJ的AOP的开发——注解

    源码:https://gitee.com/kszsa/dchart 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专 ...

  8. Java开源运行分析工具(转)

      FProfiler  FProfiler是一个非常快的Java profiler.它利用BCEL和log4j来记录每个方法从开始到结尾的日记.FProfiler可以用来在你的应用程序,Servle ...

  9. Java EE学习笔记(三)

    Spring AOP 1.Spring AOP简介 1).AOP的全称是Aspect-Oriented Programming,即面向切面编程(也称面向方面编程).它是面向对象编程(OOP)的一种补充 ...

随机推荐

  1. js常见的排序算法

    最近面试可能会问这些 1,插入排序 function sort(elements){ var res =[elements[0]]; for (var i = 0; i < elements.l ...

  2. maven将项目及第三方jar打成一个jar包

    pom.xml中添加如下配置 把依赖包和自己项目的文件打包如同一个jar包(这种方式对spring的项目不支持) <build> <plugins> <plugin> ...

  3. QML学习笔记(五)— 做一个简单的待做事项列表

    做一个简单的QML待做事项列表,能够动态添加和删除和编辑数据 GitHub:八至 作者:狐狸家的鱼 本文链接:QML学习笔记(五)— 做一个待做事项列表 主要用到QML:ListView 效果 全部代 ...

  4. [luogu3939][数颜色]

    题目链接 思路 对于每一种颜色都建立一个动态开点线段树.然后每次查询的时候就去这个颜色的线段树上查询就行了.修改之后不要忘记交换颜色. 这个题目数据有点强.抄了个比较快的读入优化才卡过去. 代码 /* ...

  5. PMP项目管理考试培训机构内部资料打包赠送(3个PPT)

    PMP认证考试我自己这边是今年6月份考过了的,手里觉得对自己有帮助的资料就是这3个PPT,讲解的比较清晰,知识点详细.结合自己做的笔记,备考十分轻松.所以推荐大家也看一下. 有需要的可以联系. PPT ...

  6. python zip()函数的使用

    解释: 后缀为zip的文件肯定都见过吧?zip是打包压缩好的一个文件,所以,zip()函数也简单的理解为打包压缩函数,将不同个数相同类型的字段结合在一起. 官方定义为:zip() 函数用于将可迭代的对 ...

  7. SpringBoot+Shiro+Redis共享Session入门小栗子

    在单机版的Springboot+Shiro的基础上,这次实现共享Session. 这里没有自己写RedisManager.SessionDAO.用的 crazycake 写的开源插件 pom.xml ...

  8. Codeforces Round #525 (Div. 2)

    Codeforces Round #525 (Div. 2) 哎,忍不住想吐槽一下,又要准备训练,又要做些无聊的事,弄得我都想退出了. 好好的训练不好么???? 只能做出两道水题,其实C题,感觉做出来 ...

  9. php5.4后htmlspecialchars输出为空的问题

    从旧版升级到php5.4,恐怕最麻烦的就是htmlspecialchars这个问题了!当然,htmlentities也会受影响,不过,对于中文站来说一般用htmlspecialchars比较常见,ht ...

  10. mysql 5.7安装准备

    在5.5之后的mysql安装中,需要使用cmake来指定安装参数,下面列出关于cmake的几个常用参数: CMAKE_INSTALL_PREFIX:指定MySQL程序的安装目录,默认/usr/loca ...