springMVC的Aop
Aop是面向切面编程:是通过预编译方式和运行器动态代理实现程序功能的统一维护技术。Aop是oop的延续,是spring框架中的重要内容,是函数编程的一种衍生泛型,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑部分之间的耦合度降低提高程序的可重用行,提高开发的效率。
Aop的作用是:
在程序运行期间,在不修改源码的情况下对方法进行功能性增强。
优势:减少重复代码,提高开发效率,并且便于维护。
Aop的底层实现:
Aop的底层是使用Spring提供的动态代理技术实现的,在运行期间,Spring通过动态代理的技术动态的生成代理对象,代理方法的执行时进行增强功能的介入,再去调用目标对象的方法,从而实现功能的增强。
常用的动态代理:
jdk代理,基于接口,具有局限性,需要增强的对象必须要用接口。cglib:基于父类的动态代理技术,不需要接口,限制小很多。
动态代理
动态代理技术原理:动态代理是依赖于动态代理对象来实现功能增强
使用JDK动态代理就相当于spring框架在创建一个接口的实现类成为目标类的兄弟类,那么就相当于目标类中的方法代理类中就有什么方法然后就可以通过代理类实现功能的增强。【目标类中自定义的方法不能进行增强】
使用cglib动态代理:就相当于spring创建目标类的一个子类,那么父类拥有什么功能子类就有什么功能,然后在基于子类进行功能增强。
jdk动态代理的的代码实现:
cglib实现动态代理对象:
Chlib是第三方技术,但是spring框架已经集成了这个第三方技术。
需要增强的类:
public class Target {public void save(){System.out.println("save runner.");}public void save2(){System.out.println("sdjsds");}
}
增强类代码:
public class Advice {public void brfor(){System.out.println("前置增强方法");}public void after(){System.out.println("后置增强");}
}
动态代理的实现:
public class ProxyTest {public static void main(String[] args) {//目标对象final Target target =new Target();//增强对象final Advice advice=new Advice();//返回值是动态代理的对象,基于cglib//创建增强器Enhancer enhancer = new Enhancer();//设置父类enhancer.setSuperclass(Target.class);//设置回调enhancer.setCallback(new MethodInterceptor() {//多态性的体现@Override//四个参数的介绍o:代理对象本身,method:被代理对象的方法,objexts,调用方法的参数,methodProxy :方法的代理public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {//执行前置advice.brfor();//参数一只能是final类型的对象,因为是在匿名内部类中使用的结果。Object invoke = method.invoke(target, objects);//第一个参数就是被代理的类对象,//执行后置advice.after();return invoke;}});//创建代理对象Target o = (Target) enhancer.create();o.save();o.save2();}
}
对上述动态代理对象的总结:
- 创建目标对象,以及增强对象。
- 创建增强器。
- 设置父类。
- 设置回调。
- 创建代理对象。
- 使用代理对象进行测试。
也许会迷惑这么大费周章的进行配置编写,只是调用了两个方法,完全可以创建一个类在这个类中进行直接new目标对象new增强对象,然后将增强方法目标方法封装到一个方法中,但是动态代理的重点在动态上面,既然是动态底层就是使用的反射,所以是可以实现运行时编译,【动态编译,在编译的时候,需要的模块都没有编译进去,启动程序的时候,模块不会被加载而是在运行的时候,需要哪个模块就调用哪个模块。】
AOP的相关术语:
开发Aop需要明确的事项
需要编写的内容:
- 编写核心的业务代码:也就是切点。
- 编写切面类,内部包含通知。
- 配置织入关系。
AOP技术实现的内容:
通俗来说就是spring检测到切点方法被执行了,就会自动的创建代理对象,然后调用代理对象中的同名方法,然后在同名方法内部调用目标资源的方法。在调用目标方法时会进行增强方法的介入。
AOP 底层使用那种代理的方式:
在spring中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。
AOP的代码开发:
AOP的开发步骤:
- 导入AOP的坐标。
- 创建目标接口,和目标类。
- 创建切面类。
- 将目标类和切面类的对象创建权交给spring。
- 在applicationContext.xml中配入织入关系。
- 测试代码
导入坐标:
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.14</version>
</dependency>
aspectjweaver坐标的作用是进行功能编制的作用。
同时需要aop的坐标但是spring-context坐标中集成了aop
创建目标接口和目标类:
创建接口:
public interface TargetInterface {void save();
}
创建接口的实现类:
ublic class Target implements TargetInterface{public void save(){System.out.println("save runner.");}
}
创建切面类
ublic class MyAspect {private void befor(){System.out.println("前置增强。。。");}
}
在配置文件中进行配置织入关系:
<!-- Aop配置目标对象 --><bean id="target" class="com.itheima.zhujie.aop.Target"/>
<!--AOP配置切面--><bean id="aspect" class="com.itheima.zhujie.aop.MyAspect"/><!-- AOP配置织入:告诉spring框架那些方法(切点)需要那些增强() -->
<aop:config >
<!-- 声明切面 --><aop:aspect ref="aspect">
<!-- 配置切面切点加通知 method是指名增强的方法 pointcut是指明的切点
通知的类型【切点表达式】 --><aop:before method="befor" pointcut="execution(public void com.itheima.zhujie.aop.Target.save())"/></aop:aspect></aop:config>
测试类:
@RunWith(SpringJUnit4ClassRunner.class)//让spring来进行执行测试@ContextConfiguration("classpath:applicationContext.xml")//这个注解的参数可以是配置文件名称 也可以是配置类的。class
public class dsd {@Resourceprivate TargetInterface target;@Testpublic void test7(){target.save();}
}
切点表达式的写法及其使用特点:
- 访问修饰符可以省掉。
- 返回值类型,包名类名,方法名可以使用*来代表任意。
- 包名与类名之间的一个点.代表当前包下的类两个点..表示当前包及其子包下的类
- 参数列表可以使用两个点..表示任意个数,任意类型的参数
AOP的通知种类:
通知种类的介绍:
切点表达式的抽取
当多个增强的切点表达式相同时,可以将切点表达式进行抽取,在增强中使用pointcut-ref标签进行抽取切点表达式:
示例:
基于注解的AOP开发:
目标类的代码:
public interface TargetInterface {void save();
}
目标类的代码:
@Component
public class Target implements TargetInterface {public void save(){System.out.println("save runner.");}
切面类以及进行织入:
@Component
@Aspect//标注当前类是一个切面类
public class MyAspect {//配置前置通知@Before("execution(public void com.itheima.zhujie.anno.Target.save())")//括号之间的参数是需要进行增强的操作,是切点表达式private void befor(){System.out.println("前置增强。。。");}//配置环绕通知//ProceedingJoinPoint:表示是正在执行的连接点 :就是的切点@Arond("execution(public void com.itheima.zhujie.anno.Target.save())")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("环绕前通知");Object proceed = pjp.proceed();//表示是执行切点方法System.out.println("环绕后通知");return proceed;}
在spring配置文件中配置组件扫描以及AOP代理
<context:component-scan base-package="com.itheima.zhujie.anno"></context:component-scan><aop:aspectj-autoproxy/>
测试类:
@RunWith(SpringJUnit4ClassRunner.class)//让spring来进行执行测试@ContextConfiguration("classpath:applicationContext.xml")//这个注解的参数可以是配置文件名称 也可以是配置类的。class
public class dsd {@Resourceprivate TargetInterface target;@Testpublic void test7(){target.save();}
}
使用注解开发AOP中通知类型的注解:
注解开发AOP中进行切点表达式的抽取
一共有两种形式都是使用@Pointvut注解
形式一:使用 类名.方法名()
形式二:方法名()
springMVC的Aop相关推荐
- SpringMVC使用AOP
撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> springMVC版本是4.3.7.RELEASE,pom.xml中添加AOP的依赖: <dependen ...
- springmvc 配置aop
2019独角兽企业重金招聘Python工程师标准>>> 一: <?xml version="1.0" encoding="UTF-8"? ...
- 利用SpringMVC的AOP来实现后台系统的操作日志记录
最近在项目中要求把后台的一些关键操作记录下来,想了好半天能想到的也就那两三种方式,要么就是写一个拦截器,然后再web.xml里面进行配置,要么就是就是在每个需要记录操作日志的代码里面进行拦截,最后我选 ...
- 【Java Web开发指南】深入浅出Spring和SpringMVC
文章目录 1 spring 2 springmvc 3 AOP与IOC 1 spring spring是一个一站式的框架,提供了表现层(springmvc)到业务层(spring)再到数据层(spri ...
- Spring开启注解AOP的支持放置的位置
放在springmvc的aop,需要在springmvc的配置文件中写开启aop,而不是spring的配置文件 最近使用aop来记录controller的日志. 但是发现没有起作用. 后来发现是因为我 ...
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- Spring AOP 的日志管理实现
2019独角兽企业重金招聘Python工程师标准>>> 在学习Spring框架的历程中,最重要的是要理解Spring的IOC和AOP了,不但要学会怎么用,最好是知道它是怎么实现的,通 ...
- (转)SpringMVC学习(四)——Spring、MyBatis和SpringMVC的整合
http://blog.csdn.net/yerenyuan_pku/article/details/72231763 之前我整合了Spring和MyBatis这两个框架,不会的可以看我的文章MyBa ...
- 史上最细IDEA搭建基于SSM(springmvc+spring+mybatis)
需要准备的环境: idea 2019.3.2 jdk1.8 Maven 3.3.9 请提前将idea与Maven.jdk配置好,本次项目用的都是比较新的 注:配置完ide红线报错没关系!可以run! ...
最新文章
- R语言数据结构之向量
- 操作系统学习笔记:进程同步
- 门户网站负载均衡技术的六大新挑战
- Linux压缩包和用户管理及开关机指令
- 【架构二】后端高可用架构演进
- 判断 CGRect是否“为空”
- ubuntu18.04下安装grafana6和简单使用
- 领域驱动设计(DDD)前夜:面向对象思想
- 数据库-MySQL-搭建服务器
- vue-cli3.0 初体验
- 如何使用CSS为文本或图像提供透明背景?
- 使用AVPlayer制作一个播放器
- 你了解node多进程吗
- 在C#中如何将多个rtf文件内容组合在一起用一个rtf文件保存?
- 我国高等教育财政投入效率分析与对策
- 【基于ECharts 数据可视化展示相关配置表全】
- 力天创见排队客流统计
- logi k380 蓝牙键盘 与macbook 连接断开
- Java IO流——异常及捕获异常 try…catch…finally
- matlab 光流法工具箱,MatlabToolBox-PIV Special Effects 图形图像处理 267万源代码下载- www.pudn.com...
热门文章
- android menuitem 字体颜色,Android MenuItem 设置文本颜色-TextColor设置
- 计算机表格最高分,excel表格怎样求最高分
- 改完计算机名自动重启 vbs,VBS改计算机名,加IP,网关,DNS,无需禁用网卡.重...
- 600分理科选计算机专业,女孩子理科成绩600分左右,但是性格内向,可以选择什么专业呢?...
- 注册制可能对我们带来的影响-读《三十年股票投资心得》
- 第二天:基础语法和变量
- Qt Qml实现国际化
- 二极管温度补偿电路工作原理分析
- python已停止工作appcrash_Python已经停止在Windows中工作(APPCRASH),使用GDAL读取和更新shapefile...
- OTA是如何改变现代车辆能力的