针对接口自动装配 returns null - Spring MVC
Autowiring against Interface returns null - Spring MVC
我正在处理这个 Spring MVC
项目,我无法通过 Interface
实现 Dao
class 自动连接到控制器中 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>
道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
。
我正在处理这个 Spring MVC
项目,我无法通过 Interface
实现 Dao
class 自动连接到控制器中 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>
道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
。