Spring基础之AOP

一、AOP能解决什么问题

业务层每个service都要管理事务,在每个service中单独写事务,就会产生很多重复性的代码,而且修改事务时,需要修改源码,不利于维护。为此,把横向重复的代码,纵向抽取形成公共的功能。

横向重复,纵向抽取,这就是AOP思想。
二、AOP的原理
1、aop是什么
AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
Spring Aop原理就是在程序运行时,使用动态代理技术,不修改源码,对原有方法进行增强。
2、AOP的实现方式
使用动态代理技术,常用的方式有两种。
(1)基于接口的动态代理
JDK官方提供,被代理类至少实现一个接口
/**
* 接口
*/
public interface UserService {
void save(User user);
}
/**
* 被代理类
*/
public class UserServiceImpl implements UserService{
@Override
public void save(User user){
System.out.println("保存用户"+user);
}
}
/**
* 生成代理对象的工厂
*/
public class ProxyFactory {
public ProxyFactory(UserService us) {
super();
this.us = us;
}
private UserServiceImpl userServiceImpl;
public UserService getUserServiceProxy() {
/**
* newProxyInstance方法的参数:
* ClassLoader:被代理对象的类加载器
* Class[]:字节码数组,用于让代理对象和被代理对象有相同方法
* InvocationHandler:用于提供增强的代码
*/
UserService proxyUserService = (UserService) Proxy.newProxyInstance(UserServiceImpl.class.getClassLoader(),
UserServiceImpl.class.getInterfaces(),
new InvocationHandler() {
/**
* 作用:执行被代理对象的任何接口方法都会经过该方法
* @param proxy 代理对象的引用
* @param method 当前执行的方法
* @param args 当前执行方法的参数
* @return 和被代理对象方法有相同的返回值
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("打开事务!");
Object invoke = method.invoke(userServiceImpl, args);
System.out.println("提交事务!");
return invoke;
}
});
return proxyUserService;
}
}
public class Test {
@Test
public void fun1(){
UserService us = new UserServiceImpl();
ProxyFactory factory = new ProxyFactory(us);
UserService usProxy = factory.getUserServiceProxy();
usProxy.save();
//代理对象与被代理对象实现了相同的接口
//代理对象 与 被代理对象没有继承关系
System.out.println(usProxy instanceof UserServiceImpl );//false
}
}
(2)基于子类的动态代理
第三方cglib,被代理类不能被final修饰
/**
* create方法的参数:
* Class:字节码,用于指定被代理对象的字节码。
* Callback:用于提供增强的代码,一般写该接口的子接口实现类:MethodInterceptor
*/
UserService cglibUserService = (UserService) Enhancer.create(UserServiceImpl.class, new MethodInterceptor() {
/**
* 执行被代理对象的任何方法都会经过该方法
* @param proxy
* @param method
* @param args
* 以上三个参数和基于接口的动态代理中invoke方法的参数是一样的
* @param methodProxy :当前执行方法的代理对象
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
//打开事务
System.out.println("打开事务!");
//调用原有方法
Object returnValue = methodProxy.invokeSuper(proxy, args);
//提交事务
System.out.println("提交事务!");
return returnValue;
}
});
三、AOP相关术语

四、AOP的使用
1、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"
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.xsd">
<!-- 1、配置被代理对象-->
<bean id="userService" class="com.demo.service.impl.UserServiceImpl"></bean>
<!-- 2、配置公共功能类 -->
<bean id="logger" class="com.demo.utils.Logger"></bean>
<!-- 3、配置AOP -->
<aop:config>
<aop:aspect id="logAdvice" ref="logger">
<aop:pointcut id="pt" expression="(* com.demo.service.impl.*.*(..))"/>
<aop:before method="printLog" pointcut-ref="pt"></aop:before>
</aop:aspect>
</aop:config>
</beans>
2、全注解配置方式
pom.xml添加org.aspectj.aspectjweaver依赖

示例:
// 配置类
@Configuration
@ComponentScan(basePackages="com.demo") // 扫描包
@EnableAspectJAutoProxy // 开启注解aop
public class SpringConfiguration {
}
// 切面类
@Component("logger")
@Aspect
@Order(0)
public class Logger {
// 任意包下的impl包中任意类的任意方法
@Pointcut("execution(* *..impl.*.*(..))")
private void pt(){}
@Before("pt()")
public void beforePrintLog(){
System.out.println("前置通知");
}
}
Spring基础之AOP的更多相关文章
- Spring基础系列--AOP织入逻辑跟踪
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9619910.html 其实在之前的源码解读里面,关于织入的部分并没有说清楚,那些前置.后 ...
- Spring基础系列-AOP源码分析
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9560803.html 一.概述 Spring的两大特性:IOC和AOP. AOP是面向切 ...
- 【spring基础】AOP概念与动态代理详解
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- spring基础概念AOP与动态代理理解
一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一 ...
- Spring基础20——AOP基础
1.什么是AOP AOP(Aspect-Oriented Programming)即面向切面编程,是一种新的方法论,是对那个传统OOP面向对象编程的补充.AOP的主要编程对象是切面(aspect),而 ...
- Spring基础系列--AOP实践
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9615720.html 本文目的是简单讲解下Spring AOP的使用. 推荐使用IDEA ...
- Spring基础只是—AOP的概念介绍
Spring容器包含两个重要的特性:面向切面编程(AOP)和控制反转(IOC).面向切面编程是面向对象(OOP)的一种补充,在面向对象编程的过程中编程针对的目标是一个个对象,而面向切面编程中编程针对的 ...
- spring基础学习---aop
1:无参aop下面为项目结构 2:通知类.MyAdvice package cn.edu.aop; import org.aspectj.lang.ProceedingJoinPoint; //通知类 ...
- Spring基础系列-Spring事务不生效的问题与循环依赖问题
原创作品,可以转载,但是请标注出处地址:https://www.cnblogs.com/V1haoge/p/9476550.html 一.提出问题 不知道你是否遇到过这样的情况,在ssm框架中开发we ...
随机推荐
- Code force-CodeCraft-20 (Div. 2) D. Nash Matrix 详解(DFS构造)
D. Nash Matrix time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...
- 图论-网络流-Dinic (邻接表版)
//RQ的板子真的很好用 #include<cstdio> #include<cstring> #include<queue> #define INF 1e9 us ...
- 前后端bug定位
否一致一个商品状态为status,待上架status=0,上架中status=1,下架status=2 前端bug:如:一个商品上架成功后,数据库显示的状态status=1,这时候可能是前端对应值的定 ...
- 10_CSS入门和高级技巧(8)
图片透明 先来复习一下盒子的透明问题: opacity:0.6; 介于0~1之间,为了让IE兼容,我们要使用IE自己的滤镜: filter:alpha(opacity=60); 盒子的透明,会让里面的 ...
- 003_python的str切片,str常用操作方法,for循环,集合,深浅copy
基础数据类型 基础数据类型,有7种类型,存在即合理. 1.int 整数 主要是做运算的 .比如加减乘除,幂,取余 + - * / ** %... 2.bool布尔值 判断真假以及作为条件变量 3.s ...
- OpenWrt R2020.3.19 反追踪 抗污染 加速 PSW 无缝集成 UnPnP NAS
固件说明 基于Lede OpenWrt R2020.3.19版本Lienol Feed及若干自行维护的软件包 结合家庭x86软路由场景需要定制 按照家庭应用场景对固件及软件进行测试,通过后发布 设计目 ...
- 中文分词工具简介与安装教程(jieba、nlpir、hanlp、pkuseg、foolnltk、snownlp、thulac)
2.1 jieba 2.1.1 jieba简介 Jieba中文含义结巴,jieba库是目前做的最好的python分词组件.首先它的安装十分便捷,只需要使用pip安装:其次,它不需要另外下载其它的数据包 ...
- 使用GitHub的API实现文件上传--李渣渣(lizaza.cn)
最近搭建了一个自己的博客网站和一个在线图片格式转换工具,经常写博客的时候需要上传图片,在线转换工具也需要一定的空间来临时存放图片文件.服务器的存储空间又比较有限,于是就想着将图片存储的GitHub上, ...
- js理论-函数中的Arguments对象
详情参考:https://github.com/mqyqingfeng/Blog/issues/14 如果: arguments和实参的关系,以及arguments的属性 附上代码和注解 functi ...
- React学习随笔
一.在非create-react-app创建的项目,使用JSX需要注意的问题 1.1 入门的时候,要引入Babel,并将<script>标签加上type='text/babel'的属性. ...