如何从实例初始化程序块调用注入的bean方法

时间:2015-11-27 07:02:09

标签: java spring spring-mvc

我正在使用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(){

     } 
}

2 个答案:

答案 0 :(得分:2)

您正尝试从初始化程序块调用弹簧注入服务。使用@Resource注释的资源尚未被Spring注入控制器!这就是你获得NullPointerException的原因 创建一个单独的函数,用@PostConstruct注释。

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

    @Resource
    private SomeService someService;

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

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

答案 1 :(得分:0)

您的具体问题与Java处理CreateController

的方式有关
  

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

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

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

或者,您可以移除初始化程序块并添加Instance Initalizer Blocks带注释的设置方法。

{{1}}