1 xml配置

1 导包

2 准备对象

package www.test.service;

public interface UserService {

    public abstract void add();
public abstract void delete();
public abstract void update();
public abstract void find();
}
package www.test.service;

public class UserServiceImpl implements UserService {
@Override
//添加用户
public void add() {
System.out.println("添加用户");
//int i = 1/0;
}
@Override
//删除用户
public void delete() {
System.out.println("删除用户");
}
@Override
//修改用户
public void update() {
System.out.println("修改用户");
}
@Override
//查找用户
public void find() {
System.out.println("查找用户");
}
}

3 准备通知

package www.test.d_springaop;

import org.aspectj.lang.ProceedingJoinPoint;

//通知类
public class MyAdvice { //前置通知
// |-目标方法运行之前调用
//后置通知(如果出现异常不会调用)
// |-在目标方法运行之后调用
//环绕通知
// |-在目标方法之前和之后都调用
//异常拦截通知
// |-如果出现异常,就会调用
//后置通知(无论是否出现 异常都会调用)
// |-在目标方法运行之后调用
//================================================= //前置通知
public void before(){
System.out.println("这是前置通知");
} //后置通知
public void afterReturning(){
System.out.println("这是后置通知(如果出现异常不会调用)");
} //环绕通知
public Object around( ProceedingJoinPoint pjp) throws Throwable{
System.out.println("这是环绕通知之前的部分");
Object proceed = pjp.proceed();
System.out.println("这是环绕通知之后的部分");
return proceed;
} //异常拦截通知
public void afterException(){
System.out.println("出事啦!出现异常了");
} //后置通知
public void after(){
System.out.println("这是后置通知(出现异常也会调用)");
} }

4 配置进行织入,将通知织入目标对象中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
<!-- 准备工作: 导入aop(约束)命名空间 -->
<!-- 1.配置目标对象 -->
<bean name="userService" class="www.test.service.UserServiceImpl"></bean>
<!-- 2.配置通知对象 -->
<bean name="myAdvice" class="www.test.d_springaop.MyAdvice"></bean>
<!-- 3.配置将通知织入目标对象 -->
<aop:config>
<!-- 配置切入点
public void www.test.service.UserServiceImpl.add()
void www.test.service.UserServiceImpl.add()
* www.test.service.UserServiceImpl.add()
* www.test.service.UserServiceImpl.*() * www.test.service.UserServiceImpl.*(..)
* www.test.service.*ServiceImpl.*(..)
* www.test.service..*ServiceImpl.*(..) //会找service下面的子包
-->
<aop:pointcut expression="execution(* www.test.service.*ServiceImpl.*(..))" id="pc"/>
<aop:aspect ref="myAdvice">
<!-- 指定名为before方法作为前置通知 -->
<aop:before method="before" pointcut-ref="pc"/>
<!-- 后置 如果出现异常不会调用-->
<aop:after-returning method="afterReturning" pointcut-ref="pc"/>
<!-- 环绕通知 -->
<aop:around method="around" pointcut-ref="pc"/>
<!-- 异常拦截通知 -->
<aop:after-throwing method="afterException" pointcut-ref="pc"/>
<!-- 后置 出现异常也会调用-->
<aop:after method="after" pointcut-ref="pc"/>
</aop:aspect>
</aop:config>
</beans>

5 测试

package www.test.d_springaop;

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 www.test.service.UserService; //创建容器
@RunWith(SpringJUnit4ClassRunner.class)
//指定配置文件的加载位置
@ContextConfiguration("classpath:www/test/d_springaop/applicationContext.xml")
public class Demo {
//
@Resource(name="userService")
private UserService us; @Test
public void fun1(){
us.add();
}
}

2 注解配置

1 导包

2 准备对象

package www.test.service;

public interface UserService {

    public abstract void add();
public abstract void delete();
public abstract void update();
public abstract void find();
}
package www.test.service;

public class UserServiceImpl implements UserService {
@Override
//添加用户
public void add() {
System.out.println("添加用户");
//int i = 1/0;
}
@Override
//删除用户
public void delete() {
System.out.println("删除用户");
}
@Override
//修改用户
public void update() {
System.out.println("修改用户");
}
@Override
//查找用户
public void find() {
System.out.println("查找用户");
}
}

