我们习惯这样编写代码:
在service层写接口,然后用实现类去实现接口,并且将实现类注入到容器中,
@Service
public class AccountServiceImpl implements AccountService {}在controller层却是用接口操作service的bean的方法,
@Autowired private AccountService userService;
为神魔这样?
理解:
1)注入的就是实现类,只不过拿接口来接收,接受的类型为接口,面向接口编程,那么为何要面向接口编程?这就涉及到使用接口做代理,因为通过@autowired的对象是通过接口的方式会使用jdk动态代理,jdk动态代理只能对实现接口的类生成代理,而不能针对类。
2)注入的是实现类对象,接收的是接口;理解为多态;
如果一个service接口有多个实现类呢?
controller类中使用@resource并通过byname的方式注入,不要用@autowired这种通过类型的方式了,
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手动指定接收
版权声明:本文为fulong0406原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。