• Spring - xml实现


    创建对象

    构造方法

    使用无参构造方法创建对象

    工厂创建

    应用场景

    第三方依赖中某个类型没有提供构造方法时使用

    实例工厂

    容器中需要存在一个工厂实例

    1. <bean id="petFactory" class="com.xxx.factory.PetFactory"/>
    2. <bean id="pet" factory-bean="petFactory" factory-method="getPet">
    3.    
    4.    
    5.    <constructor-arg name="choice" value="3"/>
    6. bean>

    静态工厂

    无需在容器中存在工厂实例

    1. <bean id="pet" class="com.woniuxy.factory.PetFactory" factory-method="getPet">
    2.    
    3.    
    4.    <constructor-arg name="choice" value="2"/>
    5. bean>

    依赖注入

    构造器注入

    要提供带参构造方法

    1. <bean id="pet" class="com.xxx.model.Pet">
    2.    <constructor-arg name="pName" value="小狗"/>
    3. bean>
    4. <bean id="user" class="com.xxx.model.User">
    5.    
    6.    
    7.    
    8.    
    9.    
    10.    
    11.    <constructor-arg name="uName" value="张三"/>
    12.    <constructor-arg name="pet" ref="pet"/>
    13. bean>

    setter注入

    要提供setter方法

    1. <bean id="pet" class="com.xxx.model.Pet">
    2.    <property name="PName" value="小狗"/>
    3. bean>
    4. <bean id="user" class="com.xxx.model.User">
    5.    
    6.    <property name="UName" value="张三"/>
    7.    <property name="pet" ref="pet"/>
    8. bean>

    依赖注入的三种类型

    基本数据类型、String

    标签中使用value属性完成赋值

    在容器中注册过的bean

    标签中使用ref属性来完成赋值

    集合类型

    1. public class Pet {
    2.    private String[] dogs;
    3.    private List cat;
    4.    private Set mouse;
    5.    private Map pig;
    6.    private Properties fish;
    7. }
    1. <bean id="pet" class="com.xxx.model.Pet">
    2.    
    3.    <property name="dog">
    4.        <array>
    5.            <bean class="java.lang.String">
    6.                <constructor-arg value="dog1"/>
    7.            bean>
    8.            <bean class="java.lang.String">
    9.                <constructor-arg value="dog2"/>
    10.            bean>
    11.        array>
    12.    property>
    13.    
    14.    <property name="cat">
    15.        <list>
    16.            <bean class="java.lang.String">
    17.                <constructor-arg value="cat1"/>
    18.            bean>
    19.            <bean class="java.lang.String">
    20.                <constructor-arg value="cat2"/>
    21.            bean>
    22.        list>
    23.    property>
    24.    
    25.    <property name="mouse">
    26.        <set>
    27.            <bean class="java.lang.String">
    28.                <constructor-arg value="mouse1"/>
    29.            bean>
    30.            <bean class="java.lang.String">
    31.                <constructor-arg value="mouse2"/>
    32.            bean>
    33.        set>
    34.    property>
    35.    
    36.    
    37.    <property name="pig">
    38.        <map>
    39.            <entry key="pig1">
    40.                <bean class="java.lang.String">
    41.                    <constructor-arg value="pig-A"/>
    42.                bean>
    43.            entry>
    44.            <entry key="pig2">
    45.                <bean class="java.lang.String">
    46.                    <constructor-arg value="pig-B"/>
    47.                bean>
    48.            entry>
    49.        map>
    50.    property>
    51.    
    52.    <property name="fish">
    53.        <props>
    54.            <prop key="fish1">fish-Aprop>
    55.            <prop key="fish2">fish-Bprop>
    56.        props>
    57.    property>
    58.    
    59. bean>

    FactoryBean

    factoryBean是使用工厂模式和简单装饰模式的bean

    我们可通过它产生任意类型的对象

    spring提供了一个接口factoryBean,该接口的泛型就是通过对应的factoryBean产生的对象的类型

    自定义factoryBean

    1. // 配置FactoryBean泛型类型
    2. public class UserFactoryBean implements FactoryBean> {
    3.    // 该方法的返回值就是在容器中配置了UserFactoryBean后,通过getBean()方法获得的对象
    4.    public List getObject() throws Exception {
    5.        return Arrays.asList("1","2","3");
    6.   }
    7.    // 该方法用于设置返回对象的数据类型
    8.    public Class getObjectType() {
    9.        return List.class;
    10.   }
    11.    // 该方法用于设置getObject()返回值是否为单例(true:单例、false:多例)
    12.    public boolean isSingleton() {
    13.        return true;
    14.   }
    15. }
    <bean id="UserFactoryBean" class="com.xxx.factoryBean.UserFactoryBean"/>    

    官方factoryBean

    spring提供封装好的factoryBean,主要接触的是用于产生集合的factoryBean

    注意:list、set、map、properties有factoryBean,数组没有对应的factorBean

    1. <bean id="FactoryBean" class="org.springframework.beans.factory.config.ListFactoryBean">
    2.    
    3.    
    4.    <property name="sourceList">
    5.        <list>
    6.            <value>1value>
    7.            <value>2value>
    8.            <value>3value>
    9.        list>
    10.    property>
    11.    
    12.    
    13.    <property name="targetListClass" value="java.util.List"/>
    14. bean>
    15. <bean id="FactoryBean" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    16.    
    17.    
    18.    <property name="location" value="db.properties"/>
    19. bean>

    BeanFactory与FactoryBean的区别

    beanFactory是用于创建和管理bean的工厂,是spring ioc容器的顶层接口

    factoryBean是普通的bean,是factoryBean采用了工厂模式和简单装饰模式,可以使用它来创建一个其他类型的对象

    命名空间

    p命名空间

    简化setter注入操作

    引入p命名空间后,在配置文件中可不用编写标签,在bean标签上使用"p:属性名=值"方式完成对象属性赋值

    1. 配置文件的beans标签中添加:

      xmlns:p="http://www.springframework.org/schema/p"
    2. 在bean标签上使用"p:属性名=值"的方式完成对象的成员变量赋值

      <bean id="User" class="com.xxx.model.User" p:name="张三" p:age="23"/>

    c命名空间

    简化构造注入

    引入c命名空间在配置文件中可不用编写标签,在bean标签使用"c:属性名=值"完成对象赋值

    1. 配置文件的beans标签中添加:

      xmlns:c="http://www.springframework.org/schema/c"
    2. 在bean标签上使用p:属性名=值的方式完成对象的成员变量的赋值操作

      <bean id="User" class="com.xxx.model.User" c:name="王五" c:age="23"/>

    util命名空间

    用于在容器中注册集合的命名空间(list、set、map、properties)

    1. 配置文件的beans标签中添加:

      1. xmlns:util="http://www.springframework.org/schema/util"
      2. http://www.springframework.org/schema/util
      3. http://www.springframework.org/schema/util/spring-util.xsd
    2. 使用util命名空间完成容器中集合对象的注册

      1. <util:list id="list">
      2.    <bean class="java.lang.String" c:value="张三"/>
      3.    <bean class="java.lang.String" c:value="李四"/>
      4.    <bean class="java.lang.String" c:value="王五"/>
      5. util:list>
      6. <util:properties id="properties" location="db.properties"/>

    bean的作用域

    bean标签的scope属性决定bean的作用域,scope属性值:

    1. singleton:单例(默认值)

    2. prototype:原型模式,多例

    3. request:每个请求都会生成一个新的实例,多例

    4. session:每个会话都会生成一个新的实例,多例

    5. globalSession:集群环境下才有可能用得到的值,多例(低版本spring才设置这个值)

    单例的bean,生命周期与容器保持一致:容器创建,bean创建;容器关闭,bean销毁。

    多例的bean,生命周期与容器无关:使用到该bean,才完成初始化;在GC(垃圾回收)时,才销毁。

    1. @NoArgsConstructor
    2. @AllArgsConstructor
    3. public class User {
    4.    private String name;
    5.    private String age;
    6.    // 定制初始化方法
    7.    public void state(){
    8.        System.out.println("bean出生");
    9.   }
    10.    // 定制销毁方法
    11.    public void end(){
    12.        System.out.println("bean死亡");
    13.   }
    14. }
    1. <bean id="bean" class="com.xxx.model.User" init-method="state" destroy-method="end" scope="singleton" c:name="张三" c:age="23"/>

    scope="singleton"

    1. /*scope="singleton"*/
    2. // 容器创建,bean创建:bean出生
    3. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    4. // 容器关闭,bean销毁:bean死亡
    5. context.close();

    scope="prototype"

    1. // 无反应
    2. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    3. // 完成初始化:bean出生
    4. System.out.println(context.getBean("bean"));
    5. // 无反应
    6. context.close();

    自动装配

    spring配置文件中,通过在bean标签设置autowire属性,然后设置自动装配策略,当容器启动时,spring会自动为某个需要进行属性设置的对象成员变量进行自动装配:从容器中去找到一个符合要求的对象并且装配到某个对象的成员变量中。

    autowire属性取值:

    属性作用
    no不进行自动装配(默认值)
    default使用父级标签的自动装配策略
    byName根据成员变量名称去容器找一个bean的id值与之相匹配的bean,赋值给对应成员变量
    byType根据成员变量类型去容器中找一个bean的class值与之相匹配的bean,赋值给对应成员变量
    constructor根据构造方法形参类型找一个bean的class值与之相匹配的bean,赋值给对应成员变量(本质上是byType策略)

    注意

    使用byType进行自动装配,有可能由于容器中存在多个相同类型的bean,而导致无法实现准确自动装配,从而报异常

    解决方案:在进行自动装配时,把自动装配时不需要的bean排除掉,排除需要在bean标签上使用autowire-candidate属性,取值为false

    spring的自动装配使用XML配置很死板,不灵活。在开发中用注解配置

    1. public class User {
    2.    private String uName;
    3.    private Pet pet;
    4. }
    1. <bean id="pet1" class="com.xxx.model.Pet" c:pName="小狗" c:pAge="2" autowire-candidate="false" />
    2. <bean id="pet2" class="com.xxx.model.Pet" c:pName="小猫" c:pAge="3"/>
    3. <bean id="user" class="com.xxx.model.User" autowire="byType">
    4.    <property name="uName" value="张三"/>
    5. bean>
  • 相关阅读:
    POJ 2836 Rectangular Covering 状态压缩DP(铺砖问题)
    Linux学习---uboot入门
    仿真调试stm32汇编代码
    Navicat 16.1 的新功能 - 第 1 部分
    map和set
    Transformer的应用
    git push rejected的原因
    FFmpeg 命令:从入门到精通 | ffppeg 命令提取音视频数据
    毕业季,作为程序员(it软件开发工程师),如何培养强大的解决问题的能力
    unity基础1-事件执行顺序、自定义事件
  • 原文地址:https://blog.csdn.net/Xstruggle/article/details/125916057