当前位置:首页 > 科技  > 软件

Spring创建AOP代理并非只有@Aspect一种方式

来源: 责编: 时间:2024-04-02 17:22:53 109观看
导读环境:Spring6.1.21. 简介在Spring项目中,使用@Aspect注解定义切面(Aspect)并创建AOP(面向切面编程)代理是一种常见的做法,它主要用于实现跨多个类和方法的横切关注点(Cross-cutting Concerns)的模块化。下面是对使用@Aspect定

环境:Spring6.1.2VYD28资讯网——每日最新资讯28at.com


1. 简介VYD28资讯网——每日最新资讯28at.com

在Spring项目中,使用@Aspect注解定义切面(Aspect)并创建AOP(面向切面编程)代理是一种常见的做法,它主要用于实现跨多个类和方法的横切关注点(Cross-cutting Concerns)的模块化。下面是对使用@Aspect定义切面以及创建AOP代理的示例:VYD28资讯网——每日最新资讯28at.com

@Aspectpublic class LogAspect {  // 定义切点  @Pointcut("execution(* com.pack..*.*(..))")  public void log() {  }  // 前置通知  @Before("log()")  public void beforeLog() {    System.out.println("记录日志Before...");  }  // 后置通知  @After("log()")  public void afterLog() {    System.out.println("记录日志After");  }  // 异常通知  @AfterThrowing(pointcut = "log()", throwing = "tx")  public void ex(Throwable tx) {    System.err.println("发生异常: " + tx.getMessage()) ;  }  // 环绕通知  @Around("log() && args(name)")  public Object around(ProceedingJoinPoint pjp, String name) throws Throwable {    System.out.println("log before...") ;    System.out.println("name = " + name) ;    Object ret = pjp.proceed() ;    System.out.println("log after...") ;    return ret ;  }}

以上是一个简单的异常通知切面定义。在实际工作中绝大多数情况下都是通过上面的方式操作。VYD28资讯网——每日最新资讯28at.com

但是在某些场景下,你可能需要更细粒度的控制来创建代理对象,比如根据特定条件动态决定是否创建代理、自定义代理的创建过程或调整代理的行为。这时,使用ProxyFactoryBeanProxyFactory可以提供更大的灵活性。ProxyFactoryBean主要用于在Spring容器中配置和创建代理对象,而ProxyFactory则提供了编程式创建代理对象的能力。如果你需要在代码中动态地创建代理对象,而不是通过Spring容器来管理,那么使用ProxyFactory可能更合适。VYD28资讯网——每日最新资讯28at.com

接下来将详细介绍通过ProxyFactoryBean和ProxyFactory创建AOP代理对象。VYD28资讯网——每日最新资讯28at.com

2. 代理对象创建VYD28资讯网——每日最新资讯28at.com

2.1 ProxyFactoryBean创建代理
VYD28资讯网——每日最新资讯28at.com

该类提供了对切入点、任何适用的建议及其顺序的完全控制。然而,如果您不需要这样的控制,也可以选择更简单的选项。VYD28资讯网——每日最新资讯28at.com

ProxyFactoryBean与其他Spring FactoryBean实现一样,引入了一个间层。简单说如果你定义了一个名为foo的ProxyFactoryBean,那么引用foo的对象看不到ProxyFactoryBean实例本身,而是由ProxyFactoryBean中的getObject()方法实现创建的对象。此方法创建一个AOP代理,用于包装目标对象。VYD28资讯网——每日最新资讯28at.com

ProxyFactoryBean很多关键的属性继承自ProxyConfig(Spring中所有aop代理工厂的超类)。这些关键属性结束如下:VYD28资讯网——每日最新资讯28at.com

ProxyFactoryBean proxy = new ProxyFactoryBean() ;// 如果要代理的是目标类,而不是目标类的接口,则为True。如果该属性值设置为true,则创建CGLIB代理proxy.setProxyTargetClass(false) ;// 控制是否对通过CGLIB创建的代理应用积极优化。除非您完全理解相关AOP代理如何处理优化,否则不应该轻松地使用此设置。目前仅用于CGLIB代理。它对JDK动态代理没有影响。proxy.setOptimize(false) ;// 如果代理配置被冻结,则不再允许更改配置。无论是作为轻微的优化,还是当您不希望调用者在创建代理后能够操作代理(通过建议的接口)时,这都是有用的。此属性的默认值为false,因此允许更改(例如添加额外的通知)。proxy.setFrozen(false) ;// 确定是否应该在ThreadLocal中暴露当前代理,以便目标可以访问它。如果目标需要获取代理,而exposeProxy属性被设置为true,那么可以使用AopContext.currentProxy()方法。proxy.setExposeProxy(false) ;// 接口名称的字符串数组。如果没有提供,则使用目标类的CGLIB代理proxy.setProxyInterfaces(new Class<?>[] {}) ;// 要应用的Advisor、拦截器或其他Advice名称的字符串数组。点菜很重要,先到先得。也就是说,列表中的第一个拦截器是第一个能够拦截调用的。proxy.setInterceptorNames("interceptor01") ;// 不管getObject()方法被调用的频率如何,工厂是否应该返回一个对象。有几个FactoryBean实现提供了这样的方法。默认值为trueproxy.setSingleton(true) ;

以上是对ProxyFactoryBean创建代理对象时的核心配置说明。VYD28资讯网——每日最新资讯28at.com

完整使用案例如下:VYD28资讯网——每日最新资讯28at.com

public interface CommonDAO {}  public class PersonService {  public void save() {    System.out.println("save method invoke...") ;  }}@Configurationpublic class AppConfig {  @Bean  public MethodInterceptor logInterceptor() {    return new MethodInterceptor() {      @Override      public Object invoke(MethodInvocation invocation) throws Throwable {        System.out.println("日志记录...") ;        return invocation.proceed() ;      }    };  }  @Bean  public ProxyFactoryBean personService() throws Exception {    ProxyFactoryBean proxy = new ProxyFactoryBean() ;    proxy.setProxyTargetClass(true) ;    proxy.setTargetSource(new SingletonTargetSource(new PersonService())) ;    proxy.setProxyInterfaces(new Class<?>[] {CommonDAO.class}) ;    proxy.setInterceptorNames("logInterceptor") ;    return proxy ;  }}

2.2 ProxyFactory创建代理VYD28资讯网——每日最新资讯28at.com

用Spring很容易通过编程创建AOP代理。这让你可以在不依赖Spring IoC的情况下使用Spring AOP。由目标对象实现的接口会自动被代理。如下示例:VYD28资讯网——每日最新资讯28at.com

public interface CommonDAO {}public class PersonService {  public void save() {    System.out.println("save method invoke...") ;  }}public static void main(String[] args) {  ProxyFactory factory = new ProxyFactory(new PersonService()) ;  factory.setProxyTargetClass(true) ;  // 设置通知类(内部会自动的包装为Advisor)  factory.addAdvice(new MethodInterceptor() {    @Override    public Object invoke(MethodInvocation invocation) throws Throwable {      System.out.println("权限控制...") ;      return invocation.proceed() ;    }  });  factory.addAdvisor(new PointcutAdvisor() {    @Override    public Advice getAdvice() {      return new MethodInterceptor() {        @Override        public Object invoke(MethodInvocation invocation) throws Throwable {          System.out.println("日志记录...") ;          return invocation.proceed() ;        }      } ;    }    @Override    public Pointcut getPointcut() {      return new StaticMethodMatcherPointcut() {        @Override        public boolean matches(Method method, Class<?> targetClass) {          return method.getName().equals("save") ;        }      } ;    }  }) ;  PersonService ps = (PersonService) factory.getProxy() ;  ps.save() ;}

以上是本篇文章的全部内容,希望对你有帮助。VYD28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80879-0.htmlSpring创建AOP代理并非只有@Aspect一种方式

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 这七种UML图的画法,每个程序员都应该掌握!

下一篇: 三万字80道Java基础经典面试题总结(2024修订版)

标签:
  • 热门焦点
  • 太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    太卷!Redmi MAX 100英寸电视便宜了:12999元买Redmi史上最大屏

