04-spring中的aop演示
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演示的更多相关文章
- 2018.12.24 Spring中的aop演示(也就是运用aop技术实现代理模式)
Aop的最大意义是:在不改变原来代码的前提下,也不对源代码做任何协议接口要求.而实现了类似插件的方式,来修改源代码,给源代码插入新的执行代码. 1.spring中的aop演示 aop:面向方面编程.不 ...
- spring中的aop演示
一.步骤(XML配置) 1.导包4+2+2+2 2.准备目标对象 3.准备通知 4.配置进行织入,将通知织入目标对象中 <! -- 3.配置将通知织入目标对象> 5.测试 二.步骤(注解配 ...
- Spring中的AOP
什么是AOP? (以下内容来自百度百科) 面向切面编程(也叫面向方面编程):Aspect Oriented Programming(AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种 ...
- Spring中关于AOP的实践之概念
一.什么是AOP AOP:也称作面向切面编程 在分享几个概念执行我想先举个栗子(可能例子举得并不是特别恰当): 1.假如路人A走在大街上,被一群坏人绑架了: 2.警察叔叔接到报警迅速展开行动:收集情报 ...
- Spring中的AOP 专题
Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...
- spring中的AOP 以及各种通知 配置
理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了 ...
- Spring学习笔记(四)—— Spring中的AOP
一.AOP概述 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善.O ...
- JavaWeb_(Spring框架)认识Spring中的aop
1.aop思想介绍(面向切面编程):将纵向重复代码,横向抽取解决,简称:横切 2.Spring中的aop:无需我们自己写动态代理的代码,spring可以将容器中管理对象生成动态代理对象,前提是我们对他 ...
- (五)Spring 中的 aop
目录 文章目录 AOP概念 AOP原理 AOP术语 **`Spring`** 中的 **`aop`** 的操作 使用 `AspectJ` 实现 `aop` 的两种方式 AOP概念 浅理解 aop :面 ...
- Spring 中基于 AOP 的 @AspectJ
Spring 中基于 AOP 的 @AspectJ @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格. 通过在你的基于架构的 XML ...
随机推荐
- Jquery 插件开发——citylinkage(省、市、县城市联动选择)
第一部分:背景 开发源于需求,本次城市联动选择插件算是我写插件的一个特例吧,不是我目前工作需要些的,算是兴趣驱使吧.之前呢,一直想写这个插件,然后错过了一个写这个插件的机会(这个得回顾到很久以前了. ...
- Visual Studio 2017中如何创建安装打包项目
从Visual Studio 2012开始,微软就不在环境中自动集成安装打包项目了,如果还想使用,需要手动下载安装,这里以在Visual Studio 2017上安装打包项目为例进行介绍,步骤如下: ...
- java 文件的读写操作
java 文件的读写操作 一.读: public String getSetting() { HttpServletRequest request=org.apache.struts2.Servle ...
- upper_bound下确界
//uppper_bound上确界找出首个大于某值的元素 #include<algorithm> #include<iostream> using namespace std; ...
- [hdu 2089] 不要62 数位dp|dfs 入门
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...
- SpringBoot Junit测试Controller
原文链接:https://blog.csdn.net/xiaolyuh123/article/details/73281522 import java.util.List; import org.sp ...
- POI生成Excel强制换行
自动换行的设置: HSSFCellStyle cellStyle=workbook.createCellStyle(); cellStyle.setWrapText(true); cell.setCe ...
- 关于在多个UItextield切换焦点
本人对于应用的完美用户体验是这样认为:当一个应用是迎合用户习惯 ,并且在人机交互之中降低用户的学习成本 ,由于应用和人的思维方向一致时,就会有共鸣,这对于程序设计是有益的,因为只要愿意去改变总有优雅的 ...
- 取石子游戏 BZOJ1874 博弈
小H和小Z正在玩一个取石子游戏. 取石子游戏的规则是这样的,每个人每次可以从一堆石子中取出若干个石子, 每次取石子的个数有限制,谁不能取石子时就会输掉游戏. 小H先进行操作,他想问你他是否有必胜策略, ...
- MYSQL查询字段全部为中文的字段
在实际使用mysql的过程中,会遇到这样的问题,查询字段内容全部为中文内容的数据,对于刚用mysql的小伙伴可能就比较迷失了,不知道怎么使用,其实这个问题很简单,使用下面这个sql语句就可以了 SEL ...