《Spring in action》——学习总结(二)
2017-05-13 20:43
573 查看
这周花在这本书上时间不多,天气热起来,人就犯困犯懒。。。因为都是边看边把要点写在记事本上,所以看起来会比较凌乱。
内部Bean
kenny可以演奏任意乐器,任意一个乐器演奏家都可以演奏萨克斯(saxophone)Bean,但是kenny非常介意与其他人共享乐器。这里引入内部Bean.新的kenny Bean的配置如下:
使用Sring的命名空间p来装配属性在Spring的XML中配置中增加一段声明即可使用。
示范代码:
装配集合
当Beande的属性值为复数时采用集合装配。
Spring提供了四种类型的集合装配元素:
使用表达式装配
Spring3 引入Spring表达式语言(Spring Expression Language,SpEL)。SpEL是一种强大、简洁的装配Bean的方式,他通过运行期间执行的表达式将至转配到Bean的属性或构造器中。
SpEL的特性:
1、使用Bean的ID来引用Bean
2、调用方法和访问对象的属性
3、对值进行算术、关系和逻辑运算
5、集合操作
引用Bean、Properties和方法
使用Bean ID将一个bean装配到另一个Bean的属性:
将一个名为saxophone的Bean装配到instrument属性中不用SpEL的写法:
SpEL表达式中只用Bean的引用来获取Bean的属性
配置一个模仿kenny唱歌的参赛者Carl
tip:在SpEL中为避免抛出空指针异常的方法是使用null-safe存取器,即用
使用
例子,需要吧PI的值装配到Bean的一个属性中
同时T()也可以调用静态方法
使用matches运算符对String类文本应用正则表达式
使用查询运算符(
使用投影运算符(
tip:不要把过多的逻辑放入SpEL表达式中!
Bean的自动装配(autowiring)
使用注解装配
Spring容器默认禁用注解装配,使用Spring的context命名空间配置中的
Spring3支持的三种不同的用于自动装配的注解:
使用
setInstrument()方法进行标注
如下:
使用标注后可以移除
@Autowired 可以标注需要自动装配Bean引用的任意方法,当然也可以标注构造器。
使用限定器(
借助
使用
自动检测
在spring配置中增加
SpringBean的类。
默认情况下,
使用
使用
基于Java的配置
为Bean注入一个值时代替XML配置文件的
值得注意的是当Bean装配另一个Bean的引用时。。。
通过使用
引用上下文中查找该Bean而不是让该方法创建一个新的实例。
基于XML配置文件的注入和基于Java注解的注入的优缺点比较:
基于Java注解的注入语义性更高,代码清晰易懂,但是违反了OCP原则,项目在后期的维护会比较困难。
而基于XML配置文件的注入恰恰相反,符合OCP原则,但是代码必须对着XML文件,加大了理解程序的难度。
关于Bean的装配已经学完了,跟着书上的学,代码就没怎么敲,很多东西都没有去实践,心里还是没有底。下周开始着手AOP,配合视频教程食用看看效果会不会更佳。
内部Bean
kenny可以演奏任意乐器,任意一个乐器演奏家都可以演奏萨克斯(saxophone)Bean,但是kenny非常介意与其他人共享乐器。这里引入内部Bean.新的kenny Bean的配置如下:
<bean id="kenny" class="com.springinaction.springidol.Instrumentalist"> <property name="song" value="Jingle Bells"/> <property name="instrument"> <bean class="org.springinaction.springidol.saxophone"/> </property> </bean>
使用Sring的命名空间p来装配属性在Spring的XML中配置中增加一段声明即可使用。
示范代码:
<bean id="kenny" calss="com.springinaction.springidol.Instrumentalist p:song="Jingle Bells" p:instrument-ref="saxophone/" ">
装配集合
当Beande的属性值为复数时采用集合装配。
Spring提供了四种类型的集合装配元素:
<list>装配list的值,允许重复
<set>装配set类型的值,不允许重复(数组或Java.util.Collection任意实现的属性)
<map>装配map类型的值,名称和值可以是任意的类型
<props>装配properties类型的值,名称和值必须是String类型
使用表达式装配
Spring3 引入Spring表达式语言(Spring Expression Language,SpEL)。SpEL是一种强大、简洁的装配Bean的方式,他通过运行期间执行的表达式将至转配到Bean的属性或构造器中。
SpEL的特性:
1、使用Bean的ID来引用Bean
2、调用方法和访问对象的属性
3、对值进行算术、关系和逻辑运算
5、集合操作
#{}标记会提示Spring这个标记里的内容是SpEL表达式。它们还可以与非表达式的值混用
引用Bean、Properties和方法
使用Bean ID将一个bean装配到另一个Bean的属性:
<property name="instrument" value="#{saxophone}"/>
将一个名为saxophone的Bean装配到instrument属性中不用SpEL的写法:
<property name="instrument" ref="saxophone"/>
SpEL表达式中只用Bean的引用来获取Bean的属性
配置一个模仿kenny唱歌的参赛者Carl
<bean id="Carl" class="com.springinaction.springidol.Instrumentalist"> <property name="song" value="#{kenny.song}"/> <bean>
tip:在SpEL中为避免抛出空指针异常的方法是使用null-safe存取器,即用
?.来代替点(
.)。在访问右边的方法之前,该运算符会确保左边的值不为null。
使用
T()运算符来调用类作用域的方法和常量。
例子,需要吧PI的值装配到Bean的一个属性中
<property name="multiplier" value="{T(java.lang.Math).PI}"/>
同时T()也可以调用静态方法
<propertyname="randomNumber"value{T(java.lang.Math).random()}"/>
使用matches运算符对String类文本应用正则表达式
使用查询运算符(
.?[])过滤掉不符合条件的元素,(
.^[])从集合中查询出第一个匹配项,(
.$[])从集合中查询出最后一个匹配项
使用投影运算符(
.![])选择集合中特定的属性
tip:不要把过多的逻辑放入SpEL表达式中!
Bean的自动装配(autowiring)
byName自动装配 为属性装配ID与该属性的名字相同的Bean
byType自动装配 为属性装配类型与该属性的类型匹配的Bean
constructor自动装配 为属性装配与该属性构造器的所有入参匹配的Bean
autodetect最佳自动装配 先尝试用constructor自动装配,再用
byType自动装配
Bean的自动检测(autodiscovery)
使用注解装配
Spring容器默认禁用注解装配,使用Spring的context命名空间配置中的
<context:annotation-config>启用它。
Spring3支持的三种不同的用于自动装配的注解:
@Autowired @Inject @Resource
使用
@Autowired让Spring自动装配Instrumentalist Bean的instrument属性。则可以对
setInstrument()方法进行标注
如下:
@Autowired //Spring通过byType自动装配 public void setInstrument(Instrument instrument){ this.instrument = instrument; }
使用标注后可以移除
<property>元素
@Autowired 可以标注需要自动装配Bean引用的任意方法,当然也可以标注构造器。
使用限定器(
@qualifier)来限定歧义性的依赖
借助
@Inject实现基于标准的自动装配
使用
@Named注解通过Bean的ID来表示可选择的Bean。与@Qualifier类似
自动检测
在spring配置中增加
<context:component-scan>允许Spring自动检测Bean和定义Bean。
<context:component-scan>会扫描指定的包及其所有子包,并查找出能自动注册的
SpringBean的类。
默认情况下,
<context:component-scan>查找使用构造型注解所标注的类,这些注解如下:
@Component——通用的构造型注解,表示该类为Spring组件
@Controller——表示将该类定义为Spring MVC controller
@Repository——表示将该类定义为数据仓库
@Service——表示将该类定义为服务
使用
@Component标注的任意自定义注解
使用
<context:include-filter>和
<context:exclude-filter>告知
<context:component-scan>哪些类需要注册为SpringBean那些不需要注册为SpringBean。
基于Java的配置
为Bean注入一个值时代替XML配置文件的
<constructor-arg>元素,只需要把数字直接传入构造器中:
@Bean public Performer duke15(){ return new Jugger(15); }
值得注意的是当Bean装配另一个Bean的引用时。。。
//用Java声明一个sonnet29 Bean: @Bean private Poem sonnet29(){ return new sonnet29(); }
//创建一个PoeticJuggeler Bean,通过构造器装配sonnet29 Bean @Bean public Performer poeticDuke(){ return new PoeticJuggler(sonnet29()); }
通过使用
@Bean注解标注sonnet29()方法,告知Spring该方法定义的Bean要被注册进Spring的引用上下文中,所以其他Bean的声明方法中引用这个方法时,Spring会拦截该方法的调用,并尝试在
引用上下文中查找该Bean而不是让该方法创建一个新的实例。
基于XML配置文件的注入和基于Java注解的注入的优缺点比较:
基于Java注解的注入语义性更高,代码清晰易懂,但是违反了OCP原则,项目在后期的维护会比较困难。
而基于XML配置文件的注入恰恰相反,符合OCP原则,但是代码必须对着XML文件,加大了理解程序的难度。
关于Bean的装配已经学完了,跟着书上的学,代码就没怎么敲,很多东西都没有去实践,心里还是没有底。下周开始着手AOP,配合视频教程食用看看效果会不会更佳。
相关文章推荐
- 《Spring in action》——学习总结(一)
- 2016书单总结--spring-boot-in-action学习笔记--源码简析
- 《Spring in action》——学习总结(三)
- Spring In Action 学习总结
- 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索
- Spring in Action 学习笔记—第五章事务管理
- 《Lucene in Action》(第二版) 第二章节的学习总结 ---- IndexWriter+Document+Field
- Spring in Action 学习笔记—开始Spring之旅
- Spring in Action 学习笔记—第一章开始Spring之旅
- 系统学习Spring之Spring in action(九)
- 系统学习Spring之Spring in action
- 《Lucene in Action 第二版》第4章节 学习总结 -- Lucene中的分析
- 系统学习Spring之Spring in action(七)
- 《HBase in Action》 第三章节的学习总结 ---- 如何编写和运行基于HBase的MapReduce程序
- 学习spring in action 第一天
- 系统学习Spring之Spring in action(六)
- Spring in Action 学习笔记—第一章 开始Spring之旅
- Spring in Action 学习笔记—第三章创建切面
- 《HBase in Action》 第一章节的学习总结 ---- HBase是个啥