Spring Bean 方法的可见性要求以进行 Spring AOP 代理

简介: 【8月更文挑战第22天】

Spring AOP 使用代理来拦截和修改方法调用。因此,要对 Spring bean 方法应用 AOP,这些方法必须具有适当的可见性,以便代理可以访问它们。

方法可见性要求

Spring AOP 对被代理方法的可见性有以下要求:

  • 对于 JDK 动态代理,方法必须是 public,因为动态代理只能代理 public 方法。
  • 对于 CGLIB 代理,方法可以是任何可见性,包括 public、protected、default(包)和 private。

为什么需要这些可见性要求?

这些可见性要求是由于 Spring AOP 使用不同的技术来创建代理:

  • JDK 动态代理:JDK 动态代理创建代理对象,其中包含目标对象方法的增强版本。由于代理对象必须能够调用目标对象的方法,因此目标对象的方法必须是 public。
  • CGLIB 代理:CGLIB 代理创建目标类的子类,其中覆盖目标对象的方法并插入自定义逻辑。由于子类可以访问父类的方法,因此 CGLIB 代理可以代理任何可见性的方法,包括 private 方法。

例外情况:

在某些情况下,即使方法不是 public,也可以使用 Spring AOP 对其进行代理:

  • 接口方法:接口方法始终是 public 的,因此可以使用 JDK 动态代理对其实现进行代理,即使实现方法不是 public。
  • final 方法:虽然 JDK 动态代理无法代理 final 方法,但 CGLIB 代理可以,因为 CGLIB 创建子类并覆盖方法。

建议的最佳实践

为了确保 Spring AOP 能够成功代理方法,建议将被代理方法声明为 public。这将确保无论使用哪种代理类型,都可以对方法进行代理。

示例

以下示例演示了如何使用不同可见性的方法以及如何使用 Spring AOP 对它们进行代理:

// public 方法
public void publicMethod() {
   
    // do something
}

// protected 方法
protected void protectedMethod() {
   
    // do something
}

// default(包)方法
void defaultMethod() {
   
    // do something
}

// private 方法
private void privateMethod() {
   
    // do something
}

使用 JDK 动态代理:

// 只能代理 public 方法
MyBean bean = new MyBean();
AdvisedSupport advised = new AdvisedSupport();
advised.setTargetSource(new TargetSource(bean));
advised.addAdvice(new MyAdvice());
ProxyFactory factory = new ProxyFactory(advised);
MyBean proxy = (MyBean) factory.getProxy();
proxy.publicMethod(); // 可以调用

使用 CGLIB 代理:

// 可以代理任何可见性的方法
MyBean bean = new MyBean();
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(MyBean.class);
enhancer.setCallback(new MyMethodInterceptor());
MyBean proxy = (MyBean) enhancer.create();
proxy.publicMethod(); // 可以调用
proxy.protectedMethod(); // 可以调用
proxy.defaultMethod(); // 可以调用
proxy.privateMethod(); // 可以调用

总结

Spring AOP 对要代理的方法的可见性有要求。对于 JDK 动态代理,方法必须是 public。对于 CGLIB 代理,方法可以是任何可见性。为了确保 Spring AOP 能够成功代理方法,建议将被代理方法声明为 public。

目录
相关文章
|
19天前
|
XML 安全 Java
|
2天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
17 6
|
3天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
29 3
|
17天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
27 1
|
21天前
|
监控 安全 Java
什么是AOP?如何与Spring Boot一起使用?
什么是AOP?如何与Spring Boot一起使用?
46 5
|
26天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
26天前
|
XML 监控 安全
深入调查研究Spring AOP
【11月更文挑战第15天】
36 5
|
26天前
|
Java 开发者 Spring
Spring AOP深度解析:探秘动态代理与增强逻辑
Spring框架中的AOP(Aspect-Oriented Programming,面向切面编程)功能为开发者提供了一种强大的工具,用以将横切关注点(如日志、事务管理等)与业务逻辑分离。本文将深入探讨Spring AOP的底层原理,包括动态代理机制和增强逻辑的实现。
39 4
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
224 2
下一篇
DataWorks