Spring——IOC基本原理

本文深入解析了IOC(Inversion of Control)与依赖注入(Dependency Injection)的概念,通过实例展示了如何利用工厂模式和反射机制减少对象间的耦合度,提高代码的可维护性和灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IOC的作用:如下图所示,我们在创建对象的时候利用new 创建一个实例,这是一种主动的方法,但是对象之间相互依赖,导致我们在一个实例发生变化需要对依赖他的对象进行修改,这样对象之间的耦合性大大提高,因此可以通过工厂的方法+反射来解决这个问题。
在这里插入图片描述
如下图所示,我们将创建对象的权限交给工厂,这样能够大大减小程序之间的耦合。
在这里插入图片描述
Ioc实现的基本原理(模拟):
首先我们需要理解Bean的概念, Bean是对象的工厂,Bean在计算机英语中有可重用组件的意思,JavaBean是用Java语言编写的可重用组件,javabean就是所创建的实体类,它是用来创建我们service和到对象的。
创建需要两步:
第一:编写配置文件来配置我们的service和dao
配置内容:唯一标示=全限定性类名
第二:读取配置文件中的配置内容,反射创建对象
我的配置文件可以使xml,也可以是properties
创建具体流程bean:

  • 1,工厂在静态方法区区读取XML的文件,利用getResourcesAsStream方法,可以搜索寻找文件,不用限定路径
  • 2,利用一个HashMap保存key:id ,value:权限定类名
  • 3,从工厂中利用getBean方法反射创建对象
  • 4,最后,我们得出的是一个Object对象,需要利用接口进行强制转化。
    具体代码如下所示:
public class BeanFactory {
    private static Properties properties;
    private static Map<String,Object> beans;
    static{
        //实例化对象
        properties = new Properties();
        //获取properties对象的流对象
        InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
        try {
            properties.load(in);
            beans = new HashMap<String,Object>();
            Enumeration keys = properties.keys();
            while(keys.hasMoreElements()){
                //获取每个key
                String key = keys.nextElement().toString();
                //根据key获去每个value
                String Path = properties.getProperty(key);
                //利用反射创建对象
                Object value = Class.forName(Path).getDeclaredConstructor().newInstance();
                //存入容器中
                beans.put(key,value);
                System.out.println(beans.get(key));
            }
        } catch (Exception e) {
            System.out.println("获取实例化失败");
            e.printStackTrace();
        }
    }
    public static Object getBean(String beanName){
        return beans.get(beanName);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值