AOP 面向切面编程,是 OOP (面向对象编程)的补充
术语
横切关注点:方法中非主要业务逻辑部分
比如运算的模块:有验证参数、执行方法前的操作、执行方法、执行方法后的操作,验证参数、执行方法前后的操作是横切关注点
比如权限验证模块:在执行增删改查等方法前要进行验证,主要业务逻辑其实是增删改查,验证权限是横切关注点
比如日志模块:执行某方法前后都要生成文件或者往文件写入记录,日志记录是横切关注点
切面:横切关注点的抽象到一个类中
就是把横切关注点封装成一个类,在主要业务逻辑执行根据情况来调用
声明切面的步骤:1,把该类放入 IOC 容器,进行管理;2,使用注解 @Aspect 表明这是一个切面
通知:是切面类中的方法,用于在目标方法执行时执行
前置通知(@Before):目标方法执行前
后置通知(@After):目标方法执行后,无论是否发生异常
返回通知(@AfterRunning):目标方法正常结束后执行,可以知道目标方法的返回值
异常通知(@AfterThrowing):目标方法产生异常时执行,可以访问异常对象,进行打印,也可以指定异常才执行
环绕通知@(Around):包含上面4种
声明通知的步骤:1,指明通知类型;2,指明目标方法;3,配置文件使通知生效
连接点:用于获取目标方法的详细信息,方法名,参数值;JoinPoint
示例:
/**
* .切面类
* .第一步:添加 @Aspect 注解
* .第二步:添加 @Component 注解
* .第三步:指明通知类型和目标方法
*/
@Aspect
@Component
public class AspectCompute {
/**
* .第一个 * :任意返回值
* .第二个 * :com.weipai.service 包下的任意类
* .第三个 * :任意方法
* .(..):所有参数,不区分类型
*/
@Before("execution(* com.weipai.service.*.*(..))")
public void beforeMethod(JoinPoint info) {
// 获取目标方法名
String methodName = info.getSignature().getName();
// 获取目标方法参数值
List<Object> args = Arrays.asList(info.getArgs());
System.out.println("前置通知,方法名:" + methodName + ",参数:" + args);
}
}
@Service("compute")
public class Compute {
public void add(int i, int j, String k) {
System.out.println(i + j + k);
}
}
<!-- 扫描,支持spring注解 -->
<context:component-scan base-package="com.weipai.aspect,com.weipai.service" /> <!-- 配置 aspect :自动生成代理类 -->
<aop:aspectj-autoproxy />
public class ComputeTest extends TestCase { private ApplicationContext ctx;
private Compute comp; protected void setUp() throws Exception {
ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
comp = (Compute) ctx.getBean("compute");
} public void testAdd() {
comp.add(1, 3, "hello");
} }
基于Aspectj 注解实现 spring AOP的更多相关文章
-
Spring Aop(二)——基于Aspectj注解的Spring Aop简单实现
转发地址:https://www.iteye.com/blog/elim-2394762 2 基于Aspectj注解的Spring Aop简单实现 Spring Aop是基于Aop框架Aspectj实 ...
-
Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
-
Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较
本篇博文用一个稍复杂点的案例来对比一下基于XML配置与基于AspectJ注解配置的AOP编程的不同. 相关引入包等Spring AOP编程准备,请参考小编的其他博文,这里不再赘述. 案例要求: 写一 ...
-
使用@AspectJ注解开发Spring AOP
一.实体类: Role public class Role { private int id; private String roleName; private String note; @Overr ...
-
spring 使用@AspectJ注解开发Spring AOP
选择切点 Spring是方法级别的AOP框架,而我们主要也是以某个类的某个方法作为切点,用动态代理的理论来说,就是要拦截哪个方法织入对应AOP通知. 代码清单:打印角色接口 package com.s ...
-
Spring Aop(四)——基于Aspectj注解的Advice介绍
转发地址:https://www.iteye.com/blog/elim-2395315 4 基于Aspectj注解的Advice介绍 之前介绍过,Advice一共有五种类型,分别是before.af ...
-
基于注解的Spring AOP的配置和使用
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
-
基于注解的Spring AOP示例
基于注解的Spring AOP示例 目录 在XML配置文件中开启 @AspectJ 支持 声明切面及切入点 声明通知 测试 结语 在XML配置文件中开启 @AspectJ 支持 要使用Spring的A ...
-
基于注解的Spring AOP的配置和使用--转载
AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术. ...
随机推荐
-
MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL
MDK st-link下载STM32程序出现Internal command error和Error:Flash download failed. Target DLL 是因为目标板的芯片处于休眠 ...
-
java 动态编译
public class Main { public static void main(String[] args) { System.out.println("Hello World!&q ...
-
(传输层)UDP协议
目录 数据单位特点具体实现要求UDP首部格式发送UDP请求的客户端图释 数据单位 UDP 传送的数据单位协议是 UDP 报文或用户数据报 特点 UDP 是无连接的,即发送数据之前不需要建立连接 UDP ...
-
JBuilder链接sql server数据库
加载你的jdbc的驱动 一.将jdbc驱动解压到一个指定的目录,例如:c:\sql_server_jdbc, 其中包含三个驱动文件:msbase. ...
-
poj1434Fill the Cisterns!(二分)
链接 题目说给你n个水箱,初始是没有水的,每个的高低位置可能不同,给了你初始的水箱底部所处的水平线位置,问给你V体积水时,水的水平线位置. 直接二分位置p,对于每一个底部低于水平线位置的水箱,里面的水 ...
-
[POJ3694]Network(LCA, 割边, 桥)
题目链接:http://poj.org/problem?id=3694 题意:给一张图,每次加一条边,问割边数量. tarjan先找出所有割边,并且记录每个点的父亲和来自于哪一条边,然后询问的时候从两 ...
-
【oracle】oracle函数-数值函数
一.数值函数 1. mod(m,n) 求余函数 注意:若m或者n为null,则返回null.若n为0,则返回m的值 eg:
-
策略模式--List排序
需求:根据姓名进行排序,升序或者降序,如果名字一样,就按照id升序排序,用策略模式 步骤一: 定义一个Person对象 public class Person { private Integer id ...
-
Ubuntu里设置python默认版本为python3(转载)
0 - 步骤 在命令行中执行下述命令: sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 sudo ...
-
(转)[Python 网络编程] makefile (三)
socket.makefile(mode ='r',buffering = None,*,encoding = None,errors = None,newline = None )返回一个与套接字相 ...