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

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

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 1.3.1依赖注入 1.3.2di应用 1.3.3企业级应用中的依赖注入 1.4应用aop 1.4.1aop介绍 1.4.2aop使用 1.5小结 第2章基本bean装配 2.1容纳你的bean 2.1.1beanfactory介绍 2.1.2使用应用上下文 2.1.3bean的生命 2.2创建bean 2.2.1声明一个简单的bean 2.2.2通过构造函数注入 2.3注入bean属性 2.3.1注入简单的数值 2.3.2使用其他的bean 2.3.3装配集合 2.3.4装配空值 2.4自动装配 2.4.1四种自动装配类型 2.4.2混合使用自动和手动装配 2.4.3何时采用自动装配 2.5控制bean创建 2.5.1bean范围化 2.5.2利用工厂方法来创建bean 2.5.3初始化和销毁bean 2.6小结 第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本的方法替换 3.2.2获取器注入 3.3注入非springbean 3.4注册自定义属性编辑器 3.5使用spring的特殊bean 3.5.1后处理bean 3.5.2bean工厂的后处理 3.5.3配置属性的外在化 3.5.4提取文本消息 3.5.5程序事件的解耦 3.5.6让bean了解容器 3.6脚本化的bean 3.6.1给椰子上lime 3.6.2脚本化bean 3.6.3注入脚本化bean的属性 3.6.4刷新脚本化bean 3.6.5编写内嵌的脚本化bean 3.7小结 第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的pojo切面 4.5注入aspectj切面 4.6小结 第部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的异常体系 5.1.2数据访问的模板化 5.1.3使用dao支持类 5.2配置数据源 5.2.1使用jndi数据源 5.2.2使用数据源连接池 5.2.3基于jdbc驱动的数据源 5.3在spring里使用jdbc 5.3.1处理失控的jdbc代码 5.3.2使用jdbc模板 5.3.3使用spring对jdbc的dao支持类 5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5spring和java持久api 5.5.1使用jpa模板 5.5.2创建一个实体管理器工厂 5.5.3建立使用jpa的dao 5.6spring和ibatis 5.6.1配置ibatis客户模板 5.6.2建立基于ibatis的dao 5.7缓存 5.7.1配置缓存方案 5.7.2缓存的代理bean 5.7.3注解驱动的缓存 5.8小结 第6章事务管理 6.1理解事务 6.1.1仅用4个词解释事务 6.1.2理解spring对事务管理的支持 6.2选择事务管理器 6.2.1jdbc事务 6.2.2hibernate事务 6.2.3jpa事务 6.2.4jdo事务 6.2.5jta事务 6.3在spring中编写事务 6.4声明式事务 6.4.1定义事务参数 6.4.2代理事务 6.4.3在spring2.0里声明事务 6.4.4定义注释驱动事务 6.5小结 第7章保护spring 7.1springsecurity介绍 7.2验证用户身份 7.2.1配置providermanager 7.2.2根据数据库验证身份 7.2.3根据ldap仓库进行身份验证 7.3控制访问 7.3.1访问决策投票 7.3.2决定如何投票 7.3.3处理投票弃权 7.4保护web应用程序 7.4.1代理springsecurity的过滤器 7.4.2处理安全上下文 7.4.3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值