您的位置:首页 > 编程语言 > Java开发

《Spring in action》——学习总结(二)

2017-05-13 20:43 573 查看
这周花在这本书上时间不多,天气热起来,人就犯困犯懒。。。因为都是边看边把要点写在记事本上,所以看起来会比较凌乱。

内部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 bean