AOP-面向切面编程-Aspect Oriented Programming(Spring笔记009)

在这里插入图片描述
代 理 的 实 现 { 有 接 口 + 实 现 类 : s p r i n g 采 用 j d k 动 态 代 理 P r o x y 只 有 实 现 类 : s p r i n g 采 用 c g l i v 字 节 码 增 强 在 . x m l 的 代 理 工 厂 配 置 上 有 o p t m i z e 配 置 \mathrm{代理的实现}\left\{\begin{array}{l}\mathrm{有接口+实现类:}spring采用jdk动态代理Proxy\\\mathrm{只有实现类:}spring采用cgliv字节码增强\\\end{array}\right.\\ 在.xml的代理工厂配置上有optmize配置 {+springjdkProxyspringcgliv.xmloptmize

    <property name="optmize" value="true/false"></property>
    <!--一般如果目标类有接口,采用jdk动态代理,没有接口,采用cglib字节码增强,如果选择true,则全部使用cglib-->

手动实现jdk动态代理要编写的要素:

{ 目 标 类 : 接 口 + 实 现 类 切 面 类 : 存 放 通 知 工 厂 类 : 编 写 工 厂 生 成 代 理 测 试 类 \left\{\begin{array}{l}\mathrm{目标类}:\mathrm{接口}+\mathrm{实现类}\\\mathrm{切面类}:\mathrm{存放通知}\\\mathrm{工厂类}:\mathrm{编写工厂生成代理}\\\mathrm{测试类}\end{array}\right. +

Spring编写半自动代理:

导 入 . j a r 包 { 4 + 1 A O P 联 盟 S p r i n g ( 实 现 ) − a o p \mathrm{导入}.jar包\left\{\begin{array}{l}4+1\\AOP\mathrm{联盟}\\Spring(\mathrm{实现})-aop\end{array}\right. .jar4+1AOPSpring()aop

AOP联盟将通知/增强分为5类,这里主要应用环绕通知MethodInterceptor(intercept截取拦截)

try{
//前置通知
//执行目标方法
//后置通知
}catch(){
//异常通知
}

目标类的接口与实现类的写法不变
原来的切面类中确定通知,现在删掉before,after写上invoke

pulic class MyAspect implements MethodInterceptor{
  public Object invoke(MethodInvocation mi )throws Throable{
     System.out.println("前");
     Object obj=mi.procede();//手动执行目标方法
     System.out.println("后");
     return obj;
   }
}

测试:(注意:.getBean(“代理类的id”)😉

public void demo(){
  String xmlpath ="com.···.beans.xml"
ApplicationContext applicationContext= new ClassPathXmlApplicationContext(xmlpath);
UserSersvice userSvice =(UserSvice)applicationContext.getBean("代理类的id");
userSvice .adduser();
userSvice .updateuser();
userSvice .deleteuser();
}

.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
">

    <!-- 目标类 -->
    <bean id="UserId" class="com.~.UserServiceImpl"></bean>

    <!-- 切面类 -->
    <bean id="MyAspectId" class="com.~.MyAspect"></bean>
    <!-- 设置代理工厂 -->
    <bean id="proxuServiceId" class="org.springframework.aop.framework.ProxyFactoryBean(用于生产代理对像的类)">
                 <!-- 代理接口-->
        <property name="Interface" value="全限定.UserService"></property>
                    如果多个接口:
        <property name="Interfaces" ><array><value>全限定.UserService</value></array></property>
                 <!-- 目标类 -->
        <property name="target" ref="UserServiceId"></property>
                 <!-- 切面类 -->
        <property name="interceptorNames" value="MyAspectId(多个值仍使用子标签)"></property> 
    </bean>
</beans>

全自动Spring Aop 编程

1.导入com.springsource.org.aspectj.weaver.RELEASE.jar
2.在.xml中的配置中,目标类,切面类不变,Test中getBean(目标类Id)
3.下面更改xml文件实现Spring aop编程
使用aop:config进行配置

<!--aop标签支持-->
  <aop:config>
    <!--切入点表达式-->
    <aop:pointcut   id="mypointcut" expression="execution( * com.~.UserServiceImpl.*(..))"/>
    <!--组合通知与切入点-->
    <aop:advisor advice-ref="MyAspectId" pointcut-ref="mypointcut"/>
  </aop:config>

在这里插入图片描述

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

FakeOccupational

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值