美文网首页
spring狂简常用扩展接口

spring狂简常用扩展接口

作者: 有章 | 来源:发表于2018-10-19 18:50 被阅读0次

1.BeanPostProcessor

2个方法:
postProcessBeforeInitialization
postProcessAfterInitialization
初始化执行顺序:
postProcessBeforeInitialization->@postConstruc->
afterPropertiesSet()->init-method->postProcessBeforeInitialization

代码示例:

public class User implements InitializingBean, DisposableBean {

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

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

    @PostConstruct
    public void postConst() {
        System.out.println("postConst");
    }

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

@Configuration
public class Config {
    @Bean(initMethod = "init" ,destroyMethod = "destroy")
    public User user() {
        User user = new User();
        return user;
    }
}

public class MyBeanPostProcessor implements BeanPostProcessor {
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // 这边只做简单打印   原样返回bean
        System.out.println("postProcessBeforeInitialization====" + beanName);
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // 这边只做简单打印   原样返回bean
        System.out.println("postProcessAfterInitialization====" + beanName);
        return bean;
    }

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
        context.close();
    }

}
spring接口.jpg

·

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    public MyBeanFactoryPostProcessor() {
        super();
        System.out.println("这是BeanFactoryPostProcessor实现类构造器!!");
    }
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out
                .println("BeanFactoryPostProcessor调用postProcessBeanFactory方法");
       BeanDefinition beanDefinition= beanFactory.getBeanDefinition("person");
       beanDefinition.getPropertyValues().addPropertyValue("phone",111);

    }
}

public class MyBeanPostProcessor implements BeanPostProcessor{
    public MyBeanPostProcessor() {
        super();
        System.out.println("这是BeanPostProcessor实现类构造器!!");
    }

    @Nullable
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor接口方法postProcessAfterInitialization对属性进行更改!beanName: "+beanName);
        return bean;
    }

    @Nullable
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor接口方法postProcessBeforeInitialization对属性进行更改!beanName: "+beanName);
        return bean;
    }
}
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {
    public MyInstantiationAwareBeanPostProcessor() {
        super();
        System.out.println("这是InstantiationAwareBeanPostProcessorAdapter实现类构造器!!");
    }

    // 接口方法、实例化Bean之前调用
    @Override
    public Object postProcessBeforeInstantiation(Class beanClass,
                                                 String beanName) throws BeansException {

        System.out.println("InstantiationAwareBeanPostProcessor调用postProcessBeforeInstantiation方法");
        return null;
    }

    // 接口方法、实例化Bean之后调用
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        System.out.println("InstantiationAwareBeanPostProcessor调用postProcessAfterInitialization方法");
        return bean;
    }

    @Override
    public PropertyValues postProcessPropertyValues(PropertyValues pvs,
                                                    PropertyDescriptor[] pds, Object bean, String beanName)
            throws BeansException {
        System.out.println("InstantiationAwareBeanPostProcessor调用postProcessPropertyValues方法");
        return pvs;
    }

}
public class Person implements BeanNameAware, BeanFactoryAware, InitializingBean, DisposableBean {
    public Person() {
        System.out.println("【构造器】调用Person的构造器实例化");
    }

    private String name;
    private String address;
    private int phone;
    BeanFactory beanFactory;
    String beanName;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("【注入属性】注入属性name");
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        System.out.println("【注入属性】注入属性address");
        this.address = address;
    }

    public int getPhone() {
        return phone;
    }

    public void setPhone(int phone) {
        System.out.println("【注入属性】注入属性phone");
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Person [address=" + address + ", name=" + name + ", phone="
                + phone + "]";
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out
                .println("【BeanFactoryAware接口】调用BeanFactoryAware.setBeanFactory()");
        this.beanFactory=beanFactory;
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("【BeanNameAware接口】调用BeanNameAware.setBeanName()");
        this.beanName=name;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("【DiposibleBean接口】调用DiposibleBean.destory()");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out
                .println("【InitializingBean接口】调用InitializingBean.afterPropertiesSet()");
    }
    // 通过<bean>的init-method属性指定的初始化方法
    public void myInit() {
        System.out.println("【init-method】调用<bean>的init-method属性指定的初始化方法");
    }
    // 通过<bean>的destroy-method属性指定的初始化方法
    public void myDestory() {
        System.out.println("【destroy-method】调用<bean>的destroy-method属性指定的初始化方法");
    }
}
@Configuration
public class SpringConfig {
    @Bean
    Person person() {
        Person person = new Person();
        return person;
    }

    @Bean
    MyBeanFactoryPostProcessor myBeanFactoryPostProcessor() {
        MyBeanFactoryPostProcessor processor = new MyBeanFactoryPostProcessor();
        return processor;
    }

    @Bean
    MyBeanPostProcessor myBeanPostProcessor() {
        MyBeanPostProcessor processor = new MyBeanPostProcessor();
        return processor;
    }

    @Bean
    MyInstantiationAwareBeanPostProcessor myInstantiationAwareBeanPostProcessor() {
        MyInstantiationAwareBeanPostProcessor processor = new MyInstantiationAwareBeanPostProcessor();
        return processor;
    }
}
public class SpringTest {
    public static void main(String[] args) {
        ApplicationContext context= new AnnotationConfigApplicationContext(SpringConfig.class);
        System.out.println("初始化容器开始....");
        Object object=context.getBean("person");
        System.out.println("初始化容器成功....");
        Person person=(Person) object;
        System.out.println(person);
        System.out.println("现在关闭容器...");
        ((AnnotationConfigApplicationContext)context).registerShutdownHook();

    }
}

参考博客
1.http://uule.iteye.com/blog/2094609
2.https://blog.csdn.net/u011734144/article/details/52505263

相关文章

网友评论

      本文标题:spring狂简常用扩展接口

      本文链接:https://www.haomeiwen.com/subject/tqkugftx.html