繁体   English   中英

如何从实例初始值设定项块调用注入的 bean 方法

[英]How to invoke injected bean methods from instance initializer block

我正在使用 Spring 和 SpringMvc,我想在某个控制器中调用一个服务的方法,它们都由 Spring 管理。 当我尝试这样做时,我得到了 NullPointerException,但我发现在调用此方法之前确实调用了服务的构造函数。 我想可能这个Service在Spring中已经添加了,但是这个控制器中的属性还没有设置。

如何从 SpringContext 获取它?

我的代码是这样的:

 @Controller 
 @RequestMapping("/test") 
 public class SomeController {

     @Resource
     private SomeService someService;

     {
         someService.serviceMethod();
         //And something more
     }

     @RequestMapping("/someMethod")
     private void controllerMethod(){

     } 
}

您正在尝试从初始化程序块调用 spring-injected 服务。 你用@Resource注解的资源还没有被spring注入控制器! 这就是为什么你会得到 NullPointerException 创建一个单独的函数,用 @PostConstruct 注释。

@Controller 
@RequestMapping("/test") 
public class SomeController {

    @Resource
    private SomeService someService;

    @PostConstruct
    public void postConstruct(){
        someService.serviceMethod();
    }
}

“postConstruct”方法将在 bean(即控制器)被创建并且所有依赖项(包括 SomeService)被注入到 bean 之后被调用。 当然,它满足你的要求,它应该只被调用一次。

您的具体问题与 Java 处理Instance Initalizer Blocks 的方式有关

Java 编译器将初始化块复制到每个构造函数中。 因此,这种方法可用于在多个构造函数之间共享代码块。

如果您想坚持使用初始化程序块,您可以通过向控制器添加构造函数并将您的服务注入其中来解决问题:

@Autowired
public SomeController(SomeService someService) {
  this.someService = someService;
}

或者,您可以删除初始化程序块并添加@PostConstruct注释设置方法。

@PostConstruct
public void setupSomeController(){
    someService.serviceMethod();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM