Java康复性训练——Spring(1)

2016/7/21 posted in  Java  

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。

Spring IOC

IOC(Inverse of Control)控制反转,又称作依赖注入。是一种重要的面向对象编程的法则,用于削减计算机程序的耦合问题,是轻量级Spring框架的核心。
Spring的IOC的核心就是为各类依赖进行注入,Spring将注入的单例实例称之为bean。依赖注入也就是将Bean注入实例。

依赖注入

  1. 装配一个Bean

    1. 在Spring的bean.xml文件中填写如下配置:

      <bean id="user1" class="site.zhanjingbo.model.User"></bean> 
      
    2. 在需要对实例进行初始化的时候使用如下代码:

      public static void main(String[] args) {
      
          //加载Spring-bean配置信息
          ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
      
          //获取id为user1的bean的实例
          User user1 = (User)ac.getBean("user1");
          System.out.println(user1);
      }
      
  2. 属性注入:为注入的实例设置属性值。通过配置beans.xml实现,实现代码如下:

    <bean id="user2" class="site.zhanjingbo.model.User">
        <property name="id" value="2"></property>
        <property name="username" value="administrator"></property>
        <property name="password" value="password"></property>
    </bean>
    
  3. 构造函数注入:在实例化bean时调用指定的构造方法。通过配置beans.xml文件实现。

    <bean id="user3" class="site.zhanjingbo.model.User">
        <!-- 通过索引来设置参数值 -->
        <constructor-arg index="0" value="3"></constructor-arg>
        <!-- 通过类型来设置参数值 -->
        <constructor-arg type="String" value="username"></constructor-arg>
        <!-- 通过参数名来设置参数值 -->
        <constructor-arg name="password" value="password"></constructor-arg>
    </bean>
    
  4. 工厂方法注入:通过自己定义的工厂方法对bean进行实例化注入。

    1. 静态工厂方法,在beans.xml中调用。

      <bean id="user4" class="site.zhanjingbo.factory.UserFactory" factory-method="createUser"></bean>
      
    2. 非静态工厂方法,先声明工厂类的Bean,再对其进行调用

      <bean id="userFactory" class="site.zhanjingbo.factory.UserFactory"></bean>
      <bean id="user5" factory-bean="userFactory" factory-method="createUser"></bean>
      

注入参数

  1. 基本类型值:参考上一节属性注入。
  2. 注入Bean:<property name="role" ref="role1"></property>
  3. 内部Bean,为了防止bean被其他部分引用,可以将bean声明在<property></property>之间,仅供自己引用。
  4. null值,在<property></property>之间添加<null></null>表示空值。
  5. 级联属性,直接对属性对象的属性进行赋值。要确保该属性对象不为null。<property name="role.name" value="admin"></property>
  6. 集合类型属性,可以用下列配置来实现。

    <!-- list-->
    <property name="list">
        <list>
            <value></value>
        </list>
    </property>
    <!--set-->
    <property name="set">
        <set>
            <value></value>
        </set>
    </property>
    <!--map-->
    <property name="map">
        <map>
            <entry>
                <key><value>key</value></key>
                <value>value</value>
            </entry>
        </map>
    </property>
    

自动装配

通过配置default-autowrite属性,Spring IOC容器可以自动为程序注入bean;默认是no,不启用自动装配。default-autowrite的类型有byName,byType,constructor。
- byName:通过名称进行自动匹配
- byType:根据类型进行自动匹配
- constructor:和byType类似,只不过它是根据构造方法注入而言的,根据类型,自动注入。
建议:自动装配机制由于屏蔽了装配的细节,容易产生潜在的错误,慎用

方法注入

Spring bean默认的作用域是单例的,每次获取的都是同一个对象。我们可以通过设置bean的scope属性为prototype实现多例。
在关联的Bean中我们通过设置来实现多例注入。

bean之间关系

  1. 继承:可以通过设置Abstract类型的Bean来设置某一类Bean的共用参数,继承bean设置parent属性即可。
  2. 依赖:通过设置bean的depends-on属性来设置依赖
  3. 引用:见上部

bean的作用范围

  1. singleton:Spring Ioc容器中仅有一个bean实例,以单例的方式存在
  2. prototype:每次容器调用Bean时,都返回一个新的实例
  3. request:每次Http请求时都会创建一个新的实例
  4. session:同一个Http Session共享一个Bean
  5. global session:同一个全局Session共享一个bean,一般用于portlet应用环境
  6. application:同一个Application共享一个bean