• Spring从入门到源码(一)


    Spring

    1、什么是框架?

    人话就是:方便干活,架子有了,直接拿来用就完事了。
    spring,springmvc,mybatis三大开框架

    2、架构的演变过程

    单一应用架构
    垂直应用架构
    分布式服务架构
    流动计算架构
    Doubou官网

    Spring官网

    官网地址:https://spring.io/projects/spring-framework#overview

    压缩包下载地址:https://repo.spring.io/release/org/springframework/spring/

    源码地址:https://github.com/spring-projects/spring-framework

    核心解释

    ​spring是一个IOCAOP的容器框架。
    ​IOC:控制反转
    AOP:面向切面编程
    容器:包含并管理应用对象的生命周期,就好比用桶装水一样,spring就是桶,而对象就是水

    为什么要引入IOC

    创建一个普通的java项目,完成下述功能

    UserDao.java

    package com.yao.dao;
    
    public interface UserDao {
        public void getUser();
    }
    

    UserDaoImpl.java

    package com.yao.dao.impl;
    
    import com.yao.dao.UserDao;
    
    public class UserDaoImpl  implements UserDao {
        @Override
        public void getUser() {
            System.out.println("获取用户数据");
        }
    }
    

    UserService.java

    package com.yao.service;
    
    public interface UserService {
        public void getUser();
    }
    
    

    UserServiceImpl.java

    package com.yao.service.impl;
    
    import com.yao.dao.UserDao;
    import com.yao.dao.impl.UserDaoImpl;
    import com.yao.dao.impl.UserDaoMysqlImpl;
    import com.yao.service.UserService;
    
    public class UserServiceImpl implements UserService {
    
        private UserDao userDao = new UserDaoImpl();
    
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }
    
    

    SpringDemoTest.java

    package com.yao.test;
    
    import com.yao.service.UserService;
    import com.yao.service.impl.UserServiceImpl;
    
    public class SpringDemoTest {
        public static void main(String[] args) {
           UserService service = new UserServiceImpl();
           service.getUser();
        }
    }
    
    

    在之前的代码编写过程中,我们都是这么完成我们的功能的,但是如果增加一个UserDao的实现类呢?

    UserDaoMysqlImpl.java

    package com.yao.dao.impl;
    
    import com.yao.dao.UserDao;
    
    public class UserDaoMysqlImpl implements UserDao {
        @Override
        public void getUser() {
            System.out.println("mysql");
        }
    }
    

    如果我们想要使用mysql的话,那么就必须要修改UserServiceImpl.java的代码:

    package com.yao.service.impl;
    
    import com.yao.dao.UserDao;
    import com.yao.dao.impl.UserDaoImpl;
    import com.yao.dao.impl.UserDaoMysqlImpl;
    import com.yao.service.UserService;
    
    public class UserServiceImpl implements UserService {
    
        private UserDao userDao = new UserDaoImpl();
    
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }
    
    

    但是如果我们再增加一个oracle的类呢?

    UserDaoOracleImpl.java

    package com.yao.dao.impl;
    
    import com.yao.dao.UserDao;
    
    public class UserDaoOracleImpl implements UserDao {
        @Override
        public void getUser() {
            System.out.println("oracle");
        }
    }
    

    此时UserService还是要继续修改,很显然这样的方式已经不适用于我们的需求了,那么怎么解决呢,可以使用如下的方式

    UserServiceImpl.java

    package com.yao.service.impl;
    
    import com.yao.dao.UserDao;
    import com.yao.dao.impl.UserDaoImpl;
    import com.yao.service.UserService;
    
    public class UserServiceImpl implements UserService {
        private UserDao userDao;
    
        public void setUserDao(UserDao userDao){
            this.userDao = userDao;
        }
        @Override
        public void getUser() {
            userDao.getUser();
        }
    }
    
    

    测试类SpringDemoTest.java

    package com.yao.test;
    
    import com.yao.dao.impl.UserDaoMysqlImpl;
    import com.yao.dao.impl.UserDaoOracleImpl;
    import com.yao.service.UserService;
    import com.yao.service.impl.UserServiceImpl;
    
    public class SpringDemoTest {
        public static void main(String[] args) {
            UserServiceImpl userService = new UserServiceImpl();
            userService.setUserDao(new UserDaoMysqlImpl());
            userService.getUser();
    
            userService.setUserDao(new UserDaoOracleImpl());
            userService.getUser();
        }
    }
    

    其实从刚刚的代码中,大家应该能体会解耦的重要性了,下面我们就开始学习Spring的IOC。

    面试总结

    想要搞明白IOC,那么需要搞清楚如下几个问题:

    1、谁控制谁
    2、控制什么
    3、什么是反转
    4、哪些方面被反转

    Answer

    1、谁控制谁:在之前的编码过程中,都是需要什么对象自己去创建什么对象,有程序员自己来控制对象,而有了IOC容器之后,就会变成由IOC容器来控制对象,
    2、控制什么:在实现过程中所需要的对象及需要依赖的对象
    3、什么是反转:在没有IOC容器之前我们都是在对象中主动去创建依赖的对象,这是正转的,而有了IOC之后,依赖的对象直接由IOC容器创建后注入到对象中,由主动创建变成了被动接受,这是反转
    4、哪些方面被反转:依赖的对象
    

    DI

    很多人把IOC和DI说成一个东西,笼统来说的话是没有问题的,但是本质上还是有所区别的,希望大家能够严谨一点,IOC和DI是从不同的角度描述的同一件事,IOC是从容器的角度描述,而DI是从应用程序的角度来描述,也可以这样说,**IOC是设计思想,而DI是具体的实现方式。**
    
  • 相关阅读:
    哈密顿绕行世界问题 (dfs)
    山东省第八届ACM大学生程序设计竞赛
    HDU
    HDU
    hdu 1241(DFS/BFS)
    centos7 df 命令卡死
    hosts文件修改之后立刻刷新
    shell脚本打印日期时间
    CentOS6设置php-fpm开机自启动
    Word中怎么设置忽略拼写和语法检查提醒
  • 原文地址:https://www.cnblogs.com/yaozhenhua/p/15831592.html
Copyright © 2020-2023  润新知