3 准备通知

package www.test.d_springaop;

import org.aspectj.lang.ProceedingJoinPoint;

//通知类
public class MyAdvice { //前置通知
// |-目标方法运行之前调用
//后置通知(如果出现异常不会调用)
// |-在目标方法运行之后调用
//环绕通知
// |-在目标方法之前和之后都调用
//异常拦截通知
// |-如果出现异常,就会调用
//后置通知(无论是否出现 异常都会调用)
// |-在目标方法运行之后调用
//================================================= //前置通知
public void before(){
System.out.println("这是前置通知");
} //后置通知
public void afterReturning(){
System.out.println("这是后置通知(如果出现异常不会调用)");
} //环绕通知
public Object around( ProceedingJoinPoint pjp) throws Throwable{
System.out.println("这是环绕通知之前的部分");
Object proceed = pjp.proceed();
System.out.println("这是环绕通知之后的部分");
return proceed;
} //异常拦截通知
public void afterException(){
System.out.println("出事啦!出现异常了");
} //后置通知
public void after(){
System.out.println("这是后置通知(出现异常也会调用)");
} }

4 配置进行织入,将通知织入目标对象中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
<!-- 准备工作: 导入aop(约束)命名空间 -->
<!-- 1.配置目标对象 -->
<bean name="userService" class="www.test.service.UserServiceImpl"></bean>
<!-- 2.配置通知对象 -->
<bean name="myAdvice" class="www.test.e_annotationaop.MyAdvice"></bean>
<!-- 3.开启使用注解完成织入 -->
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>
package www.test.e_annotationaop;

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 MyAdvice { //前置通知
// |-目标方法运行之前调用
//后置通知(如果出现异常不会调用)
// |-在目标方法运行之后调用
//环绕通知
// |-在目标方法之前和之后都调用
//异常拦截通知
// |-如果出现异常,就会调用
//后置通知(无论是否出现 异常都会调用)
// |-在目标方法运行之后调用
//================================================= /*//前置通知
@Before("execution(* www.test.service..*ServiceImpl.*(..))")
public void before(){
System.out.println("这是前置通知");
} //后置通知
@AfterReturning("execution(* www.test.service..*ServiceImpl.*(..))")
public void afterReturning(){
System.out.println("这是后置通知(如果出现异常不会调用)");
} //环绕通知
@Around("execution(* www.test.service..*ServiceImpl.*(..))")
public Object around( ProceedingJoinPoint pjp) throws Throwable{
System.out.println("这是环绕通知之前的部分");
Object proceed = pjp.proceed();
System.out.println("这是环绕通知之后的部分");
return proceed;
} //异常拦截通知
@AfterThrowing("execution(* www.test.service..*ServiceImpl.*(..))")
public void afterException(){
System.out.println("出事啦!出现异常了");
} //后置通知
@After("execution(* www.test.service..*ServiceImpl.*(..))")
public void after(){
System.out.println("这是后置通知(出现异常也会调用)");
}*/
@Pointcut("execution(* www.test.service..*ServiceImpl.*(..))")
public void pc(){}; //前置通知
@Before("MyAdvice.pc()")
public void before(){
System.out.println("这是前置通知");
} //后置通知
@AfterReturning("MyAdvice.pc())")
public void afterReturning(){
System.out.println("这是后置通知(如果出现异常不会调用)");
} //环绕通知
@Around("MyAdvice.pc()")
public Object around( ProceedingJoinPoint pjp) throws Throwable{
System.out.println("这是环绕通知之前的部分");
Object proceed = pjp.proceed();
System.out.println("这是环绕通知之后的部分");
return proceed;
} //异常拦截通知
@AfterThrowing("MyAdvice.pc()")
public void afterException(){
System.out.println("出事啦!出现异常了");
} //后置通知
@After("MyAdvice.pc()")
public void after(){
System.out.println("这是后置通知(出现异常也会调用)");
} }

5 测试

