idea创建Spring项⽬实现AOP(XML⽅式与注解⽅式)
⽂章⽬录
Spring AOP
⼀. 概述
1. Aop简介
AOP为Aspect Oriented Programming 即⾯向切⾯编程,可以说是对⾯向对象编程(OOP的⼀种补充)扩展和延伸,是为了解决OOP中产⽣的开发问题。
2. OOP和AOP
软件开发⼀直在寻求⼀种⾼效开发、护展、维护的⽅式。从⾯向过程的开发实践中,前⼈针对业务处理过程的实体及其属性和⾏为进⾏抽象封装,以获得更加清晰⾼效的逻辑单元划分,形成了⾯向对象的开发思想(OOP)
例如我们在操作Controller、Server、Dao的时候,⾯向对象虽然会很好地解决了业务级别的开发。但是于
系统级别的开发我们很难聚焦。⽐如、对于每⼀个模块需要进⾏打⽇志、代码监控、异常处理。以⽇志为例,如果以OOP的思想,每个层都抽象出⽅法去实现⽇志功能,会产⽣很强的耦合,为了能够更好地将系统级别的代码抽离出来,去掉与对象的耦合,所以⽤到了AOP
所以
1. AOP是对OOP的补充
2. OOP是将程序分解成各个层次的对象,⾯向业务中的名词领域,侧重点在与抽象
3. AOP是将程序运⾏过程分解成各个切⾯,从程序运⾏⾓度考虑程序的结构,⾯向业务中的动词领域,侧重点在于解耦
3. AOP主要的特点
spring aop应用场景
源码⽆关性:在不改变源码的前提下,给程序动态统⼀添加功能
隔离性:低耦合
⼆在idea⾥创建Spring项⽬
1. 新建spring项⽬(熟悉的可以直接跳过)
勾选Spring以及Web Application(其他保持默认状态)
选择项⽬名称与项⽬路径——点击Finish(会⾃动下载spring需要的jar包)
新建配置⽂件(Spring Conifg⽂件)
2.到官⽹下载aspect相关的jar包
Spring中进⾏aop操作除了导⼊基本的jar包,还需要导⼊aop相关jar包
1. 然后将jar包移动⾄lib下
2. 在添加了jar包后,并不会⾃动给我们build进去,需要⼿动build。
选择lib中刚刚导⼊的jar包。
三简单AOP实现
Spring ⽅⾯可以使⽤下⾯提到的五种通知⼯作:
通知描述
前置通知在⼀个⽅法执⾏之前,执⾏通知。
后置通知在⼀个⽅法执⾏之后,不考虑其结果,执⾏通知。
返回后通知在⼀个⽅法执⾏之后,只有在⽅法成功完成时,才能执⾏通知。
抛出异常后通知在⼀个⽅法执⾏之后,只有在⽅法退出抛出异常时,才能执⾏通知。
环绕通知在建议⽅法调⽤之前和之后,执⾏通知。
1. xml式
1. spring的xml配置⽂件l
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xsi="/2001/XMLSchema-instance"aop="/schema/aop"
schemaLocation="/schema/beans /schema/beans/spring-beans.xsd www./schema/aop /schema/aop/spring-aop.xsd">
<!-- 配置⽬标类 -->
<bean id="userDao"class="demo.UserDao"></bean>
<!-- 配置切⾯类 -->
<bean id="userAspect"class="demo.Aspect.UserAspectXML"></bean>
<!-- 配置 AOP -->
<config>
<!-- 配置切点表达式 -->
<!--
整个表达式可以分为五个部分:
1、execution()::表达式主体。
2、第⼀个*号:表⽰返回类型, *号表⽰所有的类型。
3、包名:表⽰需要拦截的包名,后⾯的两个句点表⽰当前包和当前包的所有⼦包,com.sample.service包、⼦孙包下所有类的⽅法。
4、第⼆个*号:表⽰类名,*号表⽰所有的类。
5、*(..):最后这个星号表⽰⽅法名,*号表⽰所有的⽅法,后⾯括弧⾥⾯表⽰⽅法的参数,两个句点表⽰任何参数
-->
<!-- 配置切点 -->
<pointcut expression="execution(* demo.UserDao.saveUser(..))"id="pointcut1"/>
<pointcut expression="execution(* demo.UserDao.deleteUser(..))"id="pointcut2"/>
<pointcut expression="execution(* demo.UserDao.updateUser(..))"id="pointcut3"/>
<pointcut expression="execution(* demo.UserDao.queryUser(..))"id="pointcut4"/>
<!-- 配置切⾯及通知 -->
<aspect ref="userAspect">
<!-- 前置通知 -->
<before method="before"pointcut-ref="pointcut1"/>
<!-- 后置通知 -->
<after method="after"pointcut-ref="pointcut2"/>
<!--    环绕通知-->
<around method="around"pointcut-ref="pointcut3"/>
<!-- 异常抛出通知 -->
<after-throwing method="afterThrowing"pointcut-ref="pointcut4"throwing="e"/>
<!--  返回通知  -->
<after-returning method="afterReturning"pointcut-ref="pointcut4"returning="result"/>
</aspect>
</config>
</beans>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。