前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring初学入门 如何降低耦合 Bean工厂模式创建对象 IoC简述(为什么叫做控制反转

Spring初学入门 如何降低耦合 Bean工厂模式创建对象 IoC简述(为什么叫做控制反转

原创
作者头像
韦恩少爷的背
修改2020-03-02 14:26:02
8300
修改2020-03-02 14:26:02
举报
文章被收录于专栏:SSM框架学习

Spring初学入门

Bean工厂模式创建对象 降低耦合

首先我来看个例子 我们需要实现一个saveAccount方法 按照以前的方法我们需要创建dao,创建service,创建serviceImpl 依赖性太强了

什么是耦合
代码语言:javascript
复制
		程序的耦合
 *      耦合:程序间的依赖关系
 *          包括:
 *              类之间的依赖
 *              方法间的依赖
 *      解耦:
 *          降低程序间的依赖关系
 *      实际开放钟:
 *          应该做到:编译期不依赖,运行时才依赖
 *      解耦的思路:
 *          第一步:使用反射来创建对象,而避免使用new关键字
 *          第二步:通过读取配置文件来获取要创建的对象全限定类名

我们可以创建bean工厂来降低依赖

什么是Bean

一个创建Bean对象的工厂

代码语言:javascript
复制
Bean:在计算机英语中,有可重用组件的含义。
JavaBean:用java语言编写的可重用组件。
		javabean > 实体类
它就是创建我们的service和dao对象的。
第一:需要一个配置文件来配置我们的service的dao
	 配置的内容:唯一标识=全限定类名(key=value)
第二个:通过读取配置文件中配置的内容,反射创建对象
	配置文件可以是xml也可以是properties

解耦思路
目前问题:程序间的依赖关系
	service依赖了一个具体的dao实现类
	ui依赖了一个具体service
解决办法:
	不用new,直接BeanFactory.getBean("在bean.properties中的名字")
	这时候如果少文件,不会是编译错误,只会是正常的运行异常
代码语言:javascript
复制
public class BeanFactory {
    //定义一个Properties
    private static Properties props;
    //定义一个Map,用于存放我们要创建的对象,我们把它称之为容器
    private static Map<String,Object> beans;
    //使用静态代码块为Properties对象赋值
    //该new还是得new
    static {
        try {
            props = new Properties();
            //获取properties文件的流对象
            /**
             * 不要写FileInputStream
             * 你不知道绝对路径
             * 相对路径src不能用 web工程一部署就没有src了
             * 自然绝对路径也不能用 不能保证工程都有C盘D盘
             * 要用BeanFactory.class.getResourceAsStream("")
             * 用类加载器 在resources下的文件会成为每个路径下的类文件(听不清楚 反正不用写任何包名
             */
            InputStream in = BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
            props.load(in);
            /**
             * 感觉上是把配置文件的key取出来,
             * 然后创建反射创建对象,
             * 然后将String类型的key和对象的地址保存到Map
             */
            //实例化容器
            beans=new HashMap<String, Object>();
            //取出配置文件中所有Key
            Enumeration keys=props.keys();
            //遍历枚举
            while (keys.hasMoreElements()){
                //取出每个Key
                String key = keys.nextElement().toString();
                //根据key获取value
                String beanPath=props.getProperty(key);
                //反射创建对象
                Object value = Class.forName(beanPath).newInstance();
                //把key和value存入容器中
                beans.put(key,value);
            }
        } catch (Exception e) {
            throw new ExceptionInInitializerError("初始化properties失败!");
        }
    }
    /**
     * 根据bean名称获取对象(单例
     * @param beanName
     * @return
     */
    //有了容器过后进行改造
    public static Object getBean(String beanName) {
        //得到的就是bean value
        return beans.get(beanName);

    }
工厂模式创建对象思路
代码语言:javascript
复制
1.用反射的方式来创建对象
2.得有能反射的全限定名
	通过读取配置文件的方式
静态代码块最上面反射得到这个对象就是bean.properties
整个过程就是工厂模式创建对象

IoC简述

Inversion of Control,缩写为IoC 这两行代码表现了截然不同的创建对象的方式

代码语言:javascript
复制
 		IAccountService as = new AccountServiceImpl();
        IAccountService as = (IAccountService) BeanFactory.getBean("accountService");

第一种

new的方式,如下图所示(主动的去找 APP直接与资源联系,这种必然的联系是消除不到的的。 这对于应用的独立很困难,有明显的依赖关系。

在这里插入图片描述
在这里插入图片描述

第二种

APP断开了和资源的联系,找工厂要资源,由工厂给资源取得联系,并把对象转到应用

这就是IoC
在这里插入图片描述
在这里插入图片描述

为什么叫控制反转而不是降低依赖呢

这个类有自己的选择权,到底是用new还是工厂 这个类来找它想要的dao时,完全可以new,但是

在这里插入图片描述
在这里插入图片描述

把这个权力交给了BeanFactory这个类,再通过一个固定的名称,找到想要的bean对象 但是这个bean是不是能用的对于这个类来说就不得而知了 因为工厂得到bean对象是根据这一段配置所对应的全限定类名来决定的 这个类无法独立的自主控制

回到语句本身

代码语言:javascript
复制
 		IAccountService as = new AccountServiceImpl();
        IAccountService as = (IAccountService) BeanFactory.getBean("accountService");

第一句是有独立的控制权的,想要谁要谁 而采取第二局,这种控制权转移,就叫做控制反转,降低了依赖,削减了计算机的耦合

标准IoC含义

在这里插入图片描述
在这里插入图片描述
Ioc作用:削减了计算机程序的耦合(减少代码中的依赖关系)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spring初学入门
    • Bean工厂模式创建对象 降低耦合
      • IoC简述
        • 第一种
        • 第二种
      • 为什么叫控制反转而不是降低依赖呢
        • 标准IoC含义
        相关产品与服务
        容器服务
        腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档