如何在类型为接口的注入点中自动装配实现

时间:2012-07-03 22:00:38

标签: java spring interface dependency-injection

使用Spring MVC,我有这个Controller类:

@Controller
public class LoginController {
    @Autowired
    private LoginService loginService;
    // more code and a setter to loginService
}

LoginService是一个接口,其唯一的实现是LoginServiceImpl

public class LoginServiceImpl implements LoginService {
    //
}

我的project-name-servlet.xml文件就是这个:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/context 
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">   
    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/" />
        <property name="suffix" value=".jsp" />
    </bean>
    <bean id="loginService" class="my.example.service.impl.LoginServiceImpl" />
    <bean class="my.example.controller.LoginController" />
</beans>

问题是,loginService未注入控制器。如果我在XML文件中指定注入,如下所示:它可以工作:

    <bean id="loginService"
        class="may.example.service.impl.LoginServiceImpl" />
    <bean class="my.example.controller.LoginController">
        <property name="loginService" ref="loginService"></property>
    </bean>

为什么会这样?不应该在接口类型注入点注入唯一的实现bean吗?

2 个答案:

答案 0 :(得分:1)

您必须为自动装配添加AutowiredAnnotationBeanPostProcessor - 默认情况下它是byType,因此您无需执行任何明确的操作即可将loginService注入LoginController。如链接所示,您可以放置​​<context:annotation-config/><context:component-scan/>来自动注册AutowiredAnnotationBeanPostProcessor。

答案 1 :(得分:0)

对我有用的解决方案是将自动线类型定义为byType

    <bean id="loginService"
        class="my.example.service.impl.LoginServiceImpl"
            autowire="byType" />
    <bean class="my.example.controller.LoginController"
            autowire="byType" />

此外,我删除了@Autowired注释。