是否可以在扩展另一个类的类中使用@Value
?
以下是相关的代码段。在Lo_Controller
类中,它可以完美地运行,但在Lo_DisplayHandler
中始终返回null
。我能想到的唯一原因是因为它依赖于另一个没有用@Component
注释的类。如果这是原因,那么从类似于@Value
的属性文件中读取值的建议选项是什么?
为了测试它,我在@Component
中从@Controller
更改为Lo_DisplayHandler
,看看,如果它们彼此之间有某种关联,则会返回null
好。
这有效:
package com.ma.common.controller;
imports ...
@Controller
@RequestMapping("/log")
public class Lo_Controller {
@Value("${log.display.lastpage}")
private String lastPageUrl;
...
这总是返回null
:
package com.ma.log.handler;
imports ...
@Component
public class Lo_DisplayHandler extends Lo_Handler {
public Lo_DisplayHandler() {
super();
}
@Value("${log.display.lastpage}")
private String lastPageUrl;
...
MVC-调度-servlet.xml中
<context:component-scan base-package="com.ma.common.controller, com.ma.log.handler" />
<context:property-placeholder location="classpath:restServices.properties"/>
<mvc:annotation-driven />
<mvc:resources mapping="/**" location="/" />
@Component
public class Lo_DisplayHandler extends Lo_Handler {
@Value("${log.display.lastpage}")
private String lastPageUrl;
public void anyOtherMethod(){
String _a = lastPageUrl; //FAIL - always null
}
@PostConstruct
public void initIt() throws Exception {
String _a = lastPageUrl; //OK - when the application is deployed and started for the first time
}
@PreDestroy
public void cleanUp() throws Exception {
String _a = lastPageUrl; //OK - when the application is stopped
}
web.xml
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
答案 0 :(得分:0)
这里有三个可能的问题:
首先,我不鼓励扩展类,因为Spring可以更好地自动连接依赖项。但它应该工作 其次,您必须关注bean的生命周期。该物业将在实施后设定。 @PostConstruct验证内容。 第三,财产持有人的等级背景下的可见性不是直截了当的。因此,如果您在根applicationContext中定义@value,则它不会由您的dispatcherServlet上下文设置。要测试它,请注入在根级别定义的bean的依赖关系,您将看到您的@Value将被考虑在内。
可以从同一上下文中的bean访问lastPageUrl属性(通过push创建或pull创建)。 在创建push的情况下,如果另一个bean自动装入Lo_DisplayHandler bean并调用你的方法anyOtherMethod(),它将获得该值。
@Component
public class ScannableIntoYourContext{
@Autowired
private Lo_DisplayHandler myHandler;
}
其他方法是从ObjectFactory中提取bean。
@Autowired
private ObjectFactory<Lo_DisplayHandler> bean;
Lo_DisplayHandler instanceFromContext = bean.getObject();