《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,配合视频教程食用看看效果会不会更佳。

1 0
原创粉丝点击