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 ...
随机推荐
- cookie ,session 和localStorage的区别详解
2019独角兽企业重金招聘Python工程师标准>>> cookie ,session 和localStorage的区别详解 博客分类: js 当你在浏览网站的时候,WEB 服务器会 ...
- P3588 【[POI2015]PUS】(线段树优化建边)
P3588 [[POI2015]PUS] 终于有个能让我一遍过的题了,写篇题解纪念一下 给定长度为n的序列和其中部分已知的数,还有m个大小关系:区间\([l,r]\)中,有k个给定的数比剩下的\(r- ...
- JavaWeb----Servler
Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个类, ...
- css的属性选择器
语法说明: 属性选择器需要将对应属性放入到 方括号中 [ ] ,其中包含属性名,标识符(* $ ~ ^ |) 使用说明: [attribute] 例如 [target] 表示 选择带有 targe ...
- tp5中使用ueditor编辑器保存文本到数据库后回显后显示html标签问题解决办法
在编辑器ueditor中获取文本,保存到到数据库后为 当在数据库中提取出来,在显示回ueditor编辑器时候,出了问题, html标签都显示出来了 百度了下别人的解决办法是,使用官方提供的api 可是 ...
- Spring官网阅读(七)容器的扩展点(二)FactoryBean
在上篇文章中我们已经对容器的第一个扩展点(BeanFactoryPostProcessor)做了一系列的介绍.其中主要介绍了Spring容器中BeanFactoryPostProcessor的执行流程 ...
- learn from collection framework design
最难忍受的痛苦,也许是想干一件事情而又不去干.--罗曼·罗兰 前言 本篇文章算是拾人牙慧吧,偶尔谷歌到一个能很好把collection framework design讲好的文档,一是为了总结提升,也 ...
- Linux高性能服务器技术总结
文章目录 1 服务器简介 2 I/O复用技术 2.1 循环方式 2.2 select 方式 2.3 poll方式 2.4 epoll 方式 3 多线程方式 4 CPU多核并行计算 5 深度分析内核性能 ...
- 常见的GAN网络的相关原理及推导
常见的GAN网络的相关原理及推导 在上一篇中我们给大家介绍了GAN的相关原理和推导,GAN是VAE的后一半,再加上一个鉴别网络.这样而导致了完全不同的训练方式. GAN,生成对抗网络,主要有两部分构成 ...
- SORM框架01
架构图 Query接口:负责查询(对外提供的核心服务类) QueryFactory类:负责根据配置信息创建Query对象 TypeConvertor接口:类型转换 TableContext类:负责获取 ...