• 03-Spring的XML配置


    Spring-XML配置

    1. 标签的配置

    属性:

    1. id属性:Bean的名字,使用了约束中的唯一约束,里面不能出现特殊字符;必须以字母开始,可以使用字母、数字、连字符、下划线、句号、冒号。
    2. name属性:bean的名字,没有采用ID的约束;name允许出现特殊字符;如果没有id的话,name也可以当作id使用。
    3. class属性:被管理对象的完整类名。
    4. ref属性:引用其他bean的id值。
    5. factory-bean属性:实例工厂的引用
    6. factory-method属性:引用工厂的方法名参数。
    7. scope属性:
      • singleton:单例的,默认值;单例对象.被标识为单例的对象在spring容器中只会存在一个实例。
      • prototype:多例模式:Struts2和Spring整合的时候一定会用到。因为Action是多例的,每一个Action一个值栈。如果Bean的作用范围是单例的,那么数据会不安全。多例原型.被标识为多例的对象,每次再获得才会创建.每次创建都是新的对象.整合struts2时,ActionBean必须配置为多例的。
      • request:对于每次Http请求,都将会产生一个不同的Bean实例;web环境下,对象与request生命周期一致。
      • session:对于每个不同的HttpSession,都将会产生一个不同的Bean实例;web环境下,对象与session生命周期一致。
      • globalSession:在web项目中,应用在Porlet环境中,如果没有Porlet环境那么globalSession相当于session。
    8. init-method属性:定初始化方法的方法名;配置一个方法作为生命周期初始化方法.spring会在对象创建之后立即调用。
    9. destory-method属性:配置一个方法作为生命周期的销毁方法。spring容器在关闭并销毁所有容器中的对象之前调用。
    10. lazy-init属性:延迟实例化对象【
    11. default-lazy-init属性:设置全局延迟实例化。放在标签中,这样,整体的都会被延迟实例化,若其中某一个不想被延迟,可给其设置lazy-init="false"。

    2. Spring创建对象的方式

    1. 空参构造方法
    2. 静态方法

    3. 实例方法

    3. Spring属性注入的方式:

    1. 构造函数注入的方式:

    2. setter方法注入的方式:

    3. p名称空间注入:

    4. spel注入:

    5. 复杂类型注入:

    1)数组:


    2)List集合


    3)Map集合

    4)Properties属性文件

    4. 属性注入的分类

    Bean实例在调用无参构造器创建了空值对象后,就要对Bean对象的属性进行初始化。初始化是由容器自动完成的,称为注入。根据注入方式的不同,常用的有两类:设值注入、构造注入。
    还有另外一种,实现特定接口注入。由于这种方式采用侵入式编程,污染了代码,所以几乎不用。
    (1)设值注入:通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring的依赖注入中大量使用。使用标签进行设置。
    (2)构造注入:在构造调用者实例的同时,完成被调用者的实例化。即,使用构造器设置依赖关系。
    标签中用于指定参数的属性有:

    • name属性:指定参数名称。
    • index属性:指明该参数对应这构造器的第几个参数,从0开始。不过,该属性不要也行,但要注意,若参数类型相同,或之间有包含关系,则需要保证赋值顺序要与构造器中的参数顺序一致。
    • type属性:指定其类型。基本类型直接写类型关键字即可,非基本类型需要写全限定性类名。
      (3)p名称空间注入(了解)
      对于设值注入与构造注入,在配置文件中,除了使用标签外,还可使用命名空间注入的方式,让注入的值以标签属性的方式出现。根据注入实现方式的不同,分为p命名空间注入与C命名空间注入。
    • p命名空间注入:采用设值注入方式,故需要有相应的setter。
    • c命名空间注入:采用构造注入方式,故需要有相应的构造器。
      1)p命名空间:
      添加相应的约束:xmlns:p="http://www.springframework.org/schema/p"
      标签中使用p命名空间中的属性。p:bean属性="值"或者p:bean属性-ref="值"

      2)c命名空间:
      添加相应的约束:xmlns:c="http://www.springframework.org/schema/c"
      标签中使用p命名空间中的属性。p:bean属性="值"或者p:bean属性-ref="值"

      (4)Spring3.0创建了一种新的方式用以配置对象的注入(set注入或者构造参数注入),它便是 SpEL。SPEL即SpringEL表达式。
      SpEL使用#{…}作为界定符,所有在大括号中的字符都将被认为是SpEL
      字面量的表示:
      1)整数:<property name="count" value="#{5}"/>
      2)小数:<property name="frequency" value="#{89.7}"/>
      3)科学计数法:<property name="capacity" value="#{1e4}"/>
      4)可以使用单引号或者双引号作为字符串的定界符号:
      <property name="name" value="#{'Chuck'}"/> <property name='name' value='#{"Chuck"}'/>
      5)布尔值:<property name="enabled" value="#{false}"/>
      引用类型的表示:
      1)引用其他对象:
      <bean id=”saxophone” value=”com.xxx.xxx.Xxx”/> <property name="instrument" value="#{saxophone}"/><property name="instrument" ref="saxophone"/>
      2)引用其他对象的属性:<property name="song" value="#{kenny.song}" />
      3)调用普通方法:为了避免抛出异常,使用?.表达式
      <property name="song" value="songSelector.selectSong().toUpperCase()"/> <property name="song" value="songSelector.selectSong()?.toUpperCase()"/>
      4)调用静态方法:<property name="multiplier" value="T(java.lang.Math).PI"/>

    5. 对于域属性的自动注入

    对于域属性的注入,也可不在配置文件中显示的注入。可以通过标签设置autowire属性值,为域属性进行隐式自动注入。根据自动注入判断标准的不同,可以分为两种。

    • byName:根据名称自动注入。
    • byType:根据类型自动注入。
    • 使用内部Bean注入。
      (1)byType方式自动注入
      使用byType方式自动注入,要求:配置文件中被调用者Bean的class属性指定的类,要与代码中调用者Bean类的某域属性类型同源。即要么相同,要么有is-a关系(子类,或是实现类)。但这样的同源的被调用bean只能有一个。多于一个,容器就不知该匹配哪一个了。
    public class School{
        private String name;
    }
    public class Student{
        private String name;
        private int age;
        private School school;
    }
    
    <bean id="mySchool" class="com.zhy.School">
        <property name="name" value="清华大学" />
    </bean>
    <bean id="myStudent" class="com.zhy.Student" autowire="byType">
        <property name="name" value="张三" />
        <property name="age" value="23" />
    </bean>
    

    (2)byName方式自动注入
    当配置文件中被调用者Bean的id值与代码中调用者Bean类的属性名相同时,可使用byName方式,让容器自动将被调用者bean注入给调用者Bean。容器是通过调用者的Bean类的属性名与配置文件的被调用者Bean的id进行比较而实现自动注入的。

    public class School{
        private String name;
    }
    public class Student{
        private String name;
        private int age;
        private School mySchool;
    }
    
    <bean id="mySchool" class="com.zhy.School">
        <property name="name" value="清华大学" />
    </bean>
    <bean id="myStudent" class="com.zhy.Student" autowire="byName">
        <property name="name" value="张三" />
        <property name="age" value="23" />
    </bean>
    

    (3)使用内部Bean注入
    若不希望代码直接访问某个Bean,即在代码中通过getBean方法获取该Bean实例,则可将该Bean的定义放入调用者Bean定义的内部。

    <bean id="myStudent" class="com.zhy.Student">
        <property name="name" value="张三" />
        <property name="age" value="23" />
        <property name="school">
            <bean class="com.zhy.School">
                <property name="name" value="清华大学" />
            </bean>
        </property>
    </bean>
    

    6. 使用抽象类配置Bean

    (1)使用同类抽象Bean注入
    当若干Bean实例同属于一个类,且这些实例的属性值又有相同值时,可以使用抽象Bean,以简化配置文件。
    抽象Bean是用于让其他Bean继承的。这个bean在Bean类中是不能通过getBean方法获取的。设置abstract属性为true来指明该bean为抽象bean,默认是false。不过,该bean不为抽象bean时,也可被继承。只不过,在应用中,用于被继承的bean一般为抽象bean。

    public class Student{
        private String name;
        private double score;
        private String department;
        private String school;
    }
    
    <bean id="myBase" class="com.zhy.Student" abstract="true">
        <property name="department" value="计算机工程" />
        <property name="school" value="清华大学" />
    </bean>
    <bean id="myStudent1" parent="myBase">
        <property name="name" value="张三" />
        <property name="score" value="94.2" />
    </bean>
    <bean id="myStudent2" parent="myBase">
        <property name="name" value="王五" />
        <property name="score" value="95.5" />
    </bean>
    

    (2)使用异类抽象Bean注入
    当若干不同的类对象具有相同的属性,且其值也相同时,可使用异类抽象Bean。

    public class Student{
        private String name;
        private double score;
        private String department;
        private String school;
    }
    public class Teacher{
        private String name;
        private int teachAge;
        private String department;
        private String school;
    }
    
    <bean id="myBase" abstract="true">
        <property name="department" value="计算机工程" />
        <property name="school" value="清华大学" />
    </bean>
    <bean id="myStudent" class="com.zhy.Student" parent="myBase">
        <property name="department" value="计算机工程" />
        <property name="school" value="清华大学" />
    </bean>
    

    7. 为应用指定多个Spring配置文件【分模块开发】

    在实际应用里,随着应用规模的增加,系统中Bean数据也大量增加,导致配置文件变得非常庞大、臃肿。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring配置文件分解成多个配置文件。
    (1)平等关系的配置文件
    将配置文件分解为地位平等的多个配置文件,并将所有配置文件的路径定义为一个String数组,将其作为容器初始化参数出现。其将与可变参的容器的容器构造器匹配。
    ClassPathXmlApplicationContext(String...configLocation)

    String[] resourceFiles={"com/zhy/spring-base.xml","com/zhy/spring-student/xml","com/zhy/spring-teacher.xml"};
    ApplicationContext ac = new ClassPathXmlApplicationContext(resourceFiles);
    Student student = (Student)ac.getBean("myStudent");
    

    (2)包含关系的配置文件
    各配置文件中有一个总文件,总配置文件将各其他子文件通过引入。在Java代码中只需要使用总配置文件对容器进行初始化即可。
    也可使用通配符。但此时要求父配置文件名不能满足所能匹配的格式,否则将出现循环递归包含。就本例而言,父配置文件不能匹配spring-*.xml的格式,即不能起名为spring-total.xml

    <import resource="classpath:com/zhy/spring-base.xml" />
    <import resource="classpath:com/zhy/spring-*.xml" />
    
  • 相关阅读:
    什么是Flex 布局
    wx.navigateTo、wx.redirectTo和wx.switchTab三种导航方式的区别
    Ajax 工作原理 及 实例
    NodeJS之 Express框架 app.use(express.static)
    Parcel 入门 (一)
    打包工具的介绍
    CSS网页布局
    《拖延心理学》阅读要点
    PHP实现页面静态化
    PHP中的魔术方法
  • 原文地址:https://www.cnblogs.com/zhy0720/p/10452191.html
Copyright © 2020-2023  润新知