模拟Spring-Ioc容器创建对象

SpringIoc

  • 控制反转:将对象创建工作交给spring容器去做,没有spring之前都是程序员new对象,这就是控制反转
  • 优点:降低耦合

模拟

  • 目标:处理service业务
  • 这里会用到Dom4j去解析xml配置文件,中间有些方法不了解没有关系,把握大体思路,主要是为了理解是spring容器是怎么创建对象的。
  1. 实体类MageBean:表示从xml文件解析出来的bean,存储bean的配置信息
package com.ysjt.bean;

/**
 * 存放配置信息
 */
public class MageBean {
    private String id;
    private String clazz;

    public MageBean() {
    }

    public MageBean(String id, String clazz) {
        this.id = id;
        this.clazz = clazz;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getClazz() {
        return clazz;
    }

    public void setClazz(String clazz) {
        this.clazz = clazz;
    }
}

2.业务类HelloService:简单的模拟业务,打印一句话即可

package com.ysjt.service;

public class HelloService {
    public void printHello(){
        System.out.println("Hello spring");
    }
}

3.application.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean class="com.ysjt.service.HelloService" id="helloService"></bean>
</beans>

4.BeanFactory接口:模拟spring中的BeanFactory

package com.ysjt.bean;

/**
 * 模拟spring的BeanFactory类
 */
public interface BeanFactory {

    Object getBean(String id);
}

5.MageApplicationContext类:对xml配置文件进行解析,创建bean对象

package com.ysjt.bean;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.util.CollectionUtils;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 模拟spring的ClassPathXmlApplicationContext类
 */
public class MageApplicationContext implements BeanFactory {

    //配置文件路径
    private String configLocation;
    //存储配置文件信息
    List<MageBean> mageBeanList = new ArrayList<>();
    //存储bean对象集合
    Map<String,Object> beans = new HashMap<>();

    public MageApplicationContext() {
    }

    //容器一启动就加载配置文件,创建好bean对象
    public MageApplicationContext(String configLocation) {
        this.configLocation = configLocation;
        //解析配置文件
        parseConfigLocation();
        //生成bean对象
        generatorBean();
    }

    //解析配置文件
    private void parseConfigLocation(){
        //获取项目配置文件
        URL url = this.getClass().getClassLoader().getResource(configLocation);
        if(url == null){
            System.out.println("资源不存在");
            return;
        }

        //解析配置文件
        SAXReader saxReader = new SAXReader();
        try{
            //读取xml文件,获取document对象
            Document document = saxReader.read(url);
            List<Element> elements = document.selectNodes("/beans/bean");
            //循环遍历将配置文件信息添加到mageBeanList集合
            elements.forEach(e->{
                String id = e.attributeValue("id");
                String clazz = e.attributeValue("class");
                //测试解析是否成功
//                System.out.println(id+":"+clazz);
                MageBean mageBean = new MageBean(id,clazz);
                mageBeanList.add(mageBean);
            });

        }catch (DocumentException e){
            e.printStackTrace();
        }


    }

