Spring 学习(一) 控制反转(IOC)

本系列文章为狂神说 Java 视频的课堂笔记,若有需要可配套视频学习。

1.Spring 简介

  • Spring 框架以 interface 21 框架为基础,于 2004 年 3 月 24 日,发布了 1.0 正式版。

  • Rod Johnson 是 Spring Framework 创始人,他在悉尼大学不仅获得了计算机学位,同时还获得了音乐学位, 回到软件开发领域之前,他还获得了音乐学的博士学位。

  • Spring 理念:整合了现有的技术框架,使现有的技术更加容易使用。

    • SSH:Struct 2 + Spring + Hibernate
    • SSM:SpringMVC + Spring + Mybatis
  • 下载地址

  • 优点

    • Spring 是一个开源免费的框架(容器)。
    • Spring 是一个轻量级、非入侵式(不影响原来的代码)的框架。
    • 总结一句话:Spring 就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架!
  • 组成
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-it1cfQ7A-1617888342981)(E:\Program Files\Typora\files\Spring学习\image\Spring组成.png)]

2. IOC 理论推导

2.1 早期业务逻辑实现

  • dao 层(模型层)

    • UserDao.interface

      public interface UserDao {
          void getUser();
      }
      
    • UserDaoImpl.class

      //默认实现类
      public class UserDaoImpl implements UserDao {
          public void getUser(){
              System.out.println("默认获取用户的数据");
          }
      }
      
    • UserDaoMysqlImpl.class

      //Mysql实现类
      public class UserDaoMysqlImpl implements UserDao {
          public void getUser() {
              System.out.println("Mysql获取用户的数据");
          }
      }
      
  • service 层(业务实现层)

    • UserService.interface

      public interface UserService {
          void getUser();
      }
      
    • UserServiceImpl.class

      public class UserServiceImpl implements UserService {
          private UserDao userDao = new UserDaoImpl();
          public void getUser() {
              userDao.getUser();
          }
      }
      
  • user 层(用户层)

    public static void main(String[] args) {
        //用户实际调用的是业务层,Dao层不需要接触
        UserService userService = new UserServiceImpl();
        userService.getUser();
    }
    
  • 以上示例中 user 层只能调用 UserDaoImpl.class ,因为 UserServiceImpl.class 中将 userDao 固定(new)为了 UserDaoImpl 类。

  • 如果想调用 UserDaoMysqlImpl.class ,需将 UserServiceImpl.class 中的 userDao 固定(new)为 UserDaoMysqlImpl 类。

  • 如上所示,早期业务实现,需求的改变会导致源码的改动。若代码量庞大,修改的成本很高。

2.2 业务模式修改

  • UserServiceImpl.class 中实现set接口

    private UserDao userDao;
    //利用set方法进行动态实现值得注入!
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    
  • 在用户层进行如下调用

    ((UserServiceImpl) userService).setUserDao(new UserDaoImpl());
    ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl());
    
  • 思维转变

    • 早期业务逻辑,程序是在业务实现层主动创建对象,主动权在程序员手上,需要程序员修改业务实现层的代码。
    • 使用了 set 注入后,程序不再具有主动性,而是变成了被动的接收对象。主动权在用户,由用户在用户层直接创建相应对象即可。
  • 这种思想,从本质上解决了问题,程序员不用再去管理对象的创建。系统的耦合性大大降低,可以更加专注的在业务的实现上。这是 IOC的 原形。

  • 控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是 Ioc 容器,其实现方法是依赖注入(Dependency Injection,DI)。

2.3 IOC 实现

  • 创建 Maven 项目

  • resources\beans.xml (配置文件)

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!--
            用 Spring 创建对象,Spring 中都称为 Bean
    
            类型 变量名 = new 类型();
            Hello hello = new Hello();
    
            id:变量名  class:类型全路径  property:对象属性赋值
        -->
        <bean id="imp" class="com.why.dao.UserDaoImpl"/>
        <bean id="sqlImpl" class="com.why.dao.UserDaoMysqlImpl"/>
        <bean id="userServiceImpl" class="com.why.service.UserServiceImpl">
            <!--
                value: 赋具体的值
                ref: 引用 Spring 容器中创建好的的对象
            -->
            <property name="userDao" ref="sqlImpl"/>
        </bean>
    </beans>
    
  • dao 层保持不变

  • service 层保持不变

  • user 层

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        UserServiceImpl userServiceImpl = (UserServiceImpl) context.getBean("userServiceImpl");
      	//调用 Mysql 业务实现
        userServiceImpl.getUser();
    }
    
  • 如上所示,需求的改动将不会对源码造成影响,只需在 .xml 文件中更改配置即可。比如,要调用默认业务实现,只需将 .xml 文件中的 <property name="userDao" ref="userDaoMysqlImpl"/>ref 属性更改为 userDaoImp 即可。

  • 值得注意的是,依赖注入是基于 set 方法实现的,也就是说使用 Spring 给对象属性赋值,对象的类中必须含有 set 方法。

  • 总的来说,IOC 就是对象由 Spring 创建、管理和装配。

3. Spring 常用配置

  • alias(别名):给配置好的对象取个别名,获取对象时可使用此别名获取。

    <alias name="user" alias="userNew"/>
    
  • bean

    • id : bean 的唯一标识符,相当于对象名。
    • class : bean 对象所对应的全限定名(包名 + 类名)。
    • name : 为 id 取别名,可取多个,使用 ,空格; 等常用分隔符隔开。
  • import :合并其他配置文件,便于管理。

    • applicationContext.xml (总配置文件)

      <import resource="beans1.xml"/>
      <import resource="beans2.xml"/>
      ...
      

4. 参考资料

[1] 佚名. Core Technologies[EB/OL]. https://docs.spring.io/spring-framework/docs/current/reference/html/core.html, ???-??-??/2021-04-08.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值