spring之AspectJ基于注解 AOP编程
一、前言
使用注解代替之前在spring配置文件中配置目标类、切面类和aop配置。
二、注意
- 需要注意的是,需要在spring配置文件中引入如下,如果不添加,切面类中的@Aspect注解将不起作用
<aop:aspectj-autoproxy/>
使用的时候通知单独使用
- 导入的jar包

- 当有多个切面,需要考虑其优先级时切面类使用@Order(数字:越小优先级越高) 参考:https://www.cnblogs.com/dreamfree/p/4102619.html
三、注解的使用
切面类:
@Aspect 声明切面,修饰切面类,从而获得 通知。
通知:
@Before 前置
@AfterReturning 后置
@Around 环绕
@AfterThrowing 抛出异常
@After 最终
切入点:
@PointCut ,修饰方法 private void xxx(){} 之后通过“方法名”获得切入点引用
四、代码实现
beans.xml
<!-- 扫描注解 -->
<context:component-scan base-package="com.xx"/>
<!-- aspectj自动代理 -->
<aop:aspectj-autoproxy/>
切面类:通知单独使用
package com.xx.myaspect; import java.util.Arrays; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
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.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* 切面类
* @author phoebe
* @Component:类级注解
* @Aspect:切面注解
*/
@Component
@Aspect
@Order(1)
public class MyAscpect { /*
* 切点,方法名即是切点的id
* 后面的切点直接引用方法名称即可
* 方法体不需要再配置其他
*/
@Pointcut(value="execution(* com.xx.dao.UserDaoImpl.*(..))") public void pointCut(){}
/*
* 前置通知
* JoinPoint:带有方法名称
*/
@Before("pointCut()")
public void before(JoinPoint joinPoint){
String methodName = joinPoint.getSignature().getName();
System.out.println("方法名称是:"+methodName);
} /*
* 环绕通知需要携带ProceedingJoinPoint类型的参数
* 环绕通知类似于动态代理的全过程:ProceedingJoinPoint类型的参数可以决定是否执行目标方法。
* 而且环绕通知必须有返回值,返回值即为目标方法的返回值
*
*/
@Around(value="pointCut()")
public Object arround(ProceedingJoinPoint pjp){
Object obj = null;
String methodName = pjp.getSignature().getName();
try {
//前置通知@Before
System.out.println("The method " + methodName + " begins with " + Arrays.asList(pjp.getArgs()));
//执行目标方法
obj = pjp.proceed();
//后置通知@After
System.out.println("The method " + methodName + " ends with " + Arrays.asList(pjp.getArgs()));
} catch (Throwable e) {
//异常通知@AfterThrowing
System.out.println("The method " + methodName + " occurs expection : " + e);
throw new RuntimeException(e);
}
//返回通知@AfterReturning
System.out.println("The method " + methodName + " ends");
return obj;
} }
dao接口类:
package com.xx.dao;
public interface UserDao {
public void run1();
public void run2();
public void run3();
}
dao实现类
package com.xx.dao;
import org.springframework.stereotype.Repository; @Repository("userDaoImpl")
public class UserDaoImpl implements UserDao{
@Override
public void run1() {
int x = 1/0;
System.out.println("run1");
}
@Override
public void run2() {
System.out.println("run2");
}
@Override
public void run3() {
System.out.println("run3");
}
}
测试类:
package com.xx;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.xx.dao.UserDao; public class Test {
public static void main(String[] args) {
String xmlPath = "classpath:beans.xml";
ApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);
UserDao userDao = (UserDao) context.getBean("userDaoImpl");
userDao.run1();
userDao.run2();
userDao.run3();
}
}
spring之AspectJ基于注解 AOP编程的更多相关文章
- spring之AspectJ基于xml AOP编程
一.引言: AspectJ框架不仅实现了面向切面编程,而且还支持注解,spring将它引入自己的规范之中. 二.需要了解: AspectJ是基于java语言的AOP框架 spring2.0之后支持As ...
- 使用 Spring 2.5 基于注解驱动的 Spring MVC
http://www.ibm.com/developerworks/cn/java/j-lo-spring25-mvc/ 概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Sp ...
- 使用 Spring 2.5 基于注解驱动的 Spring MVC--转
概述 继 Spring 2.0 对 Spring MVC 进行重大升级后,Spring 2.5 又为 Spring MVC 引入了注解驱动功能.现在你无须让 Controller 继承任何接口,无需在 ...
- spring的AspectJ基于XML和注解(前置、后置、环绕、抛出异常、最终通知)
1.概念 (1)AspectJ是一个基于Java语言的AOP框架 (2)Spring2.0以后新增了对AspectJ切入点表达式的支持 (3)AspectJ是AspectJ1.5的新增功能,通过JDK ...
- 一步一步深入spring(5)--使用基于注解的spring实现 AOP
1.要利用spring aop,至少需要添加以下jar包 使用spring需要的jarspring.jar .commons-logging.jar 使用切面编程(AOP)需要的jar aspectj ...
- Spring MVC中基于注解的 Controller
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法以响 ...
- Spring IOC之基于注解的容器配置
Spring配置中注解比XML更好吗?基于注解的配置的介绍提出的问题是否这种途径比XML更好.简单来说就是视情况而定. 长一点的答案是每一种方法都有自己的长处也不足,而且这个通常取决于开发者决定哪一种 ...
- 【spring】之基于注解@ComponentScan的一些使用
基于xml形式ComponentScan的使用如下 <context:component-scan base-package="com.luna" use-default-f ...
- Spring(七)之基于注解配置
基于注解的配置 从 Spring 2.5 开始就可以使用注解来配置依赖注入.而不是采用 XML 来描述一个 bean 连线,你可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身. ...
随机推荐
- <魔域>按键精灵脚本
用了三天时间才写完,实现了通过图片识别读取坐标数值,自动寻路等简单功能. 主要的难点在于游戏中的坐标系,和电脑屏幕的坐标系存在三维旋转关系,难以换算. //全局变量:第一个数左上右下坐标 Global ...
- Spring Boot项目构建
环境准备 IDEA+JDK 1.8+Maven+mysql+SSM 1.使用Spring Boot框架可以大大加速Web应用的开发过程,首先在Maven项目依赖中引入spring-boot-start ...
- 在mac下使用终端命令通过ssh协议连接远程linux系统,代替windows的putty
指令:ssh username@server.address.com 事例:wangmingdeMacBook-Pro:~ xxxxxxxxxx$ ssh root@XXXX.net The auth ...
- Sql的基础知识提升(二)
二.提升 1.说明:复制表(只复制结构,源表名:a 新表名:b) (Access 可用) 法一:select * into b from a where 1<>1(仅用于 SQlServe ...
- 统计0到n之间1的个数[数学,动态规划dp](经典,详解)
问题描述 给定一个十进制整数N,求出从1到N的所有整数中出现”1”的个数. 例如:N=2时 1,2出现了1个 “1” . N=12时 1,2,3,4,5,6,7,8,9,10,11,12.出现了5个 ...
- 【易语言学习】Day1
个人认为网上讲的都不是很好,查阅了各类资料,特意找了份比较不错的PDF版,需要的可以私聊我~~~ 今天就看到这里了,请听下回分解
- Vijos P1785 同学排序【模拟】
同学排序 描述 现有m位同学,第1位同学为1号,第2位同学为2号,依次第m位同学为m号.要求双号的学生站出来,然后余下的重新组合,组合完后,再次让双号的学生站出来,重复n次,问这时有多少同学出来站着? ...
- win10系统下如何用命令行的方式打开画图软件
按 win + r 后输入命令 mspaint 再 回车 即可!如下图所示:
- c++(递归和堆栈)
看过我前面博客的朋友都清楚,函数调用主要依靠ebp和esp的堆栈互动来实现的.那么递归呢,最主要的特色就是函数自己调用自己.如果一个函数调用的是自己本身,那么这个函数就是递归函数. 我们可以看一下普通 ...
- 将本地项目或代码上传到别人GitHub(码云)的远程分支上
今天碰到了这样一个问题,折腾了半天,就是将自己本地代码上传到人家的远程分支上. 首先要做的就是先将人家的项目克隆到本地:git clone + 项目地址 然后进入项目目录:cd + 已克隆好的项目目录 ...