springAop注解式Demo
package AnnoAspect.Aspect; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component; /**
* 切面类
*/
@Component
@Aspect
public class MyAspect2 { /**
* 前置通知
*/
@Before(value = "execution(* AnnoAspect.dao.*.save(..))")
public void before(){
System.out.println("前置通知");
} /**
* 后置通知 并且拿到方法返回值
*/
//@AfterReturning(value = "execution(* AnnoAspect.dao.*.delete(..))",returning = "result")
@AfterReturning(value = "MyAspect2.ponitCut1()",returning = "result")//使用同一切入点注解
public void afterReturn(Object result){
System.out.println("后置通知"+result);
} /**
* 环绕通知
*/
@Around(value = "execution(* AnnoAspect.dao.*.update(..))" )
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("环绕通知前");
Object proceed = joinPoint.proceed();
System.out.println("环绕通知后");
return proceed;
} @AfterThrowing(value = "execution(* AnnoAspect.dao.*.find(..))",throwing = "e")
public void throwing(Throwable e){
System.out.println("异常抛出通知!!!");
System.out.println(e.getMessage());//获得异常信息
} @After(value = "execution(* AnnoAspect.dao.*.find(..))")
public void After(){
System.out.println("最终通知!!!");
} //切入点注解 相当于有一个方法 有多种通知 相当于将切入点其封装下
@Pointcut(value = "execution(* AnnoAspect.dao.*.delete(..)))")
private void ponitCut1(){ }//方法并无实际意义 }
package AnnoAspect.dao; import org.springframework.stereotype.Repository; //这边不适用接口 考察aop的cglib动态代理
@Repository("orderDao")
public class OrderDao { public void save() {
System.out.println("add order!");
} public String delete() {
System.out.println("delete order!");
return "abc";
} public void update() {
System.out.println("update order!");
} public void find() {
System.out.println("find order!");
int i=1/0;
} }
package AnnoAspect.test; import AnnoAspect.dao.OrderDao;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.annotation.Resource; @RunWith(value = SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml" )
public class Test { @Resource(name = "orderDao")
private OrderDao orderDao; @org.junit.Test
public void test1() { orderDao.delete();
}
}
注意:这边目标类并没有实现接口,所以切面类进行增强的时候是通过cglib动态代理的方式进行方法的扩展增强!
<?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:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"> <!--开启注解aop 自动产生代理-->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy> <!--扫描包-->
<context:component-scan base-package="aop.*,AnnoAspect.*"></context:component-scan> <!-- 在配置文件中开启注解的AOP的开发============ -->
<aop:aspectj-autoproxy/> <!-- 配置目标类================ -->
<!--<bean id="productDao" class="aop.dao.ProductDaoImpl">
</bean>--> <!-- 配置切面类================ -->
<bean id="myAspect" class="aop.Aspect.Aspect"></bean> <!--通过aop配置对目标类增强-->
<aop:config>
<!--切入点 配置哪些类那些方法被增强-->
<aop:pointcut id="p1" expression="execution(* aop.dao.ProductDaoImpl.save(..))"></aop:pointcut>
<aop:pointcut id="p2" expression="execution(* aop.dao.ProductDaoImpl.delete(..))"></aop:pointcut>
<aop:pointcut id="p3" expression="execution(* aop.dao.ProductDaoImpl.update(..))"></aop:pointcut>
<aop:pointcut id="p4" expression="execution(* aop.dao.ProductDaoImpl.query(..))"></aop:pointcut>
<!--通知 配置通知类-->
<aop:aspect ref="myAspect" >
<!--前置通知-->
<aop:before method="checkPri" pointcut-ref="p1"></aop:before>
<aop:after-returning method="logPrint" pointcut-ref="p2" returning="result"></aop:after-returning>
<aop:around method="watch" pointcut-ref="p3"></aop:around>
<aop:after-throwing method="afterAfterThrowing" pointcut-ref="p4" throwing="ex"></aop:after-throwing>
<aop:after method="after" pointcut-ref="p2" ></aop:after>
</aop:aspect>
</aop:config>
</beans>

注解式aop要配置上这句话,pom文件所引入的jar包与上一篇文章一致
springAop注解式Demo的更多相关文章
- 《SpringMVC从入门到放肆》八、SpringMVC注解式开发(基本配置)
上一篇我们结束了配置式开发,配置式开发目前在企业中用的并不是很多,大部分企业都在使用注解式开发,所以今天我们就来学习注解式开发.所谓SpringMVC注解式开发是指,处理器是基于注解的类的开发方式.对 ...
- SpringMVC学习系列(9) 之 实现注解式权限验证
对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servlet中的过滤器Filter来实现.但借助于Spring MV ...
- SpringMVC实现注解式权限验证
SpringMVC学习系列(9) 之 实现注解式权限验证 对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用servle ...
- SpringMVC实现注解式权限验证(转)
SpringMVC学习系列(9) 之 实现注解式权限验证 对大部分系统来说都需要权限管理来决定不同用户可以看到哪些内容,那么如何在Spring MVC中实现权限验证呢?当然我们可以继续使用serv ...
- SpringMVC 注解式开发
SpringMVC的注解式开发是指,处理器是基于注解的类的开发.对于每一个定义的处理器,无需再配置文件中逐个注册,只需在代码中通过对类与方法的注解,便可完成注册.即注解替换是配置文件中对于处理器的注册 ...
- 《SpringMVC从入门到放肆》九、SpringMVC注解式开发(简单参数接收)
上一篇我们学习了注解式开发的配置方式并写了一个小Demo跑起来.今天我们来学习注解开发的参数接收.处理器方法中的常用参数有五类,这些参数会在系统调用时由系统自动赋值,即程序员可以在方法中直接使用.具体 ...
- SpringBoot —— AOP注解式拦截与方法规则拦截
AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件. SpringBoot中AOP的使用 ...
- 框架整合小小总结【SSH】注解式
Spring 注解式注册 bean: 大致分为以下几步: 开启 context 空间支持 开启自动扫描功能,指定扫描包路径 使用注解配置 bean (使用@Component 注解) 给 bean 注 ...
- AOP注解式拦截
1. 自己定义的拦截注解 package com.spring.aop; import java.lang.annotation.Documented; import java.lang.annota ...
随机推荐
- [Leetcode easy]存些水题34、20、700
leetcode 34 最早出现和最后出现 class Solution { public int[] searchRange(int[] nums, int target) { int []ans= ...
- el和jstl标签库讲解视频
https://www.bilibili.com/video/av22415283/?p=1
- Python 天气查询到实现语音播放
import requests #引用requests模块import pygame # 获取天气def inquery(self): url = "https://free-api.hew ...
- php上传文件配置
根据需要调整php.ini文件内容,完成后重启服务器即可. 上传文件相关配置内容: file_uploads = on ;是否允许通过HTTP上传文件的开关.默认为ON即是开 upload_tmp_d ...
- Curve 曲线 工具
最近研究了曲线绘制的工具,主要是2D方程的绘制.综合了许多工具,完成了一下两个脚本. 绘制的工具: using UnityEngine; using System.Collections; using ...
- JS中的一元操作符
表达式 一元操作符 优先级 结合性 运算顺序 表达式是什么? 就是JS 中的一个短语,解释器遇到这个短语以后会把对它进行计算,得到一个结果参与运算,我们把这种要参与到运算中的各种各样的短语称为表达式. ...
- 高精度加法——经典题 洛谷p1601
题目背景 无 题目描述 高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b] 输入输出格式 输入格式: 分两行输入a,b<=10^500 ...
- vim/network/ssh语法
一.编辑器——vim vi编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界面,vi是效率很高的文本编辑器.尽管在Linux上也有很多图形界面的编辑器可用,但vi在系 ...
- Docker 学习新手笔记:从入门到放弃
本文记录的是作为一个新手,从了解 Docker 是什么.Docker 技术包含哪些概念到上手使用.安装以及发布 Docker 镜像的整个过程.作者在学习过程中参阅了诸多文档和教程,在此一并感谢,与此同 ...
- json&pickle模块
序列化:我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化 反序列化:把变量内容从序列化的对象重新读到内存中,这一过程称为反序列化 为什么要序列化? 1.持久保存状态 一个软件的执行就是在处 ...