好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Spring in Action入门

Spring in Action入门

注明:这篇文章一是当成学习笔记,二是给大家提供另一个快速理解学习Spring的参考。欢迎留言讨论,持续更新中~

(该部分是Spring的入门和Spring容器装备管理Bean的方法)

第一章 开始Spring之旅

Applet可以用来创建动态的Web应用,在html文件中通过<applet>标识,一种已经被淘汰的技术。

 <  applet   code  ="Bubbles.class"   width  ="350"   height  ="350"  >  
Java applet that draws animated bubbles.
  </  applet  > 

POJO实质上可以理解为简单的实体类,如果项目中使用了Hibernate框架,有一个关联的***.hbm.xml文件,就可以使对象与数据库中的表对应。

负责轻量级POJO开发就是Spring框架,由此引入Spring。。。

1.1 Spring是什么?

Spring是一个轻量级的DI和AOP容器框架,目标:高内聚、松耦合。

DI(Dependency Injection,依赖注入):对象不是从容器中查找它的依赖类,而是容器在 实例化对象的时候主动将它的依赖类注入 给它。 AOP(Aspect Oriented Programming,面向切面):通过将业务逻辑从应用服务中分离出来,实现了内聚开发。(比如:开发者可以先专注开发一个裸系统,然后再加上用户系统,如Spring Security) Spring容器:可以通过配置来设定你的Bean是单一实例,还是每次请求产生一个实例,用容器去管理应用对象的生命周期和配置。 scope="singleton"单实例模式,默认配置;   scope="prototype"  每次请求都会创建一个实例。 配合Struts2时候要配置 scope="prototype"  ,因为Struts2中的Action是非单例的,每次请求都会创建一个新的Action,让Struts2的Action由Spring创建,Spring默认创建出的对象都是单实例的,要加上scope="prototype",让spring每次请求创建一个实例。 如果响应类中没有成员变量,那么单例模式是线程安全的,否则需要对全局变量做保护,信号量控制。

 <  bean   id  ="adTagFacade"    class  ="outfox.ead.adbrand.domain.impl.AdTagFacadeImpl"   scope  ="singleton"  > 
 <  property   name  ="adTagDao"   ref  ="adTagDao"   /> 
 </  bean  > 

 1.2 开始Spring之旅

还是从Hello World!开始~

 <  bean   id  ="greetingSerivice"   class  ="com.springinaction.hello.GreetingServiceImpl"  > 
     <  property   name  ="greeting"   value  ="Hello World!"  /> 
 </  bean  > 

通过配置<bean>元素中的<property>设置属性值,告诉Spring容器通过调用Bean的setGreetring方法设置其属性值,(BeanFactory)factory.getBean("greetingService")的时候实例化类,同时注入greetring的值,最后打印出来。

1.3 理解依赖注入

耦合是一个双头怪物,一方面,紧密耦合的代码难以测试,难以重用难以理解,带来典型的“摧毁大堤”bug。另一方面,完全没有耦合的代码什么也做不了。耦合是必须的,但需要小心管理。

减少耦合的一个通常的做法是将具体实现隐藏在接口下面,这样具体实现的替换不会影响到引用类。

DI的全部:简言之, 协调依赖对象之间合作的责任 从对象自身中 转移出来 。(通过XML配置,Spring容器去管理)

1.4 应用AOP

DI是软件组件松散连接成为可能,AOP让你能够捕捉应用中经常使用的功能,把它转化为 可重用组件 。

以下是将log转化成了切面:

 <  aop:config  > 
     <  aop:aspect   ref  ="log"  > //声明一个切面,log提供了该切面的功能,这里是一个普通的bean。 
         <  aop:pointcut   id  ="pointCut"   expression  ="excution(*.doTask(..))"  /> //切面的切入点,执行doTask可以出发该切入点 
         <  aop:before   method  ="doTaskBefore"   pointcut-ref  ="pointCut"  />   //log下的doTaskBefore方法应该在切入点之前调用,下同 
         <  aop:after-returning   method  ="doTaskAfter"   pointcut-ref  ="pointCut"  /> 
     </  aop:aspect  > 
 </  aop:config  > 

第2章 基本Bean装配

2.1 容纳你的Bean

Spring的容器: Bean工厂  and  应用上下文 BeanFactory:

常用的是根据XML文件中的定义装载Bean,比如:

BeanFactory factory =  new  XMLBeanFactory( new  FileSystemResource("c:/beans.xml"));

Bean是被 延迟载入到Bean工厂 中的,就是说Bean工厂会立即把Bean定义信息载入进来,但是Bean只有在被需要的时候才被实例化。为了从BeanFactory得到一个Bean,只要简单的调用getBean()方法。

MyBean myBean = (MyBean) factory.getBean("myBean");

工厂就会实例化Bean并且使用 依赖注入设置Bean的属性 。

应用上下文:

也有诸多实现,比如ClassPathXmlApplicationContext

ApplicationContext context =  new  ClassPathXmlApplicationContext("beans.xml");

应用上下文ApplicationContext接口扩展自BeanFactory接口,一个重要的区别是关于单实例Bean是如何被载入的。应用上下文会在上下文启动后预载入所有的单实例Bean。通过预载入单实例Bean,确保当你需要的时候它们已经准备好了,你的应用不需要等待它们被创建。

注意区别:应用上下文比起Bean工厂提供了一些附加功能, 几乎所有的应用系统都选择ApplicationContext 而不是BeanFactory,只有在资源很少的情况下,才会考虑采用Beanfactory,如在移动设备上。

2.2 创建Bean

两种方式:

通过构造函数注入依赖,优点少些了Setter代码,强制使用强依赖契约,因为如果没有提供所有需要的依赖,一个Bean就无法被实例化了。

 <  bean   id  ="duke"   class  ="com.springinaction.springidol.ProticJuggler"  > 
     <  constructor-arg   value  ="15"  /> 
     <  constructor-arg   ref  ="sonnet29"  /> 
 </  bean  > 

Setter方法注入依赖,优点当依赖很多的时候,比较灵活。利于自身的继承。因为构造函数是不能被继承的。子类只能调用super()方法给父类的私有变量赋值。(推荐)

 <  bean   id  ="duke"   class  ="com.springinaction.springidol.ProticJuggler"  > 
     <  property   name  ="beanBags"   value  ="15"  > 
 </  bean  > 

2.3 注入Bean属性

内部Bean,一种注入依赖Bean的方式,但是无法复用,内部Bean只用于注入,且不能被其他Bean所引用。

 一般写法:
  <  bean   id  ="piano"   class  ="com.springinaction.springidol.Piano"  /> 
 <  bean   id  ="kenny"   class  ="..."  > 
 <  property   name  ="instrument"   ref  ="piano"  > 
 </  bean  >  

若要用 内部类 如下:
  <  bean   id  ="kenny"   class  ="..."  > 
 <  property   name  ="instrument"  > 
 <  bean   class  ="om.springinaction.springidol.Piano"  > 
 </  property  > 
 </  bean  > 

Spring配置基本类型(通过value)和其他类(通过ref),但value和ref只有在属性是单一的时候才有效。那么 当属性是复数 (就是集合)时,Spring怎么做呢? Spring装配支持的集合类型:<list> <set> <map> <props>,常用<list>,<map>

 List:属性可重复,对应java里的collection, 常用
   <  property   name  ="instruments"  > 
 <  list  > 
 <  ref   bean  ="guitar"  > 
 <  ref   bean  ="cymbal"  > 
 </  list  > 
 </  property  >  

Set:属性不重复
  <  property   name  ="instruments"  > 
 <  set  > 
 <  ref   bean  ="guitar"  > 
 <  ref   bean  ="cymbal"  > 
 <  ref   bean  ="cymbal"  >   //自动忽略重复的属性
  </  set  > 
 </  property  >  

Maps:key-value的映射, 常用
   <  property   name  ="instruments"  > 
 <  map  > 
 <  entry   key  ="GUITAR"   value-ref  ="guitar"  > 
 <  entry   key   =......>
  </map  > 
 </  property  >  

Properties:配置String-to-String的映射
  <  property   name  ="instruments"  > 
 <  props  > 
 <  prop   key  ="GUITAR"  > STRUM STRUM STRUM </  prop  > 
 <  prop   key  ="CYMBAL"  > CRASH CRASH CRASH </  prop  > 
 </  props  > 
 </  property  > 

2.4 自动装配

四种自动装配的类型,byName byType constructor autodetect,自动装配虽然节省了XML代码,但是也带来了很多问题,比如属性名字设计时候相当小心,重构代码时候要连带修改, 自动装配的最大缺点就是缺乏透明 ,一般不采用这个Spring IOC的自动装配特性。

2.5 控制Bean创建

初始化和销毁Bean,两种方式:

在声明<bean>的时候加上init-method和destroy-method参数,指定在Bean初始化的时候调用的方法。(推荐使用) java实现类的时候,实现InitializingBean和DisposableBean的afterPropertiesSet和destory方法,spring会允许它们勾入到Bean的生命周期中。(缺点:应用Bean和Spring API相互耦合)

-- 杨华辉 Switching and Intelligent Control Research Center Beijing University of Posts and Telecommunications E-mail: huahuiyang(at)gmail.com

 

标签:  Spring ,  java

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于Spring in Action入门的详细内容...

  阅读:41次