问题标签 [cglib]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1194 浏览

java - Spring 注解与我的设计准则冲突

概述
使用

  • Spring 3.0.1(注解配置)
    • 当前配置使用 CGLib 作为代理创建者,但这不是我的偏好
    • 事务是没有任何特殊设置的注释配置
    • 所有配置都使用注释(@Service@Transactional@ManagedResource@Inject等)完成
  • Hibernate 3.5(实体用 javax.persistence 注释)

指南要点

  • 每个使用@Repository@Service必须有接口注解的 bean
  • 构造函数 DI(不需要重新配置时)
    • 构造函数具有默认可见性 ( Foo(Bar bar) {...})
  • Bean 字段是最终的(不需要重新配置时)
    • 导致没有默认构造函数
  • 使用final修饰符 ( )默认可见实现final class Foo

问题

  1. CGLib 不能代理最终类
  2. CGLib 需要默认(空)构造函数
  3. 某些服务需要通过 JMX 公开
  4. 除非由 CGLib 代理,否则 MBean 导出器无法工作
  5. 有些@Transactional @Service是通过外观服务访问的,这需要在外观事务中包含多个服务(例如,超过 2 个应用程序组件的观察者服务)
  6. 一些接口有多个实现(目前用 区分@Qualifier
  7. 未来指南(或很高兴拥有功能) - 每个应用程序模块都有beanRefContext.xml文件来配置其内部应用程序上下文

当我过去使用 XML 配置时,我能够强制执行我上面介绍的所有准则,但是当切换到注释时,Spring 似乎行为不端。
我小组中的开发人员更喜欢注解配置(我似乎更容易连接和编写新代码),但我注意到他们在代码中引入的各种“黑客”以防止处理 Spring 应用程序上下文故障。

问题

  1. 使用注释配置时我应该遵循哪些最佳实践?
    • 当每个接口使用多个实现时(试图减少使用@Primaryor @Qualifier
    • 使用时@Transactional
    • 使用时@ManagedResource
    • 使用上述组合时
  2. 有没有办法停止使用 CGLib,保留注释配置并且仍然能够导出带有注释的 MBean?
  3. 保留我的大部分(最好是全部)指南的合适实施是什么?
0 投票
1 回答
604 浏览

java - 拳击拆箱、cglib、spring 和 NoSuchMethodError 之谜

我在我的项目中使用 Spring 和 GWt。在少数情况下NoSuchMethodError,当我调用 spring bean 代理的方法时,我会被 CGLIB 抛出。

如果我查看错误,它表明它试图找到一个使用Integer对象而不是基本int字段的方法。

例如,我有一个在我的 spring bean 中定义的方法

当我调用此方法时,会引发错误:NoSuchMethodError这表明它尝试saveObject使用字段java.lang.Integer而不是基本int字段(使用 I 键)查找方法

有什么问题 ?是否有装箱/拆箱问题?我确切地说,我用基本的 int 而不是 Integer 来调用这个方法。

0 投票
1 回答
1514 浏览

java - CGLib 和序列化

我想要做的是序列化一个实现命令模式的类,以便我以后可以运行它。最重要的是,我想序列化一个匿名类(我知道这个问题)

让它有点复杂的是我在一个春天的环境中,我希望序列化的匿名类是在一个将由 CGLib 代理的类中定义的。

我最初的尝试:

例如,storeJob 将序列化对象并将其存储以备后用,而这部分失败了。我没有包含此代码,但只是一个 ObjectOutputStream 调用

我知道整个 TestService 类需要序列化。问题是它被包装了一个 CGLib 代理并且这个代理没有实现可序列化(我的猜测是这个不能被序列化)。

非常感谢任何帮助。

0 投票
1 回答
1576 浏览

java - Java Service Provide API 应该如何工作?

似乎每个人都对Java Service Provider有过不愉快的印象,你可以用一个名为 META-INF/services/com.example.Interface 的文件来做这件事,但是除了尝试加载正确的 XML 解析器之外,没有人使用它. 我正在尝试使用一个使用服务提供程序 API 的库,并对其进行欺骗,以便我可以提供一些运行时扩展类(使用 cglib),这些类实际上并未实现接口,但可以轻松实现。

基本上,我认为我需要执行的步骤是:

  1. 创建一个自定义类加载器,它将响应 getResources(...) 并返回一个“额外”URL
  2. 当被要求提供“额外”资源时,还有那个类加载器挂钩 getResourceAsStream(...) 以返回我将使用 cglib 操作的类的列表
  3. 最后,让该类加载器在请求时加载这些类

但这就是我迷路的地方。例如,当库试图确定有哪些实现者时,它会调用 getResources(...) 来返回一堆 URL。但是 getResourceAsStream(...) 不需要 URL,它需要“名称”。似乎是类路径相关的名称,因此在任何地方都相同。所以 META-INF/services/com.example.Interface 与他们的 JAR 中的 META-INF/services/com.example.Interface 具有相同的“名称”,对吧?除了不知何故这适用于那些爆破的 XML 解析器......

当然,所有这些都假设他们足够聪明/友善地调用 ClassLoader.getSystemClassLoader() 而不是使用 ClassLoader.getSystemResources(...)、ClassLoader.getSystemResourceAsStream(...) 等,因为在后一种情况下有没有办法挂钩 ClassLoader 并提供伪造的文件。

我想在那种情况下,当我的代码被 Maven 打包时,我可以使用 BCEL 来操作类文件,而不是等到运行时使用 cglib 来操作?

0 投票
3 回答
4109 浏览

java - 使用大量 AOP 请求范围 bean 时的性能问题

我正在使用 Spring 3 开发一个半大型应用程序,并且在一次将数百名用户投入其中时遇到了性能问题。我正在使用 Spring 的 AOP 代理使用几个请求范围的 bean,我可以看到,每次我在其中一个 bean 上调用任何方法时,都会调用 CGLIB 拦截器,然后调用 AbstractBeanFactory.getBean(),后者调用 add()现有 Spring bean 的同步集。由于这个 add() 是同步的,当有数千个调用都在等待添加到同一个列表时,它会有效地锁定服务器。

有没有办法使用请求范围的bean来解决这个问题?我在 Spring 文档中读到,如果 bean 实现任何接口(http://static.springsource.org/spring/docs/2.0.0/reference/aop.html#d0e9015),则不使用 CGLIB,但我的请求范围为 bean都实现了一个(实际上是同一个),它仍然在发生。而且我肯定需要将 bean 设置为请求范围,因为它们的某些字段是在应用程序的一个部分中针对特定请求计算的,然后我使用 SpEL 在同一请求期间在应用程序的不同部分获取它们的值。我想如果我将 bean 原型设置为范围,那么当我第二次使用 SpEL 获取它们时,我会有一个新对象。

这是一个说明我的问题的代码示例。请参阅最后两行以获取描述我遇到问题的确切位置的评论。


我的想法是以下之一:

  • 我可以在不代理对 bean 进行的每个方法调用的情况下进行 Spring Bean 请求吗?并且没有将每种方法都标记为“最终”?

或者...

  • 我可以覆盖 Spring 的 bean 工厂以实现 Bean 缓存,该缓存将在调用 AbstractBeanFactory.getBean() 之前检查 bean 是否被缓存?如果是这样,我在哪里配置 Spring 以使用我的自定义 bean 工厂?
0 投票
2 回答
723 浏览

spring - 使用 @Transactional、Spring 2.5 和 cglib 部署时出现 AbstractMethodError

希望您能对此有所帮助。我正在使用 Spring@Transactional注释来标记事务性方法,并且我有必要的<tx:annotation-driven transaction-manager="txManager"/>. 我的构建中包含 Spring 2.5.6 和 cglib 2.1_3。

在部署(到 Websphere 7 运行时)时,我看到 bean 创建异常,其根本原因是:

我认为这意味着我们正在调用 的generateClass(...)实例上的方法,该实例AbstractClassGenerator没有实现该方法。由于所有这些东西似乎都是在 Spring 中透明设置的,我不确定从这里到哪里来解决问题……有什么想法吗?

0 投票
1 回答
464 浏览

grails - 集成测试失败 - Grails 的自动装配问题

无论出于何种原因,当我尝试运行任何集成测试时,都会得到以下信息:

为什么 CGLib 包装我注入的类并导致测试失败?我正在运行 grails 1.3.6 并通过 Intelli-J Ultimate 10.01 运行测试。

0 投票
2 回答
1634 浏览

java - Spring MVC 中整数(最终类)的 CGLib 代理

我需要这样的用法:

对于每个请求,我想将 userId 注入 DemoController但由于是没有空构造函数的最终类,我无法注入它。在这种情况下,最佳做法是什么?具有请求范围的服务可以吗?

0 投票
3 回答
3409 浏览

java - CGLib Mixin 示例

有人可以给我一个 Java CGLib Mixin类用法的好例子吗?我一直在挖掘它们似乎都不够简单。

0 投票
3 回答
4420 浏览

java - Spring - 不能强制作为 CGLIB 代理的 Classcast 异常

这是让我发疯的场景。

  1. 我有一个具有查找方法的类 - createOther()
  2. createOther 应该创建一个其他类型的对象。其他实现 OtherInterface 并且还有一个方法 doSomething 被标记为@Async
  3. 由于 Other 实现了 OtherInterface,因此 Spring 为我提供了一个无法转换为 Other 的 JDK 代理。
  4. Spring 文档建议使用<aop:config proxy-target-class="true">- 但我是新手,使用它似乎没有帮助。

问题:如何告诉 Spring 我需要一个针对 Other 类的 CGLib 代理?

下面的代码因类转换异常而失败。

应用程序.java:

}

** 其他.java **

** appcontext.xml **