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" />
原文地址:https://www.cnblogs.com/zhy0720/p/10452191.html