SpringMvc Instantiating Beans - Singleton

时间:2012-09-27 00:54:04

标签: java spring-mvc singleton nullpointerexception factory-pattern

在下面提到的代码中我创建了这个因为我收到了java.lang.NullPointerException,请参阅我的错误日志。当我实现它时,它是固定的,它完美地工作。然而,其中一位成员告诉我 -

“你正在为每次调用getOfficerRegistrationValidation创建新的bean。这包括重新创建数据库对象,这些对象都是昂贵的,并且如果某个对象应该只创建一次(单例)就会出现成本错误。你应该找到一个使OfficerRegistrationValidation可重用和线程安全的方法,以便您只能使用其中一个并将其注入到只使用IoC“

的任何地方

我认为他是对的,有人可以告诉我最新的方法,而不必再次实例化我的所有豆子。我只想实例化某些bean而不是遇到这个问题。

public final class BeanFactory() {

    private static ClassPathXmlApplicationContext context;

    private static ClassPathXmlApplicationContext getContext() {
        if (context== null) {
            context = new ClassPathXmlApplicationContext("applicationContext.xml");
        }
        return context;
    }

    public static OfficerRegistrationValidation getOfficerRegistrationValidation() {
        return (OfficerRegistrationValidation) getContext().getBean("officerRegistrationValidation");
    }
}

在控制器中进行调用,如:`BeanFactory.getOfficerRegistrationValidation()。validate(....)

错误日志:

java.lang.NullPointerException
    at com.crimetrack.service.OfficerRegistrationValidation.validate(OfficerRegistrationValidation.java:51)
    at org.springframework.validation.DataBinder.validate(DataBinder.java:725)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:815)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:367)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    at java.lang.Thread.run(Unknown Source)

1 个答案:

答案 0 :(得分:1)

我会猜测你的问题(因为你的问题没有提供你使用beanfactory的动机,也没有提供足够的代码来提供完整的图片)......

默认情况下,Spring bean被实例化为单例。因此,您应该能够使用XML或注释(OfficerRegistrationValidation)配置Spring以创建@Component对象,然后使用@Inject注释将其注入控制器。

注释是要走的路 - 只需确保在Spring配置XML(applicationContext.xml)中有以下内容:

<context:component-scan base-package="com.acme.project" />
<mvc:annotation-driven />

然后只需将@Component注释添加到OfficerRegistrationValidation类的类声明中:

@Component
public class OfficerRegistrationValidation {
    // ...
}

然后在您的控制器中,为您的OfficerRegistrationValidation声明一个字段并对其进行注释:

@Controller
public class MyController {
    @Inject
    private OfficerRegistrationValidation officerRegistrationValidation;
    // ...
}

现在您可以访问控制器中的OfficerRegistrationValidation单例bean - 只需要4行代码!