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>
相关推荐
稚辉君.MCA_P8_Java11 分钟前
豆包 Java的23种设计模式
java·linux·jvm·设计模式·kubernetes
tanyongxi6612 分钟前
C++ 特殊类设计与单例模式解析
java·开发语言·数据结构·c++·算法·单例模式
遗憾皆是温柔14 分钟前
24. 什么是不可变对象,好处是什么
java·开发语言·面试·学习方法
midsummer_woo20 分钟前
基于springboot的IT技术交流和分享平台的设计与实现(源码+论文)
java·spring boot·后端
Peter(阿斯拉)31 分钟前
[Java性能优化]_[时间优化]_[字符串拼接的多种方法性能分析]
java·性能优化·stringbuilder·string·字符串拼接·stringbuffer·时间优化
qq_三哥啊1 小时前
【IDEA】设置Debug调试时调试器不进入特定类(Spring框架、Mybatis框架)
spring·intellij-idea·mybatis
水痕012 小时前
gin结合minio来做文件存储
java·eureka·gin
别惹CC2 小时前
Spring AI 进阶之路01:三步将 AI 整合进 Spring Boot
人工智能·spring boot·spring
寒士obj2 小时前
Spring事物
java·spring
柯南二号3 小时前
【Java后端】Spring Boot 集成 MyBatis-Plus 全攻略
java·spring boot·mybatis