java 注入service接口,Spring - 如何注入具体的接口实现?

I need to inject by @Autowired concrete implementation of a service class.

Service interface:

public interface PostService {

...

}

Implementation:

@Service("postServiceImpl")

public class PostServiceImpl implements PostService {

...

}

Methods in the service are with @ Transactional annotation

And now I want to inject postServiceImpl to my controller - because I need to use one method from the implementation, that is not in the interface:

@Autowired

@Qualifier("postServiceImpl")

private PostServiceImpl postService;

I get NoSuchBeanDefinitionException with the following message:

No qualifying bean of type [ (...) .PostServiceImpl] found for

dependency: expected at least 1 bean which qualifies as autowire

candidate for this dependency.

when I change the field in my controller to:

private PostService postService

it works, but I can't use a specific method from PostServiceImpl.

解决方案

Since your methods are annotated @Transactional, spring will create proxy at runtime, to inject transaction management code. By default Spring uses JDK Dynamic Proxy for proxying mechanism, which proxies based on interfaces.

So, in this case, spring creates another class which implements PostService interface, and creates bean of that class. Definitely that cannot be autowired to PostServiceImpl, as those are siblings. However, if you really want to autowire on class, you can force spring to use CGLib proxy instead, which proxies using subclassing. That you can do by setting proxyTargetClass=true in your @EnableTransactionManagement annotation, if you're using Java based config.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值