java - BeanPostProcessor 方法没有被调用

标签 java spring

我试图理解静态初始化、实例初始化、InitializingBean 和 BeanPostProcessor 的顺序,所以我创建了下面的示例,除了 BeanPostProcessor 没有被调用之外,一切正常,我是否遗漏了什么?

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.FileSystemResource;
import org.springframework.stereotype.Component;

@Component
public class SpringTest {

    @Autowired
    Person person;

    public static void main(String[] args) {
        testApplicationContext();
    }

    private static void testApplicationContext() {
        // here static and instance initializers of Person class will be invoked right away, even when we are not calling getBean method
        ApplicationContext applicationContext = new FileSystemXmlApplicationContext("C:\\E_Drive\\Projects\\Workspace\\Test\\CS101\\src\\com\\learn\\stackoverflow\\general\\bean.xml");
        ApplicationContext applicationContext2 = new FileSystemXmlApplicationContext("C:\\E_Drive\\Projects\\Workspace\\Test\\CS101\\src\\com\\learn\\stackoverflow\\general\\bean.xml");

        // notice that above you are creating 2 ioc containers, and since they are different ioc containers so it is possible to have 2 singletons in JVM.

        SpringTest springTest = (SpringTest) applicationContext.getBean("springTest");

    }


}

人员类别:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope(value="singleton")
public class Person implements InitializingBean, BeanPostProcessor {
    @Autowired
    SpringTest springTest;

    static{
        System.out.println("Static initialization");
    }

    {
        System.out.println("Instance initialization");
    }

    public void sayHello(){
        System.out.println("Hello");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean.afterPropertiesSet");
    }

    @Override
    public Object postProcessAfterInitialization(Object arg0, String arg1) throws BeansException {
        System.out.println("BeanPostProcessor.postProcessAfterInitialization : " + arg1);
        return arg0;
    }

    @Override
    public Object postProcessBeforeInitialization(Object arg0, String arg1) throws BeansException {
        System.out.println("BeanPostProcessor.postProcessBeforeInitialization : " + arg1);
        return arg0;
    }

}

Bean XML 文件:

<beans xmlns = "http://www.springframework.org/schema/beans"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <context:component-scan base-package="com.learn.stackoverflow.general"/>
    <context:annotation-config />

   <!-- <bean id = "person" class = "com.learn.stackoverflow.general.Person" scope="singleton">
   </bean> -->

   <bean id = "springTest" class = "com.learn.stackoverflow.general.SpringTest" scope="singleton">
   </bean>

</beans>

输出:

Static initialization
Instance initialization
InitializingBean.afterPropertiesSet
Instance initialization
InitializingBean.afterPropertiesSet

调用 BeanPostProcessor 方法还需要什么吗?

最佳答案

bean 不能进行 self 后处理,后处理器需要是一个单独的 bean; see tutorial .

关于java - BeanPostProcessor 方法没有被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49510338/

相关文章:

java - 最简单的条件查询

java - Spring AOP - 切入点未触发

java - Android多线程-播放声音和响应的时间

java - 静态变量通过@Value设置为null

java - Spring找不到类路径中存在的类

java - Spring webapp加载插件: ClassNotFoundException

java - Maven 依赖项 :go-offline command issue

java - 用于在线程中发出信号的信号量不起作用(并发问题)

java - 如何添加外部库,使用 Gradle 的 Java Spring MVC 框架,PyramidIO

java - 在jsp中获取当前页面的apache tiles