找不到一个明确的答案,所以问这里 - 是否可以打开只有一个bean的CGLIB代理?场景如下 - 我有一个自动装配的类,没有实现任何接口,现在我想添加一个接口,它将覆盖它的一小部分方法。是否有可能使用CGLIB而不影响Spring的默认行为(首选JDK动态代理)的这个类?
我正在使用基于java的配置。弹簧有选择地使用实现,而不是接口
-1
A
回答
1
那里(目前)没有任何支持开箱即可为单个类启用基于类的代理。相反,您必须自己创建代理。这样做的缺点是你需要一些关于Spring如何工作的知识(我碰巧拥有:))。
您应该/可以使用ProxyFactory
或ProxyFactoryBean
为您的给定类创建基于类的代理。您的@Bean
方法将返回代理而不是实际的类。 Spring然后足够聪明(至少它应该)检测它已经是代理,而不是代理它再次它应该添加建议到已经创建的代理。为了在不破坏汽车布线和Spring给你的所有其他好东西的情况下进行这项工作,你可能需要创建一个处理这个问题的特定的BeanPostProcessor
。
public YourBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof YourBean) {
ProxyFactory factory = new ProxyFactory(bean);
factory.setProxyTargetClass(true);
return factory.getProxy();
}
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
把这个注册为一个bean,就像你通常会用BeanPostProcessor
做的那样。
@Bean
public static YourBeanPostProcessor yourBeanPostProcessor() {
return new YourBeanPostProcessor();
}
现在你有一个预先创建的基于类的代理,它应该被Spring检测和使用。
相关问题
- 1. 为什么“仅实现接口显式”仅仅有时可用,而不是“实现接口”(即隐含地)?
- 2. 接口代码而不是实现?
- 3. 弹簧和接口
- 4. 实现从数据库本地化而不是弹簧属性文件
- 5. 强制声明(.NET)使用接口而不是具体实现
- 6. Typescript类使用接口作为类型而不是实现
- 7. 错误而使用弹簧
- 8. 弹簧接口加载
- 9. 弹簧MVC:选择标签
- 10. 使用泛型并在接口中实现可选字段或可选地实现接口?
- 11. 使用SFINAE选择要实现的接口
- 12. 有条件地实现一个接口
- 13. 使用CustomRepository FPGA实现带弹簧的引导和弹簧数据的JPA
- 14. 为弹簧应用选择表示层?
- 15. 使用现有的本地文件,而无需选择
- 16. 弹簧形式:选择所选值
- 17. 如何选择性地禁用弹簧启动缓存(manifest.appcache)
- 18. 不能在容器外使用弹簧豆。总是选择WebSphere Context
- 19. 使用弹簧配置而不为客户创建弹簧依赖关系
- 20. 什么计划,以一个接口,而不是程序实现
- 21. JPA:通过接口而不是实现来寻找
- 22. 去实现的方法,而不是接口
- 23. 为什么列表中选择接口而不是类
- 24. #1的错误,而使用弹簧JPA
- 25. 在外部接口弹簧“@MessagingGateway”注释
- 26. 弹簧数据@Query注释和接口
- 27. 使用弹簧
- 28. C++ WinSock选择本地接口连接
- 29. 为弹簧控制器使用scala伴侣对象而不是在服务层实现?
- 30. 如何选择弹簧形式使用jQuery的所有复选框
为什么?如果您需要在使用界面时对具体实例进行编程,那么您做错了,或者至少您的界面与您试图表达的意图不符。 –
@ M.Deinum我知道,我知道,非常感谢。你知道这个问题的答案吗? – skwisgaar
答案基本上不是这样做,并有一个适当的接口和使用。如果你只希望这个单一的实例代理,你需要手动创建代理或启用基于类的代理,然后它将用于一切。 –