Spring 的 Ioc配置

HappyComponent.java

java 复制代码
package com.atguigu.Ioc_01;

public class HappyComponent {
    // 默认包含无参的构造方法

    public void dowork(){
        System.out.println("HappyComponent.dowork");
    }
}

ClientService.java

java 复制代码
package com.atguigu.Ioc_01;

静态工厂类
public class ClientService {
    private static ClientService clientService = new ClientService();

    private ClientService() {
    }

    public static ClientService clientService() {
        return clientService;
    }
}

ClientServiceImpl.java

java 复制代码
package com.atguigu.Ioc_01;

public class ClientServiceImpl {
}

DefaultServiceLocator.java

java 复制代码
package com.atguigu.Ioc_01;

非静态工厂类
public class DefaultServiceLocator {
    public static ClientServiceImpl clientService = new ClientServiceImpl();

    public ClientServiceImpl createClientServiceInstance() {
        return clientService;
    }
}

resources目录下的 .xml文件

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">

    1、可以使用无参构造函数实例化的组件,如何进行Ioc配置呢?
            <bean - 一个组件信息(一个组件对象)
                    id:组件的标识,唯一
                    class:组件的类的权限定符

            配置了两个组件happyComponent1 和 happyComponent2,
            它们的类型都是com.atguigu.Ioc_01.HappyComponent,
            Spring容器会使用无参构造函数来创建这两个组件的实例,并将它们存储在IoC容器中,
            因为,默认是单例模式(singleton),即使声明了两次,
            Spring容器也只会创建一个HappyComponent的实例,
            但会为这两个bean引用提供相同的实例。

            当你从容器中获取这两个bean的引用时:
                HappyComponent happyComponent1 = context.getBean("happyComponent1", HappyComponent.class);
                HappyComponent happyComponent2 = context.getBean("happyComponent2", HappyComponent.class);
                happyComponent1、happyComponent2这两个引用实际上是指向同一个HappyComponent对象的,即它们的地址(内存中的引用)是相同的,
                这就是单例作用域的含义。
    <bean id="happyComponent1" class="com.atguigu.Ioc_01.HappyComponent" />
    
    <bean id="happyComponent2" class="com.atguigu.Ioc_01.HappyComponent" />


    2、静态工厂类,如何声明工厂方法进行Ioc配置?
         id = "组件的标识"
         class ="工厂类的权限定符"
         factory-method = "静态工厂方法"
         下面这个bean,意思是:
             调用"com.atguigu.Ioc_01.ClientService"这个工厂类的"clientService"方法,
             将它造出的组件对象,存储到Ioc容器,叫clientService(id等于的那个值)

		 配置了一个名为clientService的组件,它并不直接通过类的构造函数来实例化,
		    而是,通过调用com.atguigu.Ioc_01.ClientService类的静态方法clientService来创建实例,
		    factory-method属性用于指定用于创建组件实例的静态工厂方法。
    <bean id="clientService" class="com.atguigu.Ioc_01.ClientService" factory-method="clientService" />


   3、非静态工厂,如何声明Ioc配置?
        配置了一个非静态工厂defaultServiceLocator,它本身也是一个bean,由Spring容器管理,
        然后,通过factory-bean属性指定了非静态工厂bean的id,
        并且,通过factory-method属性指定了用于创建组件实例的非静态工厂方法createClientServiceInstance,
        所以,Spring容器会首先创建defaultServiceLocator的实例,然后调用其createClientServiceInstance方法来创建clientService2组件的实例
    
    步骤1、配置工厂类的组件信息
    <bean id="defaultServiceLocator" class="com.atguigu.Ioc_01.DefaultServiceLocator" />
    步骤2、通过指定非静态工厂对象和方法名,来配置生成Ioc信息
            也就是:根据工厂对象的实例工厂方法,进行实例化组件对象。
    <bean id="clientService2" factory-bean="defaultServiceLocator" factory-method="createClientServiceInstance" />

</beans>
相关推荐
王景程9 分钟前
如何测试短信接口
java·服务器·前端
zhang23839061541 小时前
IDEA add gitlab account 提示
java·gitlab·intellij-idea·idea
牛马baby1 小时前
Java高频面试之并发编程-07
java·开发语言·面试
卓怡学长2 小时前
w304基于HTML5的民谣网站的设计与实现
java·前端·数据库·spring boot·spring·html5
YONG823_API2 小时前
深度探究获取淘宝商品数据的途径|API接口|批量自动化采集商品数据
java·前端·自动化
yzhSWJ2 小时前
Spring Boot中自定义404异常处理问题学习笔记
java·javascript
盖世英雄酱581362 小时前
分布式ID所有生成方案
java·后端
敖云岚2 小时前
【AI】SpringAI 第五弹:接入千帆大模型
java·大数据·人工智能·spring boot·后端
桦说编程3 小时前
CompletableFuture典型错误 -- 代码出自某大厂
java·后端·响应式编程