首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

spring 中的BeanPostProcessor接口解决思路

2014-01-05 
spring 中的BeanPostProcessor接口今天自己练习学习了BeanPostProcessor,发现了个问题,发现getBean(user

spring 中的BeanPostProcessor接口
今天自己练习学习了BeanPostProcessor,发现了个问题,发现getBean("user")为null,而且 如果加上 init-method, 会抛出org.springframework.beans.factory.BeanCreationException
,下面是代码:

<?xml version="1.0" encoding="utf-8"?>

<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 class="com.fu.model.MyBeanPostProcessor"/>
        <bean id="user" class="com.fu.model.User" init-method="init">
        <property name="userName">
        <value>xiaogou</value>
</property>
        </bean>
</beans>

import org.springframework.beans.factory.InitializingBean;


public class User implements InitializingBean
{

private String userName;

public String getUserName()
{
return userName;
}

public void setUserName(String userName)
{
this.userName= userName;
}
@Override
public void afterPropertiesSet() throws Exception
{
// TODO Auto-generated method stub
System.out.println("正在执行初始化方法afterPropertiesSet......");
}
public void init(){
System.out.println("正在执行初始化方法 init.....");
}


}


import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor
{

@Override
public Object postProcessAfterInitialization(Object arg0, String arg1)
throws BeansException
{
System.out.println(arg1+"初始化后......");
return null;
}

@Override
public Object postProcessBeforeInitialization(Object arg0, String arg1)
throws BeansException
{
System.out.println(arg1+"初始化前......");
return null;
}

}


public class SpringTest
{
public static void main(String[] args) throws FileNotFoundException
{
/**
 * BeanFactory和ApplicationContext对待bean后置处理器稍有不同。
 * ApplicationContext会自动检测在配置文件中实现了BeanPostProcessor接口的所有bean,
 * 并把它们注册为后置处理器,然后在容器创建bean的适当时候调用它。
 * 部署一个后置处理器同部署其他的bean并没有什么区别。
 * 而使用BeanFactory实现的时候,bean 后置处理器必须通过下面类似的代码显式地去注册:
 */
ClassPathXmlApplicationContext ctx =new ClassPathXmlApplicationContext("applicationContext.xml");
User u=(User)ctx.getBean("user");
System.out.println(u);

}

[解决办法]
bean初始化前和初始化后你都要将bean返回啊,如果不返回spring容器就得不到初始化的所有bean。
这样:

@Override
    public Object postProcessAfterInitialization(Object arg0, String arg1)
            throws BeansException
    {
        System.out.println(arg1+"初始化后......");
        return arg0;
    }
 
    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1)
            throws BeansException
    {
        System.out.println(arg1+"初始化前......");
        return arg0;
    }

热点排行