Spring Java配置和BeanFactoryPostProcessor

时间:2017-10-23 11:08:42

标签: java spring spring-java-config

我在Spring中使用Java配置。 目标是在BeanFactoryPostProcessor阶段替换beanDefinion类。

我有一个豆子

@Bean
public User user() {
    CustomUser user = new CustomUser();
    user.setName("UserA");
    return user;
}

和一个新的类“NewTypeOfCustomUser”,并希望用NewTypeOfCutsomUser替换CustomUser。

在我看到一个人在使用XML配置时执行此操作的示例之前。它是使用

完成的
BeanDefinition.setBeanClassName

方法。但是,在我的案例中beanDefinition的类在BeanFactoryPostProcessor的工作阶段是null。似乎Java Config的工作方式与XML-configs完全不同。

所以我的问题是:是否可以使用Java配置执行此过程?

1 个答案:

答案 0 :(得分:0)

据我了解您的要求,您希望使用CustomUser更改NewTypeOfCustomUser的实例类型。使用XML配置,如您所述,可以使用BeanFactoryPostProcessor来实现。使用java配置,您正在寻找的是修改user() bean方法的实际代码,我认为这不可行。

你可以做的是使用BeanPostProcessor,它直接在bean实例上运行,而不是作为BeanFactoryPostProcessor的声明,并修改所需bean的实例。以下是您可以做的事情的示例:

public class CustomUserBeanPostProcessor implements BeanPostProcessor {

    public CustomUserBeanPostProcessor () {
        System.out.println("CustomUserBeanPostProcessor constructor called");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("postProcessBeforeInitialization method invoked");
        System.out.println(bean.getClass() + "  " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("postProcessAfterInitialization method invoked");
        System.out.println(bean.getClass() + "  " + beanName);
        if (bean instanceof User) {
            bean = new NewTypeOfCustomUser((User) user);
        }
        return bean;
    }
}

这还要求您向接受NewTypeOfCustomUser参数的CustomUser添加构造函数,并根据您的需要管理数据。