补充Spring的学习

今天忽然又想起Spring的学习,总结起来,Spring为我们做了三大事:

1.依赖注入:

注入原理:(只考虑xml配置的方式)

Spring容器读取配置文件,扫描所有bean的配置,为每一个bean的信息创建一个DefinitionBean,这个bean带有两个成员,private String id,private String beanClassName;
(当然还有其它的一些信息,比如指定init-method,scope等,这里不考虑那么复杂),同时由于要为bean注入依赖对象,所以在配置文件中假如有配置property选项(这里只考虑带ref属性的bean,一般数据类型和集合类型的注入暂不考虑),则为每一个property建一个bean,可以名为PropertyBean,这个bean里面有两个成员,private String propertyName;private String beanRef,然后在每一个DefinitionBean中还要增加一个集合类型成员来保存所有的PropertyBean,比如可以是private List<PropertyBean> propertyBeans.接着Spring读取完所有配置后,将所有的DefinitionBean加入到一个容器中,假如是Map<String,DefinitonBean>,则在实例化一个bean的时候,就可以这么来操作:(那种在容器初始化的时候就实例化的bean就不考虑了,考虑在getBean的时候实例化的bean,同时假设这个bean还没有被实例化)
根据getBean("")提供的名字,在Map<String,DefinitonBean>中取出DefinitonBean,首先根据beanClassName利用反射,实例化一个需要的JavaBean,然后根据PropertyBean提供的propertyName和JavaBean中的propertyName比较,看看是否相同,相同的话就会选择beanRef对应的bean通过JavaBean的关于propertyName属性的Setters给JavaBean注入对象,同时如果beanRef对应的bean还没有被实例化,则先将该bean实例化再注入。注入完成之后,考虑bean配置中scope的配置,如果是singleton则将实例化后的bean保存在另一个容器中Map<String,JavaBean>为该Bean保存唯一实例,如果是prototype则不放入容器,每次getBean都得到的是不同的实例。这里,refBean如果是在实例化JavaBean的同时被实例化的,则会根据需要是否放入容器,如果放入了容器,以后其他情况需要该bean的时候就可以直接从容器里面拿了。一般容器默认的实例化是在Spring容器初始化的时候,也就是所有的bean都会被实例化,包括依赖对象的bean还是我们交给Spring给我们注入依赖对象的bean,但这些bean的实例化肯定有先后顺序,并且容器默认实例化的bean都是singleton的,都会被放入容器进行管理,当refBean首先被初始化,后面的bean注入的时候就可以直接从容器拿了,如果refBean还没被初始化,则在后面的bean注入的时候就会实例化refBean,后面再实例化refBean的时候就不再需要注入了。整个注入的情况肯定比这复杂的更多,这里这考虑了一种简单情况,就是类似下面的这种配置:

<bean id="javaBean" class="">
<property name="property" ref="propertyBean"/>
</bean>
<bean id="propertyBean" class=""></bean>

注入方式:属性注入,Setter注入,构造器注入。配置:xml或者注解方式都可以。

待续。。。,写的不对的地方,还请指教

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值