《Spring in action》——学习总结(二)
来源:互联网 发布:java中的nio 编辑:程序博客网 时间:2024/06/01 07:20
这周花在这本书上时间不多,天气热起来,人就犯困犯懒。。。因为都是边看边把要点写在记事本上,所以看起来会比较凌乱。
内部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>
元素,只需要把数字直接传入构造器中:
@Beanpublic Performer duke15(){ return new Jugger(15);}
值得注意的是当Bean装配另一个Bean的引用时。。。
//用Java声明一个sonnet29 Bean:@Beanprivate Poem sonnet29(){ return new sonnet29();}
//创建一个PoeticJuggeler Bean,通过构造器装配sonnet29 Bean@Beanpublic 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》——学习总结(二)
- 《Spring in action》——学习总结(一)
- 《Spring in action》——学习总结(三)
- Spring In Action 学习总结
- spring in action笔记(二)——依赖注入
- spring入门——spring in action学习p1-p50
- Spring in Action 学习笔记—开始Spring之旅
- Struts2+Spring+Hibernate In Action(二)
- Spring in action学习
- Spring in Action — 事务管理
- Spring in Action读书笔记 (二)
- spring in action解读二
- 《Spring In action》学习笔记——依赖注入
- Spring in Action 学习笔记—第二章装配Bean
- Spring in Action 学习笔记—第三章创建切面
- Spring in Action 学习笔记—第四章 征服数据库
- Spring in Action 学习笔记—第五章事务管理
- Spring in Action 学习笔记—第六章远程调用
- YOLOV2 使用voc2007 单独训练某些类而删除不含有这些类的数据
- 1060. 爱丁顿数(25)
- 【Unity&JSON】LitJson的多对象读写(4)
- 1061. 判断题(15)
- this的疑问?
- 《Spring in action》——学习总结(二)
- 【Maven】将jar包手动打到本地仓库
- 1062. 最简分数(20)
- layui分页组件layPage动态调整总页数
- Velocity.js
- nginx实现ajax跨域请求
- TreeView与ContextMenuStrip
- CCF CSP 第十次 第四题 地铁修建 JAVA版
- 【设计模式】工厂三姐妹