玖叶教程网

前端编程开发入门

用一个Bean的创建过程,完全掌握Spring Bean的生命周期

在后端日常开发过程中,正确掌握Spring Bean的生命周期,对应用设计、代码编写调试、问题定位等都有非常积极的作用,然而,网上提供的资料大部分是从源码的角度进行分析的,虽然能够达到“知其然知其所以然”的效果,但是,对刚接触spring或从事Spring开发时间的显然不够友好。实际上通过一个Bean的创建过程,完全可以大体理顺Spring Bean的生命周期。具体如下:

MyInterface.java:

public interface MyInterface {
    int sum(int a,int b);
}

MyInterfaceImpl.java:

public class MyInterfaceImpl implements MyInterface,FactoryBean, InitializingBean, DisposableBean, BeanFactoryAware, ApplicationContextAware, BeanNameAware {
    @Override
    public int sum(int a, int b) {
        return a+b;
    }

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

    @Override
    public void destroy() throws Exception {
        System.out.println("myInterfaceImpl:DisposableBean.destroy");
    }

    @PostConstruct
    public void init() {
        System.out.println("myInterfaceImpl:@PostConstruct");
    }

    // 充当destroy method
    // 销毁方法的注解方式 等同于destroy-method
    @PreDestroy
    public void destroy1() {
        System.out.println("myInterfaceImpl:@PreDestroy");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("myInterfaceImpl:Aware-setBeanName");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("myInterfaceImpl:Aware-setApplicationContext");
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("myInterfaceImpl:Aware-setBeanFactory");
    }



    @Override
    public Object getObject() throws Exception {
        System.out.println("myInterfaceImpl:FactoryBean");
        return new MyInterfaceImpl();
    }
    @Override
    public boolean isSingleton() {
        return true;
    }

    @Override
    public Class<?> getObjectType() {
        return MyInterfaceImpl.class;
    }
}

MyInterfaceBeanDefinitionRegistryPostProcessor.java:

@Component
public class MyInterfaceBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("myInterfaceImpl:BeanDefinitionRegistryPostProcessor-postProcessBeanFactory");
    }

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        System.out.println("myInterfaceImpl:BeanDefinitionRegistryPostProcessor-postProcessBeanDefinitionRegistry");
        BeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClassName("com.example.demo.bean.MyInterfaceImpl");
        registry.registerBeanDefinition("myInterfaceImpl",beanDefinition);
    }
}

MyInterfaceBeanFactoryPostProcessor.java:

@Component
public class MyInterfaceBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("myInterfaceImpl:BeanFactoryPostProcessor-postProcessBeanFactory");
        BeanDefinition beanDefinition = new RootBeanDefinition();
        beanDefinition.setBeanClassName("com.example.demo.bean.MyInterfaceImpl");
        DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) beanFactory;
        defaultListableBeanFactory.registerBeanDefinition("myInterfaceImpl",beanDefinition);
    }
}

MyInterfaceBeanPostProcessor.java

@Component
public class MyInterfaceBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":BeanPostProcessor-postProcessBeforeInitialization" );
        }
        return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":BeanPostProcessor-postProcessAfterInitialization" );
            return Proxy.newProxyInstance(
                    bean.getClass().getClassLoader(),
                    bean.getClass().getInterfaces(),
                    (proxy, method, args) -> {
                        //输出开始时间
                        //System.out.println("方法:" + method.getName() + "-开始时间:" + LocalDateTime.now());
                        Object result = method.invoke(bean, args);
                        //输出结束时间
                        //System.out.println("方法:" + method.getName() + "-结束时间:" + LocalDateTime.now());
                        return result;
                    });
        } else {
            return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName);
        }
    }
}

MyInterfaceInstantiationAwareBeanPostProcessor.java

@Component
public class MyInterfaceInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
    @Override
    public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":InstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation" );
        }
        return InstantiationAwareBeanPostProcessor.super.postProcessBeforeInstantiation(beanClass, beanName);
    }

    @Override
    public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation" );
        }
        return InstantiationAwareBeanPostProcessor.super.postProcessAfterInstantiation(bean, beanName);
    }

    @Override
    public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":InstantiationAwareBeanPostProcessor-postProcessProperties" );
        }
        return InstantiationAwareBeanPostProcessor.super.postProcessProperties(pvs, bean, beanName);
    }
}

MyInterfaceMergedBeanDefinitionPostProcessor.java

@Component
public class MyInterfaceMergedBeanDefinitionPostProcessor implements MergedBeanDefinitionPostProcessor {
    @Override
    public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class<?> beanType, String beanName) {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":MergedBeanDefinitionPostProcessor-postProcessMergedBeanDefinition" );
        }
    }

    @Override
    public void resetBeanDefinition(String beanName) {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":MergedBeanDefinitionPostProcessor-resetBeanDefinition" );
        }
        MergedBeanDefinitionPostProcessor.super.resetBeanDefinition(beanName);
    }
}

MyInterfaceSmartInitializingSingleton.java

@Component
public class MyInterfaceSmartInitializingSingleton implements SmartInitializingSingleton {
    @Override
    public void afterSingletonsInstantiated() {
        System.out.println("myInterfaceImpl:SmartInitializingSingleton");
    }
}

MyInterfaceSmartInstantiationAwareBeanPostProcessor.java

@Component
public class MyInterfaceSmartInstantiationAwareBeanPostProcessor implements SmartInstantiationAwareBeanPostProcessor {
    @Override
    public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":SmartInstantiationAwareBeanPostProcessor-determineCandidateConstructors" );
        }
        return SmartInstantiationAwareBeanPostProcessor.super.determineCandidateConstructors(beanClass, beanName);
    }

    @Override
    public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
        if (beanName.equals("myInterfaceImpl")) {
            System.out.println(beanName+":SmartInstantiationAwareBeanPostProcessor-getEarlyBeanReference" );
        }
        return SmartInstantiationAwareBeanPostProcessor.super.getEarlyBeanReference(bean, beanName);
    }
}

编译运行,结果如下:



发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言