• Java框架(三)--Spring IoC容器与Bean管理(2)--基于XML配置Bean


    Spring详细学习

    Spring框架组成模块

    在这里插入图片描述

    三种配置方式

    基于XML配置Bean
    基于注解配置Bean
    基于Java代码配置Bean

    实例化Bean的三种方式

    基于构造方法对象实例化
    基于静态工厂实例化
    基于工厂实例方法实例化

    基于XML配置Bean

    基于构造方法对象实例化

    applicationContext.xml
    在这里插入图片描述
    如果bean标签里没有写任何配置信息的话,默认基于默认构造方法进行创建。

    <bean id="apple1" class="com.ql.spring.ioc.entity.Apple">
    </bean>
    
    • 1
    • 2
    public Apple() {
        System.out.println("Apple对象已创建,"+this);
    }
    /*
    Apple对象已创建,com.ql.spring.ioc.entity.Apple@531be3c5
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    XML方式创建IoC容器
    在这里插入图片描述
    利用构造方法参数名实例化
    在这里插入图片描述
    虽然在配置文件中以字符的形式编写,但是Spring会自动的进行类型转换

    <bean id="apple2" class="com.ql.spring.ioc.entity.Apple">
        <constructor-arg name="title" value="红富士"/>
        <constructor-arg name="origin" value="欧洲"/>
        <constructor-arg name="color" value="红色"/>
        <constructor-arg name="price" value="19.9"/>
    </bean>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    public Apple(String title, String color, String origin, Float price) {
        System.out.println("通过带参构造方法创建对象,"+this);
        this.title = title;
        this.color = color;
        this.origin = origin;
        this.price = price;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    如果参数个数或名称写错都会报错。
    利用构造方法参数位置实例化(不推荐)
    在这里插入图片描述

    基于静态工厂实例化

    在com.ql.spring.ioc.factory包下创建AppleStaticFactory类

    package com.ql.spring.ioc.factory;
    
    import com.ql.spring.ioc.entity.Apple;
    
    /**
     * 静态工厂通过静态方法创建对象,隐藏创建对象的细节
     */
    public class AppleStaticFactory {
        public static Apple createSweetApple(){
            Apple apple = new Apple();
            apple.setTitle("红富士");
            apple.setOrigin("欧洲");
            apple.setColor("红色");
            return apple;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    然后在applicationContext.xml中添加配置

    <!--利用静态工厂获取对象-->
        <bean id="apple4" class="com.ql.spring.ioc.factory.AppleStaticFactory"
              factory-method="createSweetApple"/>
    
    • 1
    • 2
    • 3

    然后就可以从IoC获取这个对象了

    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    Apple apple4 = context.getBean("apple4", Apple.class);
    System.out.println("apple4:"+apple4.getTitle());
    /**
    apple4:红富士
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    基于工厂实例方法实例化

    在com.ql.spring.ioc.factory包下创建AppleFactoryInstance类

    package com.ql.spring.ioc.factory;
    
    import com.ql.spring.ioc.entity.Apple;
    
    /**
     * 工厂实例方法创建对象是指IoC容器对工厂类进行实例化并调用对应的实例方法创建对象的过程
     */
    public class AppleFactoryInstance {
        public Apple createSweetApple(){
            Apple apple = new Apple();
            apple.setTitle("红富士");
            apple.setOrigin("欧洲");
            apple.setColor("红色");
            return apple;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    然后在applicationContext.xml中添加配置

    <!--利用工厂实例方法获取对象-->
    <bean id="factoryInstance" class="com.ql.spring.ioc.factory.AppleFactoryInstance"/>
    <bean id="apple5" factory-bean="factoryInstance" factory-method="createSweetApple"/>
    
    • 1
    • 2
    • 3

    然后就可以从IoC获取这个对象了

    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    Apple apple5 = context.getBean("apple5", Apple.class);
    System.out.println("apple5:"+apple5.getTitle());
    /**
    apple5:红富士
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    从IoC容器获取Bean

    在这里插入图片描述

    id与name属性相同点

    bean id与name都是设置对象在IoC容器中唯一标识。
    两者在同一个配置文件中都不允许出现重复。
    两者允许在多个配置文件中出现重复,新对象覆盖旧对象。

    id与name属性区别

    id要求更为严格,一次只能定义一个对象标识(推荐)
    name更为宽松,一次允许定义多个对象标识。
    tips:id与name的命名要求有意义,按驼峰命名书写。

    在resources目录下再创建一个配置类applicationContext-1.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <bean name="apple2,apple7" class="com.ql.spring.ioc.entity.Apple">
            <constructor-arg name="title" value="红富士2号"/>
            <constructor-arg name="origin" value="欧洲"/>
            <constructor-arg name="color" value="红色"/>
            <constructor-arg name="price" value="19.9"/>
        </bean>
        
    	<bean class="com.ql.spring.ioc.entity.Apple">
            <constructor-arg name="title" value="红富士3号"/>
            <constructor-arg name="origin" value="欧洲"/>
            <constructor-arg name="color" value="红色"/>
            <constructor-arg name="price" value="19.9"/>
        </bean>
    
    </beans>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    然后在SpringApplication中获取两个配置文件的容器

    String[] configLocations  = new String[]{"classpath:applicationContext.xml","classpath:applicationContext-1.xml"};
    ApplicationContext context1 = new ClassPathXmlApplicationContext(configLocations);
    Apple apple2 = context1.getBean("apple2", Apple.class);
    System.out.println(apple2.getTitle());
    Apple apple7 = context1.getBean("apple7", Apple.class);
    System.out.println(apple7.getTitle());
    Apple apple3 = context1.getBean("com.ql.spring.ioc.entity.Apple", Apple.class);
    System.out.println(apple3.getTitle());
    /*
    红富士2号
    红富士2号
    红富士3号
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    路径匹配表达式

    加载单个配置文件

    在这里插入图片描述
    其中classpath:为类路径,源代码中的resources并不是类路径,真实运行的为target目录的classes才是类路径。
    在这里插入图片描述

    加载多配置文件

    在这里插入图片描述

    路径表达式

    在这里插入图片描述

  • 相关阅读:
    GPS北斗网络授时服务器助力河北交投集团高速建设
    git常见问题操作
    【Hack The Box】windows练习-- Buff
    用uniapp开发打包多端应用完整指南
    “比特”与“瓦特”深度融合,云计算驶向绿色低碳快车道
    蓝桥杯每日一题2023.10.16
    Crypto量化高频体验总结
    illustrator插件-将位图矢量化-转为SVG-AI插件
    C++ std::unique_lock 用法介绍
    灯光照明设备经营小程序商城的作用是什么
  • 原文地址:https://blog.csdn.net/qq_32091929/article/details/125464644