【spring学习笔记三】aop思想介绍及实现原理

aop思想:一句话介绍介绍就是横向重复,纵向抽取。

最早接触就是学习servlet时使用filter的解决乱码设置,只需写一个fifter,就能解决全部乱码问题,实际上就是一种aop编程。

《【spring学习笔记三】aop思想介绍及实现原理》

aop思想还体现在事务管理以及拦截器的使用中。而spring作为对象的容器,spring能为容器中管理的对象生成动态代理对象。以前我们要使用动态代理,我们需要使用Proxy.newProxyInstance(classleader,interface【】arr,invactionHandler handler)方法生成代理对象,而spring能通过配置文件和注解就能自动产生代理对象。所以springaop实质上就是帮我们生成动态代理对象。

Spring实现aop的原理:动态代理以及cglib代理

动态代理:被代理的对象必须实现接口才能产生代理对象,如果没有接口就不能使用动态代理技术。

cglib代理:为了保证没有实现接口的对象也能生成代理对象,所以产生了cglib代理技术。代理的原理就是对目标对象进行继承代理。如果目标对象被final修饰,那么该类无法被cglib代理。

在spring中对象有接口,优先使用动态代理,没有接口则使用cglib代理。

aop名词学习:

1Joinpoint:连接点。指的是在目标对象中所有可以增强的方法,叫做连接点

2.Pointcut:切入点。指的是在目标对象中已经增强的方法。

3.Advice:通知,增强。指的是增强的代码。

4.Target:目标对象。指的是被代理对象。

5.weaving:织入,指的是将通知引入到连接点的动作。

6.Proxy: 代理。指的是将通知织入到目标对象之后,行成代理对象。

7,aspect:切面。指的是切入点+通知。

现在在企业中一般不使用动态代理或者cglib技术代理,而是用xml文件配置生成代理对象,现在就通过一个简单的例子来利用xml文件配置生成代理对象并测试。

Spring中aop开发准备步骤

第一步:导包(4+2+2+2)后面两个2 分别是aop包,aspecsts包和依赖包中的 aopalliance包,aspectj.weaver包

工程包结构图:

《【spring学习笔记三】aop思想介绍及实现原理》

第二步:准备目标对象(userservice)。

《【spring学习笔记三】aop思想介绍及实现原理》

《【spring学习笔记三】aop思想介绍及实现原理》

第三步:准备通知(advice类)。

《【spring学习笔记三】aop思想介绍及实现原理》

第四步:利用配置进行织入。将通知织入目标对象中。

其中通知分为前置通知:目标方法运行之前调用

后置通知(如果出现异常不会调用):目标方法运行之后调用

环绕通知:方法之前和之后都调用。

异常拦截通知:如果出现异常,就会调用

后置通知*(无论是否出现异常都会调用):在目标方法运行之后调用

配置文件:

准备工作:织入时在配置文件中导入新的约束名词aop。

1.配置目标对象

<bean name=”” class=””>

2.配置通知对象

<bean name=”” class=””>

3,配置将通知织入目标对象。

<aop:config>

<!–配置切入点 –>

<aop:poincut expression=”” id=”a”>

<aop:aspect >

<aop:before method=”” pointcut-ref=”a”>

xml文件源代码:

<?xml version=”1.0″ encoding=”UTF-8″?>
<beans xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://www.springframework.org/schema/beans” xmlns:context=”http://www.springframework.org/schema/context” xmlns:aop=”http://www.springframework.org/schema/aop” xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd “>
<!– 打开注解开关 –>
<context:component-scan base-package=”com.advice”></context:component-scan>
<!– 配置目标对象 –>
<bean name=”userServiceImpl” class=”com.service.UserServiceImpl”></bean>
<!– 配置通知对象 –>
<bean name=”MyAdvice” class=”com.advice.MyAdvice”></bean>
<!– 配置将通知织入到目标对象 –>
<aop:config>
<!– 配置切入点 –>
<!– public void com.service.UserServiceImpl.save()  –>
<!– void  com.service.UserServiceImpl.save() 对方法public不做要求–>
<!– * com.service.UserServiceImpl.save() 对返回值不做要求加*–>
<!–  * com.service.UserServiceImpl.*() 对方法不做要求,通用类里面的所有方法加*–>
<!–  * com.service.UserServiceImpl.*(..) 对方法的参数不做要求,可以有也可以没有加..–>
<!–  * com.service.*ServiceImpl.*(..) 对service没有要求,只要是以ServiceImpl结尾的都可以用,加*–>
<!– * com.service..*ServiceImpl.*(..)  对service层的包不做要求,只要是service包或者子包都可以用,加.–>

<aop:pointcut expression=”execution(* com.service.*ServiceImpl.*(..))” id=”a”/>
<aop:aspect ref=”MyAdvice”>
<aop:before method=”before” pointcut-ref=”a”/>
<aop:after-throwing method=”AfterThrowing” pointcut-ref=”a”/>
<aop:around method=”around” pointcut-ref=”a”/>
<aop:after-returning method=”finall” pointcut-ref=”a”/>
<aop:after method=”after” pointcut-ref=”a”/>
</aop:aspect>
</aop:config>
</beans>

最后写测试类进行测试:

《【spring学习笔记三】aop思想介绍及实现原理》

测试结果:

《【spring学习笔记三】aop思想介绍及实现原理》

    原文作者:AOP
    原文地址: https://blog.csdn.net/public_TIM/article/details/78320022
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