针对接口自动装配 returns null - Spring MVC

Autowiring against Interface returns null - Spring MVC

我正在处理这个 Spring MVC 项目,我无法通过 Interface 实现 Dao class 自动连接到控制器中 Dao。这是我的 spring-config.xml 的一部分。我正在使用 aspectJAnnotationTX management.

<aop:aspectj-autoproxy />
<context:component-scan base-package="com.simulator" />
<context:annotation-config />
<tx:annotation-driven />

<context:property-placeholder
        location="classpath*:config.properties" />

<bean id="oidDao" class="com.simulator.service.OidDao">
        <property name="ipaddressNC" value="${ipaddressNC}" />
        <property name="ipaddressOM" value="${ipaddressOM}" />
        </bean>

道class:

@Component

public class OidDao implements OidManager {

    @Autowired
    private SessionFactory sessionFactory;
    private String ipaddressNC;
    private String ipaddressOM;

    public  String getIpaddressNC() {
        return this.ipaddressNC;
    }

    public  void setIpaddressNC(String ipaddressNC) {
        this.ipaddressNC = ipaddressNC;
    }

    public  String getIpaddressOM() {
        return ipaddressOM;
    }

    public  void setIpaddressOM(String ipaddressOM) {
        this.ipaddressOM = ipaddressOM;
    }

OidManager:

public interface OidManager {

    public  String getIpaddressNC();
    public  String getIpaddressOM();
}

控制器:

@Controller
public class HomeController {
    @Autowired
    OidManager oim;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String indexpage(ModelMap modelMap) {

        ApplicationContext context = 
                 new ClassPathXmlApplicationContext(new String[] {"spring-config.xml"});
         o = (OidManager)context.getBean("oidDao"); 

       o.getIpaddressNC(); // ---> this returns data read from ext properties file and works fine


                oim.getIpaddressNC(); // ---> this returns null`

我正在尝试重新使用 Dao,因此我不想从每个方法中多次调用 ApplicationContext。我究竟做错了什么?如果我将变量 getIpaddressNC, getIpaddressOM 设为静态,则 auto wiring 有效,如果 oim returns 不为空,尽管 variables 在应用程序加载时为 initialized via setters

您为 OidDao 同时使用了 组件扫描 手动接线 。您在 xml 配置中定义了 oidDao,如下所示:

<bean id="oidDao" class="com.simulator.service.OidDao">
        <property name="ipaddressNC" value="${ipaddressNC}" />
        <property name="ipaddressOM" value="${ipaddressOM}" />
</bean>

然后,在OidDao上添加了一个Component注解,如下:

@Component
public class OidDao implements OidManager {
...
}

删除 Component 注释,我想你会没事的!因为否则,<context:component-scan base-package="com.simulator" /> 将选择 OidDao 并使用默认构造函数从中实例化一个实例,而不调用您的 setters.

您正在使用@Component 注解+您还定义了一个bean。因此实际上创建了两个bean。由于使用@Component 而创建的一个将属性设置为'null'。这是预期的,因为您没有将属性设置为任何值。要么删除 @Component 注释并在 bean 定义上使用 'autowire-candidate="true"' 属性,要么删除 XML 中的 bean 定义并在 class 上使用相关注释来设置属性以更正来自属性 文件。

将您的 bean 定义更改为:

<bean id="oim" class="com.simulator.service.OidDao">
   <property name="ipaddressNC" value="${ipaddressNC}" />
   <property name="ipaddressOM" value="${ipaddressOM}" />
</bean>

让它创建 ID 为 oim 的 bean,它可以在您的控制器中设置为 属性 oim