为什么Controller层注入的是Service接口,而不是ServiceImpl实现类
2017-09-24 19:11
405 查看
为什么Controller层注入的是Service接口,而不是ServiceImpl实现类
今天在用maven+ssm时,发现一直提示报错:Error creating bean with name ‘自己定义的实现类’: Injection of autowired dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not autowire field
经过仔细排查,发现在注入service的时候写成
Service层 接口 interface PCI{} 接口实现类 @Service class PCIImpt imeplements PCI{} Controller层 @Autowired private PCIImpt pciImpt; //注入了实现类
*在没有使用maven管理的时候注入实现类编译一直未报错,也就是说编译可以通过,但是使用maven管理后,编译报错。
而正确的写法:*
Controller层 @Autowired private PCI pci; //注入接口以Autowired自动接收 结果:编译通过;
结论就是:注入的是实现类对象,接收的接口;理解为多态;(Controller–Service–ServiceImpt–Mapper)
要遵循Controller–Service接口–ServiceImpt实现类–Mapper接口模式
那么在Service接口有多个ServiceImpt实现类的情况,就需要指定参数名来选择哪个ServiceImpt实现类了。
Service层(此时有两个接口实现类) @Service("PCIImpt1") class PCIImpt1 imeplements PCI{} @Service("PCIimpt2") class PCIImpt2 imeplements PCI{} Controller层 @Resource(name="PCIimpt2") //填PCIimpt1,注入PCIimpt1实现类,填PCIimpt2,则注入PCIimpt2实现类 private PCI pci; //注入接口以Resource手动指定接收
同理:在ServiceImpt实现类中也是通过Mapper接口来接收;即:
ServiceImpt实现类 @Autowired private Mapper mapper;
以上就是我的个人理解,如有大神路过,希望指点一番;
相关文章推荐
- go结构体中String接口的实现为什么是结构体而不是指针
- 基于Spring+SpringMVC+Hibernate框架系统, 利用SpringAOP实现写日志,切入点的Controller层出现@AutoWire 注入Service为null的情况分析
- Map的new为什么是Map map=new HashMap();而不是new Map();?因为map是个接口,而接口不能被实例化!HashMap是map接口的实现类!
- @Resource引用一个bean时,为什么要声明接口而不是实现类?
- 为什么spring注入接口正确而注入接口的实现类错误?
- 风趣探讨:为什么需要一个接口,一个接口的实现类,而不是直接调用类里的方法
- 为什么要写service和dao的接口
- java 学习笔记--Comparator中为什么其他类实现这个接口为什么没有复写equals(Object obj)这个方法?
- mybatis源码学习--spring+mybatis注解方式为什么mybatis的dao接口不需要实现类
- spring为何要注入接口,而注入接口的实现类就会报错
- 我所理解的Remoting(3):创建CAO Service Factory使接口和实现相互分离
- 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入
- JavaBean为什么实现Serializable(序列化)接口
- Android 通过蒲公英pgyer的接口 Service 实现带进度下载App 通知栏显示 在线更新 自动更新Demo
- 为什么我希望用C而不是C++来实现ZeroMQ
- Mybatis接口在service注入失败的解决办法
- Spring为什么Autowired注入的是接口
- WebService之CXF注解之三(Service接口实现类)
- spring容器注入一个接口的两个实现类
- 关于Session(javax.servlet.HttpSession)持久化----为什么实体类需要实现序列化接口