Spring基于AspectJ的AOP的开发——注解
源码:https://gitee.com/kszsa/dchart
一, AspectJ的概述:
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
Spring为了简化自身的AOP的开发,将AspectJ拿过来作为Spring自身一个AOP的开发.
二, Spring AspectJ开发实例
2.1 开发所需jar包
maven中相关包引入
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- aspectJ依赖包 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>${aspectj.version}</version>
</dependency>
2.2 AspectJ 注解开发规范
2.2.1 AspectJ的切入点:
//统一管理切入点的表达式.
@Pointcut(value="execution(* com.dchart.aop.service.CustomerService+.find(..))")
private void myPointcut1(){}//这个类没有实际用途, 只是为了@Pointcut 注解
2.2.2 @AspectJ提供不同的通知类型
@Before 前置通知,相当于BeforeAdvice
在执行目标方法之前完成一个操作,获得到切入点信息.
@Before(value="execution(* com.dchart.aop.service.CustomerService+.save(..))")
public void before(JoinPoint joinPoint){
System.out.println("前置通知============"+joinPoint);
}
@AfterReturning 后置通知,相当于AfterReturningAdvice
在目标方法执行之后完成一个操作,获得方法的返回值.
@AfterReturning(value="execution(* com.dchart.aop.service.CustomerService+.update(..))",returning="result")
public void afterReturn(Object result){
System.out.println("后置通知============"+result);
}
@Around 环绕通知,相当于MethodInterceptor
在目标方法执行的前和执行后完成一个操作,阻止目标方法执行.
@Around(value="execution(* com.dchart.aop.service.CustomerService+.delete(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("环绕前通知==========");
Object obj = joinPoint.proceed();
System.out.println("环绕后通知==========");
return obj;
}
@AfterThrowing抛出通知,相当于ThrowAdvice
在目标方法出现异常的时候,完成一个操作.获得异常信息.
@AfterThrowing(value="CustomerServiceAspect.myPointcut1()",throwing="e")
public void afterThrowing(Throwable e){
System.out.println("异常抛出通知========="+e.getMessage());
}
@After 最终final通知,不管是否异常,该通知都会执行
在目标方法任何情况下都会执行的操作.相当于finally中的代码.
@After(value="CustomerServiceAspect.myPointcut1()")
public void after(){
System.out.println("最终通知===========");
}
2.2.3 通过配置启用@AspectJ切面
1、开启AspectJ的自动代理
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 开启AspectJ自动代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> </beans>
2、对应的切面类添加注解
2.2.4 Aspect和Advisor的区别:
Advisor :传统的切面.传统切面一般都是由一个切入点和一个通知的组合.
Aspect :真正意义上的切面.由多个切入点和多个通知的组合.
2.2.5 在通知中通过value属性定义切点
通过execution函数,可以定义切点的方法切入
语法:
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
例如
匹配所有类public方法 execution(public * *(..))
匹配指定包下所有类方法 execution(* cn.itcast.dao.*(..)) 不包含子包
execution(* cn.itcast.dao..*(..)) ..*表示包、子孙包下所有类
匹配指定类所有方法 execution(* cn.itcast.service.UserService.*(..))
匹配实现特定接口所有类方法 execution(* cn.itcast.dao.GenericDAO+.*(..))
匹配所有save开头的方法 execution(* save*(..))
2.3 Spring AspctJ 基于注解模式的开发例子
定义接口CustomerService.java
package com.dchart.aop.service; public interface CustomerService { public void save(); public Integer update(); public void delete(); public void find(); }
接口实现
CustomerServiceImp.java
package com.dchart.aop.service.imp; import com.dchart.aop.service.CustomerService; public class CustomerServiceImp implements CustomerService { @Override
public void save() {
System.out.println("保存客户...");
} @Override
public Integer update() {
System.out.println("修改客户...");
return 100;
} @Override
public void delete() {
System.out.println("删除客户...");
} @Override
public void find() {
System.out.println("查询客户...");
// int d = 1 / 0;
} }
编写切面类
CustomerServiceAspect.java
package com.dchart.aop.service.aspect; import org.aspectj.lang.JoinPoint;
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; @Aspect
public class CustomerServiceAspect { //统一管理切入点的表达式.
@Pointcut(value="execution(* com.dchart.aop.service.CustomerService+.find(..))")
private void myPointcut1(){}//这个类没有实际用途, 只是为了@Pointcut 注解 @Before(value="execution(* com.dchart.aop.service.CustomerService+.save(..))")
public void before(JoinPoint joinPoint){
System.out.println("前置通知============"+joinPoint);
} @AfterReturning(value="execution(* com.dchart.aop.service.CustomerService+.update(..))",returning="result")
public void afterReturn(Object result){
System.out.println("后置通知============"+result);
} @Around(value="execution(* com.dchart.aop.service.CustomerService+.delete(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable{
System.out.println("环绕前通知==========");
Object obj = joinPoint.proceed();
System.out.println("环绕后通知==========");
return obj;
} @AfterThrowing(value="CustomerServiceAspect.myPointcut1()",throwing="e")
public void afterThrowing(Throwable e){
System.out.println("异常抛出通知========="+e.getMessage());
} @After(value="CustomerServiceAspect.myPointcut1()")
public void after(){
System.out.println("最终通知===========");
} }
单元测试类CustomerServiceImpTest.java
package com.dchart.aop.service.imp; import static org.junit.Assert.*; import javax.annotation.Resource; import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.dchart.aop.service.CustomerService; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:spring_aop.xml")
public class CustomerServiceImpTest { @Resource(name="customerService")
private CustomerService customerService; @Test
public void test() {
customerService.save();
customerService.update();
customerService.delete();
customerService.find();
} }
Spring 配置文件:spring_aop.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 开启AspectJ自动代理 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
<!-- 目标对象 -->
<bean id="customerService" class="com.dchart.aop.service.imp.CustomerServiceImp" />
<!-- 配置切面 -->
<bean id="myAspectAnno" class="com.dchart.aop.service.aspect.CustomerServiceAspect" /> </beans>
运行结果:
源码:https://gitee.com/kszsa/dchart
参考地址:http://www.cnblogs.com/wang-meng/p/5641687.html
Spring基于AspectJ的AOP的开发——注解的更多相关文章
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...
- Spring 基于 AspectJ 的 AOP 开发
Spring 基于 AspectJ 的 AOP 开发 在 Spring 的 aop 代理方式中, AspectJ 才是主流. 1. AspectJ 简介 AspectJ 是一个基于 java 语言的 ...
- (转)Spring使用AspectJ进行AOP的开发:注解方式
http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ...
- Spring基于AspectJ的AOP的开发之AOP的相关术语
1. Joinpoint(连接点) -- 所谓连接点是指那些被拦截到的点.在spring中,这些点指的是方法,因为spring只支持方法类型的连接点(任何一个方法都可以称为连接点) 2. Pointc ...
- Spring整合AspectJ的AOP
学而时习之,不亦说乎! --<论语> 看这一篇之前最好先看前面关于AOP的两篇. http://www.cnblogs.com/z ...
- 利用基于@AspectJ的AOP实现权限控制
一. AOP与@AspectJ AOP 是 Aspect Oriented Programming 的缩写,意思是面向方面的编程.我们在系统开发中可以提取出很多共性的东西作为一个 Aspect,可以理 ...
- Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探
由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现. 本文一下未贴出的相关代码示例请关注小编的上篇博文<Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AO ...
- Spring框架学习09——基于AspectJ的AOP开发
1.基于注解开发AspectJ (1)AspectJ注解 基于注解开发AspectJ要比基于XML配置开发AspectJ便捷许多,所以在实际开发中推荐使用注解方式.关于注解的相关内容如下: @Aspe ...
- 基于aspectj的aop注解操作
随机推荐
- telnet 测试网站是否开启长连接
测试服务器是否开启keepalive(长连接) telnet 主机名(域名|IP) 80 #发起请求GET /index.html HTTP/1.1Host: www.cbnsc.com 如果请求完后 ...
- [翻译]SQL Server等待事件—THREADPOOL
前言: 本文是对SQLSkills上一篇关于SQL Server中THREADPOOL等待的博客的翻译,本文也不是完全翻译,有些地方适当加入了自己的一些认知.如有翻译不对或不好的地方,敬请指出,大 ...
- [翻译]LVM中逻辑卷的最大大小限制
前言: 本文是对这篇博客Maximum Size Of A Logical Volume In LVM的翻译,敬请尊重原创和翻译劳动成果,那些随意转载的大爷们,好歹也自觉注明出处.谢谢! 英文原文地址 ...
- 谈谈装xp官方纯净系统屡次失败的深刻体会
有木有,小硬盘小内存的电脑竟然装不了五六百m大小的xp却能装win7之类的而感到痛失,如果去装win7电脑果断卡死, 用了最流行的制作u盘启动的软件都不行, 任何直接点击安装也不行,点不了安装的那个选 ...
- linux卸载openjdk
本来不想写的网上的东西罗嗦死了 sudo apt-get purge openjdk*
- 第二章 基础查询 2-1 SQL语句基础
一.列的查询 基本的SELECT语句: SELECT <列名 >,...... FROM < 表名>; 注:子句是SQL的组成要素. 注:查询结果中的列的顺序和SELECT子句 ...
- Uvision4创建工程
创建工程 创建好工程会出现如下的界面 创建文件( .asm 或 .c ) 选择菜单栏中的File->New- 按 Ctrl+S 保存文件并填写文件名 添加到之前创建的工程中 选择Target1- ...
- asp.net Web项目中使用Log4Net进行错误日志记录
使用log4net可以很方便地为应用添加日志功能.应用Log4net,开发者可以很精确地控制日志信息的输出,减少了多余信息,提高了日志记录性能.同时,通过外部配置文件,用户可以不用重新编译程序就能 ...
- Google开源GSON的使用
* 谷歌开原项目GitHub地址:https://github.com/google/gson 1.新建一个maven项目,引入gson的dependency坐标依赖以及commons-io的坐标: ...
- 安全之路 —— 利用APC队列实现跨进程注入
简介 在之前的文章中笔者曾经为大家介绍过使用CreateRemoteThread函数来实现远程线程注入(链接),毫无疑问最经典的注入方式,但也因为如此,这种方式到今天已经几乎被所有安全软件所防御.所以 ...