spring原理之自定义scope与factoryBean

我在前面反复提到一个概念,就是spring的核心就是管理和创建对象,那么关于对象的作用域你有想过吗,如何创建程序员自定义的复杂的bean你有想过吗,还有在新注解时代下,配置文件是如何加载到spring容器,的你知道吗,今天我们来聊聊这些。

       spring管理对象默认都是单例的,并且存放至缓存中的,这样可以极大的提高创建对象的效率,首次使用bean的话,如果spring容器没有,则会经过很长的路径来创建bean,只要你没有标注@lazy懒加载标志,一般容器创建完成后,那些bean都已经创建好了,并且放置一级缓存中。虽然spring容器中的bean默认是单例的,但是你可以更改这个值,比如scope为propertity,request,session等值,但是这些值会大大增加spring管理spring的成本,因为这些值都标注着bean的生命周期很短,会频繁的创建bean,并丢弃。所以我们大部分情况下,都是使用默认值singleton单例。如果你业务有需要,可以自定义scope的作用域,具体做法的请看下AbstractBeanFactory的代码片段:

根据我上面的红圈提示思路如下:

   1 定义一个类型,实现一个org.springframework.beans.factory.config.Scope的接口,并且在该实现中,实现get方法获得对象

   2 我们可以通过实现beanDefinitionRegisterProcess这个接口,将我们自定的值,注册到scope这个map对象中。

根据思路,具体实现如下:

 06bcf9e7f635acae7af4211836dca727.png

然后在你要自定义的bean上定义: scope("refresh")即可,不过自定义的scope不属于spring的管理,是由自己维护,请牢牢记住。

         说完了scope我们再来说说factoryBean的实现,这其实是一个接口,当你要自己去实现一个复杂的bean的创建过程,可以用到它,它和我们现在比较流行的@bean有相同的功能,我们先来看看源码的片段把。

 

  看完以上红色的圈圈,我们可以看到,任何类实例话完成后,都会被这个getOjbectForBeanInstance方法给覆盖,这个方法里面会判断,当前bean有没有实现factoryBean接口,如果实现了,才进行处理并执行getObject方法,如果没有则直接返回。我们这里要注意一点参数name是 带了前缀特殊符号&,因为要和原始的bean给区别开来,如果带了&,则获取的是实现facotryBean的类的对象,如果没有加,则是获取的是实现facotryBean接口的getObject方法的对象。这点要牢牢记住,我们可以看到,这只是spring提供了另外一种创建bean的方式,仅此而已,没有其他的。

        好了接下来,我来和你说spring容器在注解时代下,对配置文件是如何玩转的。提到spring的注解上下文,就不得不说AnnotationConfigApplicationContext这个类了,这个类的初始化方法中的AnnotatedBeanDefinitionReader类,会做一件事情,就是注册各种类处理器,就是专门处理各种注解的处理器,其中有个比较关键的类是ConfigurationClassPostProcessor类,这个类是专门处理@import,@propersources,@Compend等注解的,我们今天先看看它对资源文件的注解@PropertySources的解析 我们来到ConfigurationClassPostProcessor类的processConfigBeanDefinitions的方法

        8479e23114292ea25f4173fa7e0c3b40.png

 f130b70b915f93d783254cc6e17bd3e5.png

看了上面四幅图,是不是感觉很有点恍然大悟的感觉,首先是解析类上的信息,有PropertySources注解信息的类,并获得注解信息的值,最终解析这个注解信息的值,存放到enviroment的MutablePropertySources的对象中。

     今天的源码我们就分析到这里,下期我们接着聊。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值