springboot中service层注入的是实现类,但Controller层接收的是接口

我们习惯这样编写代码:

在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版权协议,转载请附上原文出处链接和本声明。