我正在处理这个Spring MVC
项目,我无法通过Dao
实现的Interface
在控制器中自动连接此Dao
类。这是我spring-config.xml
的一部分。我使用的是aspectJ
,Annotation
和TX 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>
@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;
}
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
。
答案 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
。