AnnotationConfigApplicationContext尚未刷新

Kar*_*ckN 7 java spring spring-mvc

我正在开发一个spring MVC应用程序.当我尝试在我的控制器类中使用AnnotationConfigApplicationContext时,我收到以下错误.我不知道这个陈述究竟意味着什么.

@RequestMapping(value = "/generate", method = RequestMethod.POST)
public ModelAndView generateMappingFile(@ModelAttribute Mapping mapping) 
{
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    MappingFileGenerator mfg = ctx.getBean(MappingFileGenerator.class);
}
Run Code Online (Sandbox Code Playgroud)

错误消息 - >

java.lang.IllegalStateException:org.springframework.context.annotation.AnnotationConfigApplicationContext@116b3c0 has not been refreshed yet
Run Code Online (Sandbox Code Playgroud)

有人能解释我这里出了什么问题吗?我正在使用Spring 4.0.1 ..我是spring mvc的新手.

M. *_*num 8

当您创建一个新的实例ApplicationContext(无论哪种类型)时,您基本上是在为其配置的每个bean的新实例ApplicationContext.这是第一次很好,它可能会工作第二次,取决于bean的数量,豆类的类型将崩溃.由于上下文永远不会被破坏(直到应用程序崩溃并重新启动),您将遇到可能的内存问题,性能问题,奇怪的事务问题等.

一般的经验法则是永远不构造新的实例,ApplicationContext而是使用依赖注入.

如果你真的想要ApplicationContext在控制器中访问该类型的字段并将其放在@Autowired上面.

@Controller
public class MyController {

    @Autowired
    private ApplicationContext ctx;

    ….

}
Run Code Online (Sandbox Code Playgroud)

然后,您可以在方法中查找所需的bean.如果您ApplicationContext将bean用作工厂,这可能很方便.如果你需要的所有豆子都是单身,那么最好只需要注入你需要的豆子.

@Controller
public class MyController {

    @Autowired
    private MappingFileGenerator mfg ;

    ….

}
Run Code Online (Sandbox Code Playgroud)

现在Spring会注入它MappingFileGenerator,它可以在你的方法中使用.无需创建新的实例ApplicationContext.

有关详细信息,请参阅" Spring参考指南".