-1

在下面提到的代码中,我创建了这个,因为我得到了 java.lang.NullPointerException,请参阅下面的错误日志。当我实现它时,它已修复并且运行良好。然而,这里的一位成员告诉我——

“您正在为每次调用 getOfficerRegistrationValidation 创建新的 bean。这包括重新创建数据库对象,这些对象非常昂贵,并且如果某些对象应该只创建一次(单例),则可能会产生错误。您应该找到一种方法来使 OfficerRegistrationValidation 可重用并且线程安全,这样您就可以只使用其中一个并将其注入到您想要仅使用 IoC 的任何位置”

我认为他是对的,有人可以告诉我最好的方法是什么,而不必再次实例化我所有的 bean。我只想实例化某些 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)
4

1 回答 1

1

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

Spring bean 默认实例化为单例。因此,您应该能够配置 Spring 以OfficerRegistrationValidation使用 XML 或注释 ( @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 行代码!

于 2012-09-27T01:20:35.233 回答