我正在编写一个简单的程序来测试bean post processore但是得到了NullPointerException。这是我写的代码
人类:
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void init(){
System.out.println("Bean Initialize");
}
public void destroy(){
System.out.println("Bean Destroy");
}
}
PostProcessor类:
public class Post implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("Before Initialization : " + beanName);
return null;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("After Initialization : " + beanName);
return null;
}
}
控制器CLass:
public class Controller {
public static void main(String[] args){
@SuppressWarnings("resource")
AbstractApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Person p = (Person)context.getBean("person");
System.out.println(p.getName());
context.registerShutdownHook();
}
}
Spring.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="person" class="com.data.Person" init-method="init" destroy-method="destroy">
<property name="name" value="Spring"></property>
</bean>
<bean class="com.postprocessor.Post"/>
Stack Trakce:
After Initialization : person
Apr 27, 2016 10:29:08 PM org.springframework.context.support.ClassPathXmlApplicationContext refresh
WARNING: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'person' defined in class path resource [spring.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'person' defined in class path resource [spring.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:839)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:538)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
at com.controller.Controller.main(Controller.java:12)
Caused by: java.lang.NullPointerException
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1660)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1645)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 12 more
这是我写的所有代码都可以告诉我在这里做的错误是什么。我会感激的。
答案 0 :(得分:5)
我不确定你想要实现什么,但为了正常运行,BeanPostProcessor应该在其方法中返回bean实例,而不是像你那样返回null。
答案 1 :(得分:2)
@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("Before Initialization : " + beanName);
return bean;
}
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
System.out.println("After Initialization : " + beanName);
return bean;
}
BeanPostProcessor
是一个工厂钩子,允许自定义修改新的bean实例,例如检查标记接口或用代理包装它们。
此界面的目的是定义您可以实现的回调方法,以提供您自己的实例化逻辑,依赖关系解析逻辑,修改新bean实例等。
作为示例,您可以在bean实例化时将bean包装在代理bean中。
如果PostProcessor
调用已定义的AbstractAutowireCapableBeanFactory
方法来获取包装的bean,并且从null
方法返回PostProcessor
,这实际上创建了空指针例外强>
FYI 来自grepcode
的相应代码