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将被注入一个Btypes的实例。

也可能会导致像Cglib2AopProxy无法代理方法日志中的一些warnigs。 为什么总是在服务和dao层中使用单一的实现接口?