@Value不延伸其他类的内部工作(@Value not working inside a clas

2019-09-30 08:40发布

是否有可能使用@Value扩展另一个类的类中?

下面是相关的代码片段。 在Lo_Controller类它完美的作品,但在Lo_DisplayHandler总是返回null 。 我能想到的唯一原因是因为它依赖于另一个类,这是不符合注释@Component 。 如果是这样的原因,什么是推荐的选项读值从属性文件类似@Value

只是为了测试它,我从改变@Component@ControllerLo_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>

Answer 1:

三种可能出现的问题在这里:

首先,我要disencourage扩展类作为春季效果更好自动装配依赖。 但也应该第二个工作,你必须专注于一个bean的生命周期。 酒店将在instanciation后进行设置。 @PostConstruct验证内容。 第三,在财产持有人的分层上下文的能见度不直截了当。 所以,如果你在根的applicationContext定义@value,它不会被你的DispatcherServlet中设置。 为了测试它,请在注射根级别定义的bean的依赖,你会看到你的@Value将采取账户。

该lastPageUrl属性将可以访问来自同一上下文中的Bean(通过创建推或拉创建)。 在推动创作的情况下,如果另一个bean自动装配的Lo_DisplayHandler bean并调用你的方法anyOtherMethod(),它会得到的值。

@Component
public class ScannableIntoYourContext{

    @Autowired
    private Lo_DisplayHandler myHandler;

}

另一种方式是从的ObjectFactory拉豆。

@Autowired
private ObjectFactory<Lo_DisplayHandler> bean;

Lo_DisplayHandler instanceFromContext = bean.getObject();


文章来源: @Value not working inside a class which extends other