    8月5日消息,从小米商城了解到,Redmi MAX 100英寸巨屏电视日前迎来官方优惠,到手价12999元,比发布价便宜了7000元,在大屏电视市场开卷。据了解,Redmi MAX 100
  • 三万字盘点 Spring 九大核心基础功能

    三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 使用AIGC工具提升安全工作效率

    使用AIGC工具提升安全工作效率

    在日常工作中,安全人员可能会涉及各种各样的安全任务,包括但不限于:开发某些安全工具的插件,满足自己特定的安全需求;自定义github搜索工具,快速查找所需的安全资料、漏洞poc、exp
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 阿里大调整

    阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    超闭合精工铰链 彻底消灭缝隙 三星Galaxy Z Flip5与Galaxy Z Fold5发布

    2023年7月26日,三星电子正式发布了Galaxy Z Flip5与Galaxy Z Fold5。三星新一代折叠屏手机采用超闭合精工铰链,让折叠后的缝隙不再可见。同时,配合处
  • 三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    三星Galaxy Z Fold/Flip 5国行售价曝光 :最低7499元/12999元起

    据官方此前宣布,三星将于7月26日也就是明天在韩国首尔举办Unpacked活动,届时将带来带来包括Galaxy Buds 3、Galaxy Watch 6、Galaxy Tab S9、Galaxy
Top