Spring面试之-----Bean的生命周期以及方法的增强

Bean的生命周期以及方法的增强

首先,说一下为什么使用Spring,也就是Spring的优点。

优点

  • 降低了组件之间的耦合性,实现了软件各层之间的解耦(IoC)
  • 以使用容易提供的众多服务,如事务管理,消息服务,日志记录(AOP)
  • 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能

对于AOP,在普通的Bean创建中是如何体现的呢?接下来下分析一下他的生命周期吧。

bean的生命周期

在这里插入图片描述

  1. 实例化
    Spring对bean进行实例化。

  2. 填充属性
    Spring将值和bean的引用注入到bean对应的属性中。

  3. 调用BeanNameAware的setBeanName()
    如果bean实现了BeanNameAware接口,Spring将bean的ID传递个setBeanName()。

  4. 调用BeanFactoryAware的setBeanFactory()
    如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory(),将BeanFactory容器实例注入。

  5. 调用ApplicationContextAware的setApplicationContext()
    如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext(),将bean所在的上下文引用传进来

  6. 调用BeanPostProcessor的预初始化方法(初始化Bean之前执行)
    如果bean实现了BeanPostProcessor接口,Spring将调用他们的postPrecessBeforeInitialization(Object bean, String beanName)

  7. 调用InitializingBean的afterPropertiesSet()(属性设置后执行
    如果Bean实现了InitializingBean接口,Spring将调用他们的afterPropertiesSet()。

  8. 调用自定义初始化方法
    自己配置的指定的初始化方法。

  9. 调用BeanPostProcessor的初始化后方法(初始化Bean之后执行)
    如果bean实现了BeanPostProcessor接口,Spring将调用他们的postPrecessAfterInitialization(Object bean, String beanName)

  10. 使用Bean
    执行业务方法,自定义

  11. 容器关闭

  12. 调用DisposableBean的destroy()
    如果Bean实现了DisposableBean接口,Spring将调用他的销毁destroy()方法。

  13. 调用自定义的销毁方法
    自己配置的指定的初始化方法。

当类对象调用自身的方法时,会依次执行上述步骤。其中BeanPostProcessor这个接口很重要,他可以在我们的类生成的时候产生代理,并且对他内部的方法进行增强,并且在不修改源代码的情况下。

增强一个类的某个方法

public Object postPrecessAfterInitialization(Object bean, String beanName){
    //判断,如果是对应的beanName的话进行增强操作,否则不进行
    if("beanName".equals(beanName)){
        //使用JDK动态代理
       		Object proxy = Proxy.newProxyInstance(bean.getClass.getClassLoader(),bean.getClass.getInterfaces(),new InvocationHandler(){
        	@Override
        	public Object invoke(Object proxy, Method method, Object[] args) throw Throwable{
            	if("save".equals(method.getName())){
           	     	//todo 权限校验
                	method.invoke(bean, args);
            	}
            	//如果不是,进行直接返回
            	return method.invoke(bean, args);
        	}
    	});
    	//返回代理对象
    	return proxy;
	}else{
        return bean;
    }
}

这一种思想会延续在AOP,在类的生成、实例化的过程当中对我们有原有的类进行增强。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值