自制简易版SpringIOC

自制简易版SpringIOC,第1张

文章目录
  • 自制简易版SpringIOC
    • Spring简介
    • 无IOC存在问题
      • 案例搭建
      • 案例描述
    • IOC控制反转
      • 概述
    • 自制简易版IOC
      • 准备工作
      • 核心代码
      • 启动

自制简易版SpringIOC Spring简介

spring是一个开源框架,为了解决企业应用开发的复杂性而创建.是javaEE的开发框架,核心为**IOC控制反转,DI依赖注入,AOP面向切面,**还有一个优点是非常方便整合其他框架,无侵入的进行功能增强

无IOC存在问题 案例搭建

案例项目结构:

  1. 启动类
public class Demo {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        System.out.println(userService.findUserById(1));
    }
}

2.service接口

public interface UserService {
    User findUserById(int id);
    String findUserName(int id);
}

3.service实现类

public class UserServiceImpl implements UserService {
    UserDao userDao = new UserDaoImpl2();
    @Override
    public User findUserById(int id) {
        return  userDao.findUserById(1);
    }

    @Override
    public String findUserName(int id) {
        return userDao.findUserName(12);
    }
}

4.dao接口

public interface UserDao {
    User findUserById(int id);
    String findUserName(int id);
}

5.dao实现类

这里有两个实现类,来模拟后面业务逻辑发生改变

public class UserDaoImpl1 implements UserDao {
    @Override
    public User findUserById(int id) {
        return   new User(id,"springUser1");
    }

    @Override
    public String findUserName(int id) {
        return "spring1";
    }
}
public class UserDaoImpl2 implements UserDao {
    @Override
    public User findUserById(int id) {
        return   new User(id,"springUser2");
    }

    @Override
    public String findUserName(int id) {
        return "spring2";
    }
}
案例描述

当业务逻辑发生改变时Dao层的实现类由UserDaoImpl1变为了UserDaoImpl2,这时就需要在service层改变调用接口,useService与userDao有高耦合度,在实际项目中,其实有很多service层与Dao层有高耦合度,这时接口改变,导致调用接口也需要改变,耦合度过高导致项目改动较为复杂

spring可以巧妙的避免这种情况,也就是spring中的核心功能IOC

IOC控制反转 概述

使用A对象之前我们需要创建和封装对象,而引入现在这些创建和封装都交给Spring容器来帮我们解决,只需要去spring容器中查询需要使用的对象;这个过程A对象的创建和组装过程反转,所以为控制反转,IOC是面向对象编程中的一个设计原则,主要是降低了系统代码的耦合度

自制简易版IOC 准备工作

创建xml文件


<bean class="com.lsy.dao.impl.UserDaoImpl1" id="userDao">bean>
核心代码
public class ClassPathXmlApplicationContext {
    /*定义对象容器*/
    private static HashMap<String, Object> beanMap =  new HashMap<>();
    
    private String path;

    /*对象初始化*/
    public ClassPathXmlApplicationContext(String path) {
        this.path = path;
        load();
    }

    public void load() {
        try {
            String filePath =
                    ClassPathXmlApplicationContext
                            .class.getClassLoader()//获取类加载器
                            .getResource(path)//获取文件类名地址
                            .getPath();
            filePath = URLDecoder.decode(filePath, "utf-8");//设置文件名编码格式
            Document document = Jsoup.parse(new File(filePath),"utf-8");
            Elements beans = document.getElementsByTag("bean");
            if (beans!=null&&beans.size()>0){
                //遍历所有bean标签
                for (int i = 0; i < beans.size(); i++) {
                    Element element = beans.get(i);
                    String className = element.attr("class");
                    String id = element.attr("id");
                    /*通过全类名反射创建对象*/
                    Class<?> aClass = Class.forName(className);
                    Constructor<?> constructor = aClass.getConstructor();
                    Object o = constructor.newInstance();
                    //将创建的对象放入容器
                    beanMap.put(id,o);
                }
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    public Object getBean(String id){
        return beanMap.get(id);
    }
}
启动

成功创建对象,这样就可以解决耦合度过高问题,当接口发生改变时,只需改动xml配置文件

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/801065.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-07
下一篇 2022-05-07

发表评论

登录后才能评论

评论列表(0条)

保存