针对Interface的自动装配返回null - Spring MVC

时间:2015-09-12 14:38:12

标签: java spring spring-mvc autowired

我正在处理这个Spring MVC项目,我无法通过Dao实现的Interface在控制器中自动连接此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>

Dao类:

@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则返回null,尽管variables在应用程序加载时为initialized via setters

3 个答案:

答案 0 :(得分:1)

您为oidDao使用组件扫描手动接线。您在xml配置中定义了<bean id="oidDao" class="com.simulator.service.OidDao"> <property name="ipaddressNC" value="${ipaddressNC}" /> <property name="ipaddressOM" value="${ipaddressOM}" /> </bean> ,如下所示:

Component

然后,在OidDao上添加@Component public class OidDao implements OidManager { ... } 注释,如下所示:

Component

删除<context:component-scan base-package="com.simulator" />注释,我猜你会好的!否则,OidDao会选择setters并使用默认构造函数从中实例化一个实例,而无需调用NO

答案 1 :(得分:1)

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

答案 2 :(得分:0)

将bean定义更改为:

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

让这个创建标识为oim的bean,可以将其设置为Controller中的属性oim