Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring-如何注入具体的接口实现?_Java_Spring_Service_Dependency Injection_Autowired - Fatal编程技术网

Java Spring-如何注入具体的接口实现?

Java Spring-如何注入具体的接口实现?,java,spring,service,dependency-injection,autowired,Java,Spring,Service,Dependency Injection,Autowired,我需要通过@Autowired注入服务类的具体实现 服务接口: public interface PostService { ... } @Autowired @Qualifier("postServiceImpl") private PostServiceImpl postService; 实施: @Service("postServiceImpl") public class PostServiceImpl implements PostService { ... } 服务中的方法与@

我需要通过@Autowired注入服务类的具体实现

服务接口:

public interface PostService {
...
}
@Autowired
@Qualifier("postServiceImpl")
private PostServiceImpl postService;
实施:

@Service("postServiceImpl")
public class PostServiceImpl implements PostService {
...
}
服务中的方法与@Transactional注释一起使用

现在我想将postServiceImpl注入我的控制器-因为我需要使用实现中的一个方法,该方法不在接口中:

public interface PostService {
...
}
@Autowired
@Qualifier("postServiceImpl")
private PostServiceImpl postService;
我得到无此定义异常,并显示以下消息:

未为找到类型为[(…).PostServiceImpl]的符合条件的bean 依赖项:至少需要1个符合autowire条件的bean 此依赖项的候选项

当我将控制器中的字段更改为:

private PostService postService

它可以工作,但我不能使用PostServiceImpl中的特定方法。

因为您的方法带有注释
@Transactional
,spring将在运行时创建代理,以注入事务管理代码。默认情况下,Spring使用JDK动态代理作为代理机制,代理机制基于接口


因此,在本例中,spring创建了另一个实现
PostService
接口的类,并创建了该类的bean。肯定不能自动连接到
PostServiceImpl
,因为它们是同级。然而,若你们真的想在类上自动连接,你们可以强迫spring使用CGLib代理,而CGLib代理使用子类化。如果您使用的是基于Java的配置,则可以在
@EnableTransactionManagement
注释中设置
proxyTargetClass=true
,然后将其添加到接口中。如果您注入具体类型,那么声明接口有什么意义?您是否有一些方面应用于该bean?还是基于接口的代理?@fcracker79我想我有,因为服务中的方法带有@Transactional注释。注入具体实现违背了IoC的整体目标。确实有:在接口中声明setter。或者在bean也实现的另一个接口中声明它。或者根本不使用接口,因为您已经准备好直接使用具体类了。