博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring IOC 2
阅读量:6652 次
发布时间:2019-06-25

本文共 3779 字,大约阅读时间需要 12 分钟。

hot3.png

配置简写

一、构造器注入:

1)常量值

简写:<constructor-arg index="0" value="常量"/>

全写:<constructor-arg index="0"><value>常量</value></constructor-arg>

2)引用

简写:<constructor-arg index="0" ref="引用"/>

全写:<constructor-arg index="0"><ref bean="引用"/></constructor-arg>

 

二、setter注入:      

       1)常量值

        简写:<property name="message" value="常量"/>

        全写:<property name="message"><value>常量</value></ property>

       2)引用

        简写:<property name="message" ref="引用"/>

        全写:<property name="message"><ref bean="引用"/></ property>

       3)数组:<array>没有简写形式

       4)列表:<list>没有简写形式

       5)集合:<set>没有简写形式

       6)字典

          简写:<map>

             <entry key="键常量" value="值常量"/>

             <entry key-ref="键引用" value-ref="值引用"/>

            </map>

         全写:<map>

             <entry><key><value>键常量</value></key><value>值常量</value></entry>

             <entry><key><ref bean="键引用"/></key><ref bean="值引用"/></entry>

           </map>

       7)Properties:没有简写形式

 

使用p命名空间简化setter注入:

<bean id="……" class="……" p:id="value"/> 常量setter注入方式,其等价于<property name="id" value="value"/>;

<bean id="……" class="……" p:id-ref="bean1"/> 引用setter注入方式,其等价于<property name="id" ref="bean1"/>。

 

4.传统应用程序设计中所说的依赖一般指“类之间的关系”,那先让我们复习一下类之间的关系:

     泛化:表示类与类之间的继承关系、接口与接口之间的继承关系;

     实现:表示类对接口的实现;

     依赖:当类与类之间有使用关系时就属于依赖关系,不同于关联关系,依赖不具有“拥有关系”,而是一种“相识关系”,只在某个特定地方(比如某个方法体内)才有关系。

     关联:表示类与类或类与接口之间的依赖关系,表现为“拥有关系”;具体到代码可以用实例变量来表示;

     聚合:属于是关联的特殊情况,体现部分-整体关系,是一种弱拥有关系;整体和部分可以有不一样的生命周期;是一种弱关联;

     组合:属于是关联的特殊情况,也体现了体现部分-整体关系,是一种强“拥有关系”;整体与部分有相同的生命周期,是一种强关联;

5.应用依赖注入能给我们带来哪些好处呢?

动态替换Bean依赖对象,程序更灵活:替换Bean依赖对象,无需修改源文件:应用依赖注入后,由于可以采用配置文件方式实现,从而能随时动态的替换Bean的依赖对象,无需修改java源文件;

     更好实践面向接口编程,代码更清晰:在Bean中只需指定依赖对象的接口,接口定义依赖对象完成的功能,通过容器注入依赖实现;

     更好实践优先使用对象组合,而不是类继承:因为IoC容器采用注入依赖,也就是组合对象,从而更好的实践对象组合。

  • 采用对象组合,Bean的功能可能由几个依赖Bean的功能组合而成,其Bean本身可能只提供少许功能或根本无任何功能,全部委托给依赖Bean,对象组合具有动态性,能更方便的替换掉依赖Bean,从而改变Bean功能;
  • 而如果采用类继承,Bean没有依赖Bean,而是采用继承方式添加新功能,,而且功能是在编译时就确定了,不具有动态性,而且采用类继承导致Bean与子Bean之间高度耦合,难以复用。

     增加Bean可复用性:依赖于对象组合,Bean更可复用且复用更简单;

     降低Bean之间耦合:由于我们完全采用面向接口编程,在代码中没有直接引用Bean依赖实现,全部引用接口,而且不会出现显示的创建依赖对象代码,而且这些依赖是由容器来注入,很容易替换依赖实现类,从而降低Bean与依赖之间耦合;

     代码结构更清晰:要应用依赖注入,代码结构要按照规约方式进行书写,从而更好的应用一些最佳实践,因此代码结构更清晰。

 

延迟初始化Bean

<bean id="helloApi"  class="cn.javass.spring.chapter2.helloworld.HelloImpl"   lazy-init="true"/>  

