Spring框架之-AOP

在工作以及面试当中Spring是必不可少的,当然了简单的认知是spring的两大特性: IOC控制翻转(也是依赖注入)、AOP(面向切面)

首先什么叫aop,aop到底能做什么?大致意思是这样的

AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。

例如我刚才所做的日志切面,记录每次的请求和响应消息入库

我并没有像某些人把插入库的方法写在每个请求的方法里,就像上面说的,减少重复代码,比如你有上百个方法,你要少写多少代码,其次就是如果哪天我不需要这个记录日志了,我直接去掉切面就可以,而不是去改代码,把每个插入的方法都删掉

最后回到aop是如何把它实现在项目中

首先要声明的是很多在学到aop这里,要导包,都会把这两个包导入进

,然后他就认为,嗯,要用aop就必须导入这两个包

那我想说的是,你错了

没这两个包照样可以实现aop

我们就利用spring自己的aop实现机制,虽说aop是有自己的实现机制,但还是得遵循aop联盟的api实现,也就是这个包

这里面全是接口,是不是很熟悉里面的东西

那我们首先用硬编码的方式实现一个aop,什么叫做硬编码,也就是不用xml的方式

比如先来一个前置通知,调用某个方法前先做一件事情

这是我调用某个方法前要做的事情,

然后我们再来定于要调用的方法

看到没 就是这样

需要创建一个代理工厂类 然后把目标类给它 切面也给它

其它的什么后置增强 和环绕增强 都如此

这种写法 当然不会用到工作中 太死板了

那我们再来看看xml中又是怎么实现的

前置通知还是找个通知

只是现在换成了xml方式了,那么你要问的是,不是说声明式事务不也是拿aop实现的吗

那如果用这种xml方式的写法 如何实现声明式事务啊

这就是spring自己的方式实现的声明式事务

然而我说了那么多 只是为了告诉你 spring从始至终都提供了自己的aop实现,但是太麻烦

我们真正喜欢用的是aspect,谁让别人是专业的,

那我们先看看aspect是如何实现aop的,通过xml的方式

spring自带aop,只是平常用的一直都是aspect,spring集成的

呆会继续aspect是如何实现的

首先我们应该牢记 aop都有哪些增强

分别有 前置增强、后置增强、抛出增强、环绕增强、引入增强

增强也可以叫做通知 ,所以当某些人说XX通知时也没什么好异样的,aspect的xml实现如下

首先我们要用<aop:config> 来进行aop配置 子元素中再配置切面

我们看看通知里面都有什么

这个通知并不需要实现任何类,但定义的方法必须遵守相关的规范,如不同的增强方法参数是有些区别的,如果不写的话,那么会异常,NoSuchMethodException

这个表达式就要根据你自己业务要求,看你的增强都需要加入哪些地方了

再来看看如果我们要声明式事务,不是说它也是拿aop做的嘛,一起看看aspect是如何给你做的。

这样的配置是不是相当熟悉,也是广为项目所用的

最后再来说说最为方便的注解,还是aspect的实现

首先要开启aop的aspect注解,需要在配置里加上一行配置

这里面默认是false默认false代表带着所有的代理全用jdk动态代理实现,

当你改为true时则用cglib动态代理实现

两者的区别也是常被考的

无非是需要jdk动态代理实现的目标类需要接口,而cglib动态代理实现的目标类不需要接口,它是直接生成新的字节码方式给你一个代理对象

所以当我们平常某个目标类,万一没写接口,其实也是可以被代理的,就很好理解了,这些都由spring aop底层帮你判断,默认jdk,没有接口,就用cglib

时间: 2024-10-11 16:18:21

Spring框架之-AOP的相关文章

java架构解密——Spring框架的AOP

一直以来,我们应用了不少的AOP框架,但是对于AOP的底层实现却没有过多的深入,古话就是"知其然,不知其所以然",随着AOP学术讨论的骤然兴起,我也开拓了自己的眼界,深入了解了AOP这个五彩斑斓的世界! 先来看看大众的定义: 百度百科: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函

Spring框架及AOP

