spring:为什么我们自动装入界面而不是实现的类?
例
interface IA { public void someFunction(); } @Resource(name="b") class B implements IA { public void someFunction() { //busy code block } public void someBfunc() { //doing b things } } @Resource(name="c") class C implements IA { public void someFunction() { //busy code block } public void someCfunc() { //doing C things } } class MyRunner { @Autowire @Qualifier("b") IA worker; worker.someFunction(); }
谁可以给我解释一下这个。
- Spring如何知道使用哪种多态types。
- 我需要
@Qualifier
还是@Resource
? - 为什么我们自动assembly接口而不是实现的类?
Spring如何知道使用哪种多态types。
只要接口只有一个实现,并且在Spring组件扫描启用的情况下使用@Component
注释实现,Spring框架就可以find(接口,实现)对。 如果组件扫描未启用,那么您必须在application-config.xml(或等效的弹簧configuration文件)中显式定义bean。
我需要@Qualifier还是@Resource?
一旦你有多个实现,那么你需要限定每个实现,并且在自动布线过程中,你需要使用@Qualifier
注解来注入正确的实现以及@Autowired
注解。 如果您正在使用@Resource(J2EE语义),那么您应该使用该注释的name
属性指定bean名称。
为什么我们自动assembly接口而不是实现的类?
首先,对一般的接口进行编码总是一个好习惯。 其次,如果是spring,可以在运行时注入任何实现。 一个典型的用例是在testing阶段注入模拟实现。
interface IA { public void someFunction(); } class B implements IA { public void someFunction() { //busy code block } public void someBfunc() { //doing b things } } class C implements IA { public void someFunction() { //busy code block } public void someCfunc() { //doing C things } } class MyRunner { @Autowire @Qualifier("b") IA worker; .... worker.someFunction(); }
你的beanconfiguration应该如下所示:
<bean id="b" class="B" /> <bean id="c" class="C" /> <bean id="runner" class="MyRunner" />
或者,如果您在包含这些文件的包上启用了组件扫描,那么您应该使用@Component
来限定每个类,如下所示:
interface IA { public void someFunction(); } @Component(value="b") class B implements IA { public void someFunction() { //busy code block } public void someBfunc() { //doing b things } } @Component(value="c") class C implements IA { public void someFunction() { //busy code block } public void someCfunc() { //doing C things } } @Component class MyRunner { @Autowire @Qualifier("b") IA worker; .... worker.someFunction(); }
然后, MyRunner
worker
将被注入一个B
types的实例。
也可能会导致像Cglib2AopProxy无法代理方法日志中的一些warnigs。 为什么总是在服务和dao层中使用单一的实现接口?
- Ioc / DI – 为什么我必须引用入口应用程序中的所有层/组件?
- 通过构造函数或属性设置程序进行dependency injection?
- 匕首和黄油刀与Android注释
- dependency injection和Mocking框架之间的区别(Ninject vs RhinoMock或Moq)
- Spring:命名空间vs contextConfigLocation web.xml中的init参数
- Angular2 – 如何将窗口注入到angular2服务中
- Ninject模块的意图是什么?
- DAL – > BLL < – GUI +组合根。 如何设置DI绑定?
- 如何在scala中进行dependency injection?