使用depends-on 

指指定Bean初始化及销毁时的顺序,使用depends-on属性指定的Bean要先初始化完毕后才初始化当前Bean,由于只有“singleton”Bean能被Spring管理销毁,所以当指定的Bean都是“singleton”时,使用depends-on属性指定的Bean要在指定的Bean之后销毁。

那“depends-on”有什么好处呢?主要是给出明确的初始化及销毁顺序,比如要初始化“decorator”时要确保“helloApi”Bean的资源准备好了,否则使用“decorator”时会看不到准备的资源;而在销毁时要先在“decorator”Bean的把对“helloApi”资源的引用释放掉才能销毁“helloApi”,否则可能销毁 “helloApi”时而“decorator”还保持着资源访问,造成资源不能释放或释放错误。

 

bean中加 

init-method="init" 指定初始化方法,在构造器注入和setter注入完毕后执行。

destroy-method="destroy":指定销毁方法,只有“singleton”作用域能销毁,“prototype”作用域的一定不能,其他作用域不一定能;后边再介绍。

 

自动装配 

byName 

通过设置Bean定义属性autowire="byName",意思是根据名字进行自动装配,只能用于setter注入。比如我们有方法“setHelloApi”,则“byName”方式Spring容器将查找名字为helloApi的Bean并注入,如果找不到指定的Bean,将什么也不注入。

byType

通过设置Bean定义属性autowire="byType",意思是指根据类型注入,用于setter注入,比如如果指定自动装配方式为“byType”,而“setHelloApi”方法需要注入HelloApi类型数据,则Spring容器将查找HelloApi类型数据,如果找到一个则注入该Bean,如果找不到将什么也不注入,如果找到多个Bean将优先注入<bean>标签“primary”属性为true的Bean,否则抛出异常来表明有个多个Bean发现但不知道使用哪个。

 

依赖检查

bean中加dependency-check 用于检查Bean定义的属性都注入数据了,不管是自动装配的还是配置方式注入的都能检查,如果没有注入数据将报错,从而提前发现注入错误,只检查具有setter方法的属性。

Spring3+也不推荐配置方式依赖检查了,建议采用Java5+ @Required注解方式

 

Bean的作用域

“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围。而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。

Spring提供“singleton”和“prototype”两种基本作用域,

另外提供“request”、“session”、“global session”三种web作用域;

Spring还允许用户定制自己的作用域。

spring中对bean的管理和创建:

通过BeanDefinition类定义bean描述,记录bean的Class,scope,唯一表示等。

BeanDifinitionRegister,缓存BeanDefinition。

singleton:在SingletonBeanRegister中使用注册表方式,将bean id/name->SingletonBean做缓存,每次请求的时候从注册表Map中获取,有直接返回cache的Bean,没就创建一个Singleton对象返回,并缓存。懒加载的是如上描述第一次请求时创建,其它的是初始化时创建。

prototype:在DefaultBeanFactory.getBean中,先从BeanDifinitionRegister获取BeanDifinition,根据scope决定是new 个Bean还是从SingletonBeanRegister获取一个bean。

 

 

 

转载于:https://my.oschina.net/u/3705388/blog/1571239

你可能感兴趣的文章
[洛谷P4735]最大异或和
查看>>
跟我学算法-贝叶斯拼写检查器
查看>>
Android使用动态代理搭建网络模块框架
查看>>
手写Function.bind函数
查看>>
这么多开源框架,该用哪个好?
查看>>
httpSecurity
查看>>
【Android】21.1 画板资源
查看>>
Sql 查询过慢,尝试重建索引
查看>>
雷林鹏分享:Yii(yiiframework)框架(三):gii页面出现403错误的解决方法
查看>>
第十二周CorelDRAW课总结
查看>>
【转】Android 环境变量 和 AVD 环境变量 配置
查看>>
[三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路
查看>>
【转】【SQL SERVER】怎样处理作业中的远程服务器错误(42000)
查看>>
jquery做表格变色效果-demo
查看>>
jquery 实现导航栏滑动效果
查看>>
linux系统下安装mysql数据库(mysql-5.7)
查看>>
MFC控件Slider Control的使用
查看>>
DOM的概念及子节点类型
查看>>
winform程序登陆后关闭登录窗体
查看>>
STL简介_18
查看>>