Spring--Bean的生命周期

Spring--Bean的生命周期_第1张图片
演示代码
定义一个Man类

public class Man implements BeanNameAware, ApplicationContextAware, InitializingBean, DisposableBean {
    private  String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("第二步,设置属性");
        this.name = name;
    }

    public Man() {
        System.out.println("第一步:man被实例化");
    }
    public void setup(){
        System.out.println("第七步,Man被初始化");
    }
    public  void teardown(){
        System.out.println("第十一步,Man被自定义方法销毁");
    }
    public void run(){
        System.out.println("第九步,执行业务方法");
    }


    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("第四步,了解工厂信息");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("第三步,设置Bean名称name = " + name);

    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("第六步,属性设置后");
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("第十步,执行Spring的销毁方法");
    }
}

定义一个MyBeanPostProcessor实现BeanPostProcessor接口

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第五步,初始化前");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第八步,初始化后方法");
        return bean;
    }

配置文件配置Bean

   
    
    
    

测试类

 @Test
    public void demoTest(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Man man= (Man)applicationContext.getBean("man");
        man.run();
        ((ClassPathXmlApplicationContext) applicationContext).close();

    }

输出结果

第一步:man被实例化
第二步,设置属性
第三步,设置Bean名称name = 张三
第四步,了解工厂信息
第五步,初始化前
第六步,属性设置后
第七步,Man被初始化
第八步,初始化后方法
第九步,执行业务方法
第十步,执行Spring的销毁方法
第十一步,Man被自定义方法销毁

BeanPostProcessor的作用(增强功能)

在实例化的过程中对原有类进行增强
定义一个UserDao接口

public interface UserDao {
    public void findAll();

    public void save();

    public void update();

    public void delete();
}

实现类UserDao

public class UserDaoImpl implements UserDao{

    @Override
    public void findAll() {
        System.out.println("查询");
    }

    @Override
    public void save() {
        System.out.println("保存");
    }

    @Override
    public void update() {
        System.out.println("修改");
    }

    @Override
    public void delete() {
        System.out.println("删除");
    }
}

配置文件配置bean

 
    

MyBeanPostProcessor增强类

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //System.out.println("第五步,初始化前");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //System.out.println("第八步,初始化后方法");
        if ("userdao".equals(beanName)){
            Object proxy = Proxy.newProxyInstance(bean.getClass().getClassLoader(), bean.getClass().getInterfaces(), new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    if ("save".equals(method.getName())){
                        System.out.println("权限校验-====-=-=-=-=");
                        return method.invoke(bean,args);
                    }
                    return method.invoke(bean,args);
                }
            });
            return proxy;
        }else{
            return bean;
        }

    }

}

测试

@Test
    public void demo3(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    UserDao userDao = (UserDao) applicationContext.getBean("userdao");
    userDao.findAll();
    userDao.save();
    userDao.update();
    userDao.delete();
}

你可能感兴趣的:(spring)