在下面提到的代码中我创建了这个因为我收到了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)
答案 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行代码!