Spring核心概念 Spring框架大约由20个功能模块组成,这些模块主分为六个部分: Core Container :基础部分,提供了IoC特性. Data Access/Integration Web AOP(Aspect Orient Programming) Instrumentation Test Spring两大核心技术 控制反转(Inversion of Control IoC) 称之为”依赖注入”,是面向对象编程中的一个设计理念,用来降低程序代码之间的耦合度. 将组建对象的控制

Spring框架:AOP详解

AOP的中文名称叫做面向切面编程.这个名字非常形象,因为你真的可以把一个系统像面包一样切开,并直接在面包上增加修饰.切面可大可小,大到整个系统,小到某一个方法. AOP有什么用呢?举个例子,每个组件中都可能含有安全.事务.数据库等方面的逻辑,AOP就是把每个组件中的安全作为一个方面进行集中处理,事务作为一个方面,数据库作为一个方面等等.这样才能做到高内聚.低耦合.AOP中有三个重要的术语:通知.切点.连接点.他们之间的关系如下图. AOP实现的原理是修改目标类中的代码.至于怎么修改,有多种方式:

Spring框架学习——AOP的开发

一.AOP开发中的相关术语. ——JoinPoint(连接点):指那些可以被拦截到的点.比如增删改查方法都可以增强,这些方法就可以被称为是连接点. ——PointCut:切入点,真正被拦截的点,指对哪些连接点进行拦截的定义.JoinPoint是指方法可以增强,而切入点就是实际哪个方法进行增强或修改,这样的方法被称为切入点. ——Advice(增强/通知):方法层面的增强.指拦截到了方法后需要做的事情,也就是增强的功能部分被称为通知.分为前置(方法主体之前).后置.环绕通知. ——Introduc

Spring框架的AOP实现(JDK+CGLIB)

AOP的底层采用了代理技术,代理技术提供了两种,一种是JDK动态代理,另一种是CGLIB动态代理. 基于JDK的动态代理:必须是面向接口,只有实现了具体的接口的类才能生成代理对象. 基于CGLIB的动态代理:对于没有实现了接口的类,也可以生成代理,生成这个类的子类方式.一般如果实现接口,使用JDK动态代理完成AOP.没有实现接口,使用CGLIB动态代理实现AOP. JDK动态代理的实现 UserDao,UserDaoImpl: package com.spring.demo06; public

spring框架学习(六)AOP

spring框架学习(六)AOP AOP(Aspect-OrientedProgramming)面向方面编程,与OOP完全不同,使用AOP编程系统被分为方面或关注点,而不是OOP中的对象. AOP的引入 在OOP面向对象的使用中,无可避免的会出现代码重复,而且使用面向对象的编程方式,这种重复无法避免,比如用户权限判断中,根据相应的权限执行相应的方法:在servlet中设置编码格式时,同样相同的代码出现很多次,而且还根业务无关,很容易忘记写,结果运行的时候就出现乱码拉.这种重复代码不仅使编码麻烦,

Spring框架AOP源码剖析

今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西的源码剖析,作为多年的开发者,想必大家在面试的时候都被问过,你知道Spring框架AOP的底层实现机制吗,这可是很简单的噢,我们会说,如果某个类有接口就使用JDK动态代理,没有接口就用CGLIB动态代理,并且Spring也提供了可配置开关,不管有无接口都一律使用CGLIB动态代理,例如 <aop:aspectj-autoproxy proxy-target-class="true"/&

spring框架之AspectJ的XML方式完成AOP的开发

1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开发包 * spring的传统AOP的开发的包 * spring-aop-4.2.4.RELEASE.jar * com.springsource.org.aopalliance-1.0.0.jar * aspectJ的开发包 * com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar * spring

Spring框架 IOC注解

Spring框架的IOC之注解方式的快速入门        1. 步骤一:导入注解开发所有需要的jar包        * 引入IOC容器必须的6个jar包        * 多引入一个:Spring框架的AOP的jar包,spring-aop的jar包        2. 步骤二:创建对应的包结构,编写Java的类        * UserService            -- 接口        * UserServiceImpl        -- 具体的实现类        3.