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>
相关推荐
Mryan200519 分钟前
SpringBoot项目报错: 缺少 Validation
java·spring boot
SnXJi_1 小时前
开源赋能,双驱协同:纷析云财务与进销存软件助力企业数字化转型
java·gitee·开源·开源软件
eternal__day1 小时前
第三期:深入理解 Spring Web MVC [特殊字符](数据传参+ 特殊字符处理 + 编码问题解析)
java·前端·spring·java-ee·mvc
iccb10131 小时前
在线聊天系统中的多窗口数据同步技术解密
java·github
逸狼2 小时前
【JavaEE进阶】MyBatis(5)-MyBatis-plus
java·开发语言
Aphelios3802 小时前
Java全栈面试宝典:线程协作与Spring Bean管理深度解析
java·开发语言·jvm·spring·面试·职场和发展
努力学习的小廉2 小时前
【C++11(中)】—— 我与C++的不解之缘(三十一)
android·java·c++
佬乔2 小时前
xml中配置AOP织入
java·服务器·前端
Eugene__Chen2 小时前
JavaWeb开发基础知识-XML和JSON
java·开发语言·前端
努力学习的小廉3 小时前
【C++11(上)】—— 我与C++的不解之缘(三十)
java·开发语言·c++