package www.test.e_annotationaop;

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 www.test.service.UserService; @RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:www/test/e_annotationaop/applicationContext.xml")
public class Demo {
@Resource(name="userService")
private UserService us; @Test
public void fun1(){
us.find();
} }

04-spring中的aop演示的更多相关文章

  1. 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)

    Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...

  2. spring中的aop演示

    一.步骤(XML配置) 1.导包4+2+2+2 2.准备目标对象 3.准备通知 4.配置进行织入,将通知织入目标对象中 <! -- 3.配置将通知织入目标对象> 5.测试 二.步骤(注解配 ...

  3. Spring中的AOP

    什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...

  4. Spring中关于AOP的实践之概念

    一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...

  5. Spring中的AOP 专题

    Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...

  6. spring中的AOP 以及各种通知 配置

    理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...

  7. Spring学习笔记(四)—— Spring中的AOP

    一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...

  8. JavaWeb_(Spring框架)认识Spring中的aop

    1.aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切 2.Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他 ...

  9. (五)Spring 中的 aop

    目录 文章目录 AOP概念 AOP原理 AOP术语 **`Spring`** 中的 **`aop`** 的操作 使用 `AspectJ` 实现 `aop` 的两种方式 AOP概念 浅理解 aop :面 ...

  10. Spring 中基于 AOP 的 @AspectJ

    Spring 中基于 AOP 的 @AspectJ @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格. 通过在你的基于架构的 XML ...

随机推荐

  1. ubuntu - 官方简体中文wiki,有你想要的ubuntu的一切

    ubuntu官方简体中文wiki:http://wiki.ubuntu.org.cn/%E9%A6%96%E9%A1%B5

  2. poj2947(高斯消元解同模方程组)

    题目链接:http://poj.org/problem?id=2947 题意:有n 种装饰物,m 个已知条件,每个已知条件的描述如下: p start enda1, a2......ap (1< ...

  3. Mole and Abandoned Mine

    Mole and Abandoned Mine n点m条边的无向图,删除第i条边花费c[i],问1到n只有一条路径时所需要的最小花费? \(2\le n\le 15\) . 我又A掉了一道zzs的题啦 ...

  4. loj #2143. 「SHOI2017」组合数问题

    #2143. 「SHOI2017」组合数问题   题目描述 组合数 Cnm\mathrm{C}_n^mC​n​m​​ 表示的是从 nnn 个互不相同的物品中选出 mmm 个物品的方案数.举个例子, 从 ...

  5. 主要介绍JavaEE中Maven Web 项目的结构及其它几个小问题

    先说下本篇随笔的目录. 1.介绍windows中环境变量Path与ClassPath的区别. 2.可能导致命令行运行javac编译成功,但 java命令 + 所要执行的类的类名 无效的原因. 3.介绍 ...

  6. 解决vue-cli相对路径问题 about css assert path ,two Solution(css路径的问题解决方案) #179

    https://github.com/vuejs/vue-cli/issues/179

  7. Java——事务

    一.事务(Transaction) 1. 在开发中我们的一个业务往往需要同时操作多个表,这些操作往往是不可分割,业务中的对数据库的多次操作,要么同时成功,要么全都失败. 2.注意:我们在同一个事务中使 ...

  8. P2480 [SDOI2010]古代猪文 Lucas+CRT合并

    \(\color{#0066ff}{ 题目描述 }\) 猪王国的文明源远流长,博大精深. iPig在大肥猪学校图书馆中查阅资料,得知远古时期猪文文字总个数为N.当然,一种语言如果字数很多,字典也相应会 ...

  9. 资深专家深度剖析Kubernetes API Server第3章(共3章)

    在本系列的前两部分中我们介绍了API Server的总体流程,以及API对象如何存储到etcd中.在本文中我们将探讨如何扩展API资源. 在一开始的时候,扩展API资源的唯一方法是扩展相关API源代码 ...

  10. php 读取excel文件

    首先下载插件PHPExcel (PHPExcel-1.8),以tp5框架为例,将该文件放在verdor文件夹下.然后引入IOFactory文件. 1.读取文件的部分内容(用于固定格式) public ...