zoukankan      html  css  js  c++  java
  • spring01

    一、spring介绍

    1、spring的概念、特点

      概念:

      spring是一个分层的开源的轻量级框架,实际上是一个存放对象的容器,核心是控制反转(IoC)、面向切面(AOP),项目中所有对象的创建和依赖关系的维护都交给spring来管理,不用再自己创建和维护;

      特点(优势):

        

    2、准备工作:

      导入jar包:

        

      导入约束(即引入新的命名空间Namespaces):

       

    3、注册对象到容器中(举例)

    4、IoC思想(控制反转):涉及到DI(依赖注入技术)和IoC思想,IOC思想的实现要依赖于DI技术;控制反转指的是,对象的创建和管理交给spring而不是开发者手动创建;

      

    5、两个接口的对比

      BeanFactory接口(顶层接口,其实现类的功能单一,已过时,在资源匮乏的时候会使用,因为他只有在每次获得对象的时候才创建对象);

      ApplicationContext接口(继承于BeanFactory接口,实现类的功能较多,特点是:每次容器启动时,就会创建容器中配置的所有对象,获取对象时,直接在里边取即可);

    6、spring简单配置

      (1)Bean元素(配置文件xml的根元素)的配置:将对象交给spring来管理,用Bean元素来描述需要spring管理的那些对象,如下图:

        

        然后,比如在测试类里需要获取对象时,可以:

        

    7、spring创建对象的三种方式

      (1)空参构造方式:上述6里边的图片,创建一个User类,在xml里配置name,class属性后,通过User的空参构造方法来创建对象user;

      (2)静态工厂方式:首先创建一个UserFactory(工厂类),类里边定义一个静态的方法(因此叫静态工厂方式),获得User的对象user:

        

      (3)动态实例化方式:将上述UserFactory(工厂类)里的静态方法换为非静态的方法,这时候,xml里的配置有些变化:如下是(2)(3)两种方式的不同配置方式:

          可以看到,(3)中由于工厂方法是非静态的,所以配置的时候需要先配置,创建UserFactory的实例化对象,再用该对象调用createUser2()方法,获取user对象;

          其中多了一个factory-bean属性,切记;

        

        结论:(1)用得最多,(2)(3)基本不用,了解即可;

    二、spring配置详解(进阶)

      说明:除了一中简单的bean配置,下面介绍详细的spring配置:

      1、<bean></bean>里边的scope属性;

       常见的四种属性值:(重点是前两种)

       (1)singleton(单例),这是默认的,不写的话,默认创建的是单例对象;

          User  u1 =  ac.getBean("user");

          User  u2 =  ac.getBean("user");,这里u1和u2是同一个对象,打印(u1==u2)时返回true;并且只调用了一次空参构造方法; 

       (2)prototype(多例),每次创建时都会调用一次空参构造,且每次创建的都是不同对象;

       (3)request:web环境下,对象与request生命周期一致;(了解,即使在web环境下也基本不用);

       (4)session:web环境下,对象与session生命周期一致;(了解,即使在web环境下也基本不用);

      结论:(1)(2)比较常用,以后开发中大部分使用(1)单例模式(2)在struts2中使用,在struts2中,根据struts2架构的设计,action对象每次获取时必须是一个新的对象交给spring来管理,所以action必须设置为prototype(多例)。

      2、初始化&销毁方法(即生命周期方法)

      在bean里配置两个方法:<bean  init-method="init"  destroy-method="destroy"></bean>,然后还要在User类里边定义这两个方法,注意名字要与init/destroy一致,这样的话,每次创建完对象之后(空参构造调用之后),就会执行init的方法,但是要想调用到destroy方法,必须在测试方法里获取完对象之后,添加:ac.close(),这里的ac必须是ApplicationContext子类ClassPathXmlApplicationContext的对象,才能调用close方法;

      3、模块化配置

        在spring配置文件中引入其他配置文件,不需要将所有配置写在一个文件中;

        

      4、spring属性注入(4种)

      (1)set方法注入(带头大哥级别,最简单,最重要的):这种方法要求User类里边必须有set方法

        注:User类里边如果有对象属性(如下面的User类里的car对象),普通的属性值用value,对象属性的值(引用)用ref

          即先把car对象配置在容器中,然后再user里用ref引用;

        class  User{

          private  String  name;

          private  int  age;

          private  Car  car;//这里就是car对象,当然,也要创建Car类

        } 

    1 <!-- set方式注入: -->
    2     <bean  name="user" class="cn.itcast.bean.User" >
    3         <!--值类型注入: 为User对象中名为name的属性注入tom作为值 -->
    4         <property name="name" value="tom" ></property>
    5         <property name="age"  value="18" ></property>
    6         <!-- 引用类型注入: 为car属性注入下方配置的car对象 -->
    7         <property name="car"  ref="car" ></property>
    8     </bean>

      <!-- 将car对象配置到容器中 -->
        <bean name="car" class="cn.itcast.bean.Car" >
          <property name="name" value="兰博基尼" ></property>
          <property name="color" value="黄色" ></property>
        </bean>

      (2)构造函数注入

     1     <!-- 构造函数注入 -->
     2 <bean name="user2" class="cn.itcast.bean.User" >
     3     <!-- name属性: 构造函数的参数名 -->
     4     <!-- index属性: 构造函数的参数索引 -->
     5     <!-- type属性: 构造函数的参数类型-->
     6     <constructor-arg name="name" index="0" type="java.lang.Integer" value="999"  ></constructor-arg>
     7     <constructor-arg name="car" ref="car" index="1" ></constructor-arg>
     8 </bean>
     9 
    10 
    11         注:index是为了区分当Bean类有多个构造函数时,按索引走哪个构造函数;
    12            type是为了区分多个构造函数,但是函数参数类型不同时,根据type来确定走哪个构造函数;

      (3)p名称空间注入(spring新研发的)

    1 <!-- p名称空间注入, 走set方法
    2     1.导入P名称空间  xmlns:p="http://www.springframework.org/schema/p" (也可以在Namespaces里设置)
    3     2.使用p:属性完成注入
    4         |-值类型: p:属性名="值"
    5         |-对象类型: p:属性名-ref="bean名称"
    6  -->
    7     <bean  name="user3" class="cn.itcast.bean.User" p:name="jack" p:age="20" p:car-ref="car"  >
    8     </bean>

      (4)spel注入(spring  Expression  Language , spring EL表达式)

        注意下面代码中的绿色文字;

    1 <!-- 
    2     spel注入: spring Expression Language sping表达式语言
    3  -->
    4 <bean  name="user4" class="cn.itcast.bean.User" >
    5         <property name="name" value="#{user.name}" ></property>//固定格式#{},可以取user的name
    6         <property name="age" value="#{user3.age}" ></property>//取user3对象的age
    7         <property name="car" ref="car" ></property>
    8 </bean>//注:对象属性的引入,不能使用spel的方法!!!

      (5)复杂类型注入(数组、集合、map、Properties类型属性的注入)

      比如:

        

      下边分别介绍:

     1 <bean name="cb" class="cn.itcast.c_injection.CollectionBean" >
     2     <!-- 如果数组中只准备注入一个值(对象),直接使用value|ref即可 
     3     <property name="arr" value="tom" ></property>
     4     -->
     5     <!-- array注入,多个元素注入 -->
     6     <property name="arr">
     7         <array>
     8             <value>tom</value>
     9             <value>jerry</value>
    10             <ref bean="user4" />
    11         </array>
    12     </property>
    13 -----------------------------------------------------------------------------    
    14     <!-- 如果List中只准备注入一个值(对象),直接使用value|ref即可        
    15     <property name="list" value="jack" ></property>-->
    16         <!--list注入,多个元素注入-->
    17     <property name="list"  >
    18         <list>
    19             <value>jack</value>
    20             <value>rose</value>
    21             <ref bean="user3" />
    22         </list>
    23     </property>
    24 -----------------------------------------------------------------------------
    25     <!-- map类型注入 -->
    26     <property name="map"  >
    27         <map>
    28             <entry key="url" value="jdbc:mysql:///crm" ></entry>
    29             <entry key="user" value-ref="user4"  ></entry>
    30             <entry key-ref="user3" value-ref="user2"  ></entry>
    31         </map> 
    32     </property>
    33 -----------------------------------------------------------------------------
    34     <!-- prperties 类型注入 -->
    35     <property name="prop"  >
    36         <props>
    37             <prop key="driverClass">com.jdbc.mysql.Driver</prop>
    38             <prop key="userName">root</prop>
    39             <prop key="password">1234</prop>
    40         </props>
    41     </property>
    42 </bean>

     三、总结一下以上的内容

    1.spring介绍
        spring并不局限于某一层.
        spring是对象的容器,帮我们"管理"项目中的所有对象
        
    2.spring搭建
        1>导包 4+2(仅指的是spring的包)
        2>准备类
        3>书写配置(src/applicationContext.xml,使用eclipse的话,配置文件建议写在src下)
        4>书写代码测试
        
    3.spring中的概念
        ioc: 反转控制. 创建对象的方式反转了.从我们自己创建对象,反转给spring(程序)来创建.
        
        di: 依赖注入.将必须的属性注入到对象当中.是实现ioc思想必须条件.
        
        beanFactory与ApplicationContext
        
    4.配置文件详解
        
        bean元素
            id:    给Bean起个名字        不能重复,不能使用特殊字符.早期属性.
            name:给Bean起个名字        能重复,能使用特殊字符.后来属性.
            class:类的完整类名
        生命周期属性
            init-method        指出初始化方法
            destory-method  指出销毁方法
        作用范围
            scope: 
                singleton(默认值):单例.创建容器时会立即创建单例对象
                prototype :多例.每次获得对象时,才会创建对象,并且每次都会创建新的对象
        分模块开发
            <import  />
        
    5.Bean的创建方式
        *空参构造创建
        静态工厂
        实例工厂
    
    6.注入方式
        *set方法
        *构造方法
        p名称空间
        spEL表达式
        
    7.复杂属性注入
        Array
        List
        Map
        Properties
    8.在WEB环境中使用Spring容器(struts2)
        1>导包 4+2+1(spring-web)
        2>在web.xml中配置listener => ContextLoaderListener
            |-配置参数,指定spring配置路径 
        3>在Action中,使用工具类获得容器.
            |-WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
  • 相关阅读:
    深入浅出聊优化:从Draw Calls到GC
    关于Unity中植物树木烘焙后没有影子的解决方法
    Marvelous Designer 服装设计与模拟
    DAZ studio 4.9基础
    在下载SOPC代码的过程中遇到的一些错误
    开发工程师人生之路
    简易信号发生器的设计
    HDU A Simple Math Problem (矩阵快速幂)
    HDU Queuing (递推+矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/limuma/p/8459171.html
Copyright © 2011-2022 走看看