    //生成bean对象
    private void generatorBean(){
        //配置文件是否有bean对象待创建
        if(CollectionUtils.isEmpty(mageBeanList))
            return;
        mageBeanList.forEach(bean->{
            try{
                //反射创建对象,
                beans.put(bean.getId(),Class.forName(bean.getClazz()).newInstance());
            }catch (Exception e){
                e.printStackTrace();
            }
        });
    }
    @Override
    public Object getBean(String id) {
        return beans.get(id);
    }
}

6.测试

package com.ysjt.test;

import com.ysjt.bean.BeanFactory;
import com.ysjt.bean.MageApplicationContext;
import com.ysjt.service.HelloService;

public class MockContainerTest {
    public static void main(String[] args) {
        BeanFactory context = new MageApplicationContext("application.xml");
        HelloService helloService = (HelloService) context.getBean("helloService");
        helloService.printHello();

    }
}

模拟环境

依赖jar:

dom4j-1.6.1.jar
jaxen-1.1.6.jar
spring-aop-5.2.1.RELEASE.jar
spring-beans-5.2.1.RELEASE.jar
spring-context-5.2.1.RELEASE.jar
spring-context-support-5.2.1.RELEASE.jar
spring-core-5.2.1.RELEASE.jar
spring-expression-5.2.1.RELEASE.jar
spring-jcl-5.2.1.RELEASE.jar
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spring IOC (Inversion of Control) 是 Spring 框架中的一个核心功能,它通过依赖注入 (Dependency Injection, DI) 的方式在运行时动态地将对象的依赖关系注入到对象中。这样做的好处是可以使得对象之间的依赖关系更加灵活,且对象的创建和使用变得更加简单。 具体来说,Spring IOC 容器会管理所有的对象,并在运行时根据配置的信息将这些对象的依赖关系注入到对象中。这些对象被称为 Spring Beans,Spring IOC 容器负责创建、配置和管理这些 Spring Beans。 使用 Spring IOC 可以使程序更加灵活,因为对象之间的依赖关系可以在运行时动态地注入,而不是在编译时确定。这样可以使得程序更加灵活,可以更好地应对变化。 总的来说,Spring IOC 是一种设计模式,用于管理对象之间的依赖关系,使得对象之间的耦合度降低,使程序变得更加灵活。 ### 回答2: Spring IOCSpring 框架的核心特性之一,全称为控制反转(Inversion of Control)。 IOC 是一种设计模式,它将程序的控制权从应用程序自身转移到了框架上,由框架来控制应用程序的对象创建和管理。传统的开发方式是通过代码来直接创建对象并管理依赖关系,而 IOC 则将这部分控制权交给了框架。 在 Spring 中,IOC 容器扮演着重要的角色,它负责初始化对象、管理对象之间的依赖关系,并在应用程序运行期间进行对象的生命周期管理。通过配置文件或注解的方式,开发者只需描述需要的对象以及对象之间的依赖关系,而无需手动去实例化和管理对象。 使用 Spring IOC 的好处主要有三个方面: 1. 开发效率提高:由于 IOC 容器负责对象的创建和管理,开发者只需要关注对象的逻辑实现,无需关心对象的创建和销毁,大大提高了开发效率。 2. 代码解耦:IOC 的设计思想强调松耦合,对象之间的依赖关系通过配置文件或注解来描述,减少了代码间的硬编码,便于维护和扩展。 3. 更好的测试性:由于对象的创建和管理交给了容器,开发者可以使用模拟对象进行单元测试,而不需要依赖真实的对象,提高了测试的灵活性。 总而言之,Spring IOC 是一种基于控制反转的设计模式,将对象的创建和管理交给了框架,提高了开发效率、代码解耦和测试的灵活性。 ### 回答3: SpringIOC(Inversion of Control)是一种编程思想,也是Spring框架的核心特性之一。通过IOC,控制权由程序员转移到了Spring容器中,由容器负责对象的创建和管理。 在传统的开发模式中,对象的创建和管理都需要由程序员手动完成,而使用Spring IOC可以将这一任务交给Spring容器完成。程序员只需通过配置文件或注解来告诉Spring容器需要创建哪些对象,而具体的对象创建、依赖注入等工作都由容器自动完成。 Spring IOC的优势主要有以下几点: 1. 松耦合:通过IOC对象之间的依赖关系由容器来管理,提高了代码的灵活性和可维护性。 2. 可测试性:IOC可以通过依赖注入的方式来注入对象,方便进行单元测试。 3. 配置灵活:使用配置文件或注解可以灵活地配置对象的创建和依赖关系,可以方便地进行修改和扩展。 4. 容器管理:Spring容器可以管理对象的生命周期、作用域等,使得对象的创建和销毁更加方便和可控。 Spring IOC的实现方式有两种:XML配置和注解方式。在XML配置中,需要手动配置对象的创建和依赖关系;而在注解方式中,可以通过注解来自动配置对象的创建和依赖关系。 总而言之,Spring IOC是一种通过将对象的创建和管理交给容器来实现松耦合、可测试、配置灵活和容器管理的编程思想,大大提高了代码的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值