- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在Spring 3.1.1中偶然发现使用@Cacheable创建的AOP代理破坏依赖注入(inject)的情况。这是我的场景:
我有一个接口(interface)和一个在实现的方法中使用@Cacheable 实现这个接口(interface)的类。
示例界面:
public interface ImgService {
public byte[] getImage(String name);
}
示例实现:
public class ImgServiceImpl implements ImgService {
@Cacheable(cacheName = "someCache")
public byte[] getImage(String name){//TODO};
protected String someOtherMethod(){//};
}
我还必须测试 JUnit 类 - 一个注入(inject)接口(interface),一个注入(inject)实现:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceTest {
@Inject
private ImgService;
}
和
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:META-INF/spring.xml" })
public class ImgServiceImplTest {
@Inject
private ImgServiceImpl;
}
接口(interface)的依赖注入(inject)工作正常。然而,当我开始在第二个测试类中注入(inject)实现时,我得到了一个“注入(inject) Autowiring 的依赖项失败”。我能够对其进行调试,并且 ClassUtils.isAssignableValue() 似乎错误地将所需类型与代理类进行了比较。它由 DefaultListableBeanFactory 调用。更奇怪的是,如果我从实现的方法中删除 @Cacheable 注释并将其添加到其他一些 protected /私有(private)方法中,依赖注入(inject)将再次正常工作。这是一个错误吗?处理这种情况的正确方法是什么?
最佳答案
这不是错误,这是使用 JDK 动态代理实现 AOP 的预期副作用。
由于对 ImgServiceImpl
的可缓存方法的所有调用都应该通过 ImgService
类型的动态代理,因此无法将此依赖项注入(inject)到 类型的字段中code>ImgServiceImpl
.
当您将 @Cacheable
移动到 private
或 protected
方法时,注入(inject)会起作用,因为 @Cacheable
不会在这种情况下生效 - 只有 public
方法可以使用基于代理的 AOP 建议。
因此,您应该将要注入(inject)的字段声明为 ImgService
,或者将 Spring 配置为使用基于目标类的代理,而不是使用 proxy-target-class = "true"
.
另一个选择是配置 Spring 使用 AspectJ-based AOP implementation (需要编译时或加载时织入)。
它适用于 Spring 提供的所有基于 AOP 的特性(事务、安全性、异步执行、缓存、自定义方面等)。
另请参阅:
关于java - @Cacheable 打破 DependencyInjection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11937354/
我有一个我创建的服务 (DependencyInjection),我在我的 Controller 上使用它作为: $this->get("service_name")->someMethod() 我想
ASP.Net Core 内置的依赖注入(inject)功能是否支持自动注册服务?我不想像这样手动注册它们: services.Add(new ServiceDescriptor(typeof(IUs
这个库提供了在启动期间实例化已注册的单例,而不是在首次使用它时实例化。 单例通常在首次使用时创建,这可能会导致响应传入请求的延迟高于平时。在注册时创建实例有助于防止第一次Request请求的SLA
使用 Unity、AutoFac 或其他 IOC 容器时,您必须注册并解析 IInterface 才能获取实例。这是您在应用程序类中执行的所有操作的根。 在完成注册/解析之后,我正在创建我的 Main
在Spring 3.1.1中偶然发现使用@Cacheable创建的AOP代理破坏依赖注入(inject)的情况。这是我的场景: 我有一个接口(interface)和一个在实现的方法中使用@Cachea
我一直在使用 symfony/console 来制作命令并像这样注册它们,一切正常: 垃圾箱/控制台: #!/usr/bin/env php add(new LocalitiesCommand(new
我正在使用 sonataNofificationBundle ,他们提供了四个后端。我有自定义要求,所以想再添加一个后端。他们有后端配置 DependencyInjection/configurati
在 ASP.NET CORE Web 应用程序中,我有一个 MyRepository 类和一个管理对存储库(数据库)的访问的接口(interface) IMyRepository。 每次用户连接到应用
我正在尝试将 Microsoft.Extensions.DependencyInjection 合并到一个现有 ASP.NET 4.6.1 应用中。 我知道虽然 .NET Core 内置了它,但对于
我注册了两次类(class),但契约(Contract)不同。 services .AddSingleton() .AddSingleton(sp => sp.GetService()
当我在生产(仅)环境中执行命令时 我有错误 [Symfony\Component\DependencyInjection\Exception\InvalidArgumentException] The
我正在从 Unity Container 迁移我的 .NET 应用程序依赖注入(inject)框架至 Microsoft.Extensions.DependencyInjection . 现在我找不到
当我在生产(仅)环境中执行命令时 我有错误 [Symfony\Component\DependencyInjection\Exception\InvalidArgumentException] The
我正在从 Unity Container 迁移我的 .NET 应用程序依赖注入(inject)框架至 Microsoft.Extensions.DependencyInjection . 现在我找不到
我想从我的包中自动添加路由,而不是将指向我的包的路由方案的链接添加到 routing.yml 中。例如,这可以是管理员的包。每个使用这个包的应用程序都将获得特殊的/admin/xxx 路由,而无需
首先,我使用的是微软的依赖注入(inject)包。 (ServiceProvider, ServiceCollection) 目前进展顺利,除了这个问题。 我有类,我像这样注册到我的 DI this.
我在自己的爱好项目中使用 ASP.NET Core,我想创建一个将由开发人员使用的框架,我想允许可选服务并在未注册时使用默认值。 我遇到了 Unable to resolve service for
使用 Ninject 和 MVVMLight。使用 TransientScope 绑定(bind)到 View 模型。 当 View 消失时, View 模型就会退出范围。 清除我的 View 模型的
使用 Microsoft.Extensions.DependencyInjection 作为容器时如何注册装饰器类? 当以下列方式注册我的类型时(类似于 CaSTLe Windsor),我在解析 IM
我正在使用 ASP.NET Core 进行网络作业。我无法正确设置依赖注入(inject)。 public static async Task Main(string[] args) {
我是一名优秀的程序员,十分优秀!