1、起源

引:2002年Rod Johnson写了<<Expert one on one J2EE design and development>>一书,对传统的J2EE架构提出深层次的思考和质疑,并提出J2EE的实用主义思想。2003年,J2EE领域出现了一个新的框架:Spring,对该书的思想进行了全面体现和完善。


Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
• 目的:解决企业应用开发的复杂性
• 功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能
• 范围:任何Java应用
简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
■ 轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。 
■ 控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。
■ 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务()管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。 
■ 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。 
■ 框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。 
所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。


2、下载、安装

http://www.springframework.org 

myeclipse5.5集成1.2,myeclipse6.0集成2.0,myeclipse6.5集成2.5



3、在spring中大量使用的两种模式

 工厂模式

 单态模式

一般Singleton模式通常有几种形式:

public class Singleton {
  private Singleton(){}
  //在自己内部定义自己一个实例 注意这是private 只供内部调用
  private static Singleton instance = new Singleton();
  //这里提供了一个供外部访问本class的静态方法,可以直接访问  
  public static Singleton getInstance() {
    return instance;   
   }
}



 

第二种形式:

public class Singleton {
  private static Singleton instance = null;
  public static synchronized Singleton getInstance() {
  //这个方法比上面有所改进,不用每次都进行生成对象,只是第一次     
  //使用时生成实例!
  if (instance==null)
    instance=new Singleton();
    return instance; 

}
}



 

4、spring基本环境搭建

 <1>导包

 <2>添加applicationContext.xml文件


5、面向接口编程——实现必须依赖抽象,而不是抽象依赖实现。(依赖注入)

。”


6、spring支持Set注入和构造注入。

何谓依赖注入?

Dependency Injection依赖注入依赖注入的意义是:“保留抽象接口,让组件(Component )依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,运行时动态注入依赖的实际对象

示例代码:



package org.sixsun.spring;

public class HelloBean {
    private String name;
    private String helloWord;

    public HelloBean() {
    }
    
    public HelloBean(String name, String helloWord) {
        this.name = name;
        this.helloWord = helloWord;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public void setHelloWord(String helloWord) { 
        this.helloWord = helloWord; 
    } 
    public String getHelloWord() { 
        return helloWord; 
    } 
}



 

1. Constructor injection

1.1 在Bean的配置文件中,使用<constructor-arg>来表示将使用Constructor injection,由于使用Constructor injection时并不如Setter injection时拥有setXXX()这样易懂的名称,所以必须指定参数的位置索引,index属性就是用于指定对象将注入至建构函式中的哪一个参数,参数的顺序指定中,第一个参数的索引值是0,第二个是1,依此类推。

示例配置:



<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloBean" class=" org.sixsun.spring.HelloBean"> <constructor-arg index="0"> <value>sixsun</value> </constructor-arg> <constructor-arg index="1"> <value>HelloSpring</value> </constructor-arg> </bean> </beans> 1.2 如果constructor上只有一个参数,则不必指定index属性。 示例配置: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloBean" class=" org.sixsun.spring.HelloBean"> <constructor-arg> <value>sixsun</value> </constructor-arg> </bean> </beans>



 

1.3 若有两个以上的参数,而参数类型各不相同的话,可以使用type来指定constructor上的参数类型。

示例代码:



package org.sixsun.spring;

public class HelloBean {
    private String name;
    private Integer age;

    public HelloBean() {
    }
    
    public HelloBean(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }

    public void setAge(Integer age) { 
        this.age = age; 
    } 
    public Integer getAge() { 
        return age; 
    } 
}



 

示例配置:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
"http://www.springframework.org/dtd/spring-beans.dtd"> 
<beans> 
    <bean id="helloBean" 
          class=" org.sixsun.spring.HelloBean"> 
        <constructor-arg type="java.lang.String">
            <value>sixsun</value>
        </constructor-arg> 
        <constructor-arg type="java.lang.Integer">
            <value>23</value>
        </constructor-arg> 
    </bean> 
</beans>



2. property injection

示例代码:

package org.sixsun.spring;

import java.util.Date;

public class HelloBean { 
    private String helloWord; 
    private Date date; 
    
    public void setHelloWord(String helloWord) { 
        this.helloWord = helloWord; 
    } 
    public String getHelloWord() { 
        return helloWord; 
    } 
    public void setDate(Date date) { 
        this.date = date; 
    }    
    public Date getDate() { 
        return date; 
    } 
}


2.1 直接指定值或是使用<ref>直接指定参考至其它的Bean

示例配置:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans> 
    <bean id="dateBean" class="java.util.Date"/> 
    
    <bean id="helloBean" class="org.sixsun.spring.HelloBean"> 
        <property name="helloWord"> 
            <value>Hello!</value> 
        </property> 
        <property name="date"> 
            <ref bean="dateBean"/> 
        </property> 
    </bean> 
</beans>


 

2.2 也可以用内部Bean的方式来注入依赖关系

示例配置:


<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" 
"http://www.springframework.org/dtd/spring-beans.dtd">

<beans> 
    <bean id="helloBean" class="org.sixsun.spring.HelloBean"> 
        <property name="helloWord"> 
            <value>Hello!</value> 
        </property> 
        <property name="date"> 
            <bean id="dateBean" class="java.util.Date"/>
        </property> 
    </bean> 
</beans>