px111.net:深度明白SpringIOC,面试你基本不需要慌!

admin 3个月前 (07-13) 科技 44 0

文章已托管到GitHub,人人可以去GitHub查看阅读,迎接老板们前来Star! 搜索关注微信民众号 码出Offer 领取种种学习资料!

深度明白Spring IOC(控制反转)

一、IOC概述

Inverse Of Controll即为控制反转,简称IOC

简朴来说,IOC反转了依赖关系的知足方式,由之前的自己建立依赖工具,变为由工厂推送。(变自动为被动,即反转)它解决了具有依赖关系的组件之间的强耦合,使得项目形态加倍稳健

二、什么是IOC?

2.1 领会IOC头脑

也许领会了IOC是控制反转,至于现在我们并不清晰它的头脑和作用。那么问题来了,IOC(控制反转)是什么呢?

控制反转,简称IOC。顾名思义,它是由“控制”和“反转”两个词语组合而成。那么我们就顺藤摸瓜,划分剖析一下这两个词语!

2.2 控制

控制一词,我们需要想的就许多。好比说,杀青控制的条件必须是两个工具 ,控制可以分为谁控制谁控制你做什么 。那我们一一枚举这几种情形:

  1. 在Java中我们以new的方式建立工具,开发者控制控制着开发工具并间接的控制程序建立所需要的依赖工具,对于程序来说是直接的控制建立工具;若是使用IOC呢?那就可以是IOC容器直接的控制建立工具
  2. 既然是IOC控制建立工具,那么控制建立工具是怎么控制的呢?使用IOC建立工具是需要标签引入外部工具,这说明了IOC容器控制着建立依赖工具的入口

2.3 反转

反转一词,我们想的也许多。好比说,杀青反转的条件必须是两个工具有反转就有正转 ,然后就是反转了些什么 。那么我们也一一枚举说明:

  1. 在Java中我们是间接的实用程序来建立工具,这可以看作正转。那有了IOC容器,一下子就变了,我们不用自己new工具,而是直接反转为由IOC建立天生依赖工具并存入IOC容器中
  2. 使用IOC容器建立工具我们只需要通过设置来告诉它需要建立的工具是什么,并标识一下以后使用什么来获取IOC容器中建立好的工具即可(设置使用IOC的历程),这时刻等你想要IOC容器中工具就直接用这个唯一标识来获取就好,而获取的历程肯定是IOC通过这个唯一标识来查找并返回给我们该工具
  3. 也许有的小伙伴照样不明白反转。为什么要把IOC容器帮我们建立工具的行为叫反转呢?因为由容器帮我们查找及注入依赖工具,工具只是被动的接受依赖工具。若是不反转呢?开发者就需要建立工具,并找到、获取、使用该工具,此历程中的所有都有开发者来控制的

三、IOC的作用

通过控制反转,工具在被建立的时刻,由一个调控系统内所有工具的外界实体将其所依赖的工具的引用通报给它。也可以说,依赖被注入到工具中。

好比:Class A中用到了Class B的工具b,一样平常情形下,需要在A的代码中显式的new一个B的工具。

在使用了IOC之后呢?A的代码只需要界说一个私有的B工具,不需要直接new来获得这个工具,而是通过相关的容器控制程序来将B工具在外部new出来并注入到A类里的引用中。而详细获取的方式、工具被获取时的状态由设置文件(xml)来指定

既然由设置文件来指定建立工具关系,就大大降低了各个组件之间的强耦合并有利于维护,是项目变得加倍稳健天真

四、IOC解决Dao层和Service层的强耦合

在原始的Web开发中,Dao层和Service层是密不可分的。Dao层为数据接见层,只与数据库打交道。Servcie层为营业处置层,只处置实现响应的营业。而我们将Web开发中的Dao层和Service层串在一起,就需要在Service层new一个私有的Dao层实现工具(XxxDaoImpl)。有了IOC的头脑,再想想传统的Dao层与Service层的实现就显得很不天真,一旦修改了Dao层实现类,就必须将项目中的源码都修改掉,显然是一件异常恐怖的事情。

五、使用IOC解决Dao层和Service层的强耦合

既然解决Dao层和Service层的强耦合那必须得这两个组件对吧。

Dao层

// Dao层接口
package com.mylifes1110.dao;

import com.mylifes1110.bean.User;

public interface UserDao {
    int insertUser(User user);
}

// Dao层实现类
package com.mylifes1110.dao.impl;

import com.mylifes1110.bean.User;
import com.mylifes1110.dao.UserDao;

public class UserDaoImpl implements UserDao {

    @Override
    public int insertUser(User user) {
        System.out.println("------insertUser and UserDao------");
        return 0;
    }
}

注重: 我们在使用IOC时,必须将Dao层实现类工具注入到IOC容器中,这必有一个注入方式来见告IOC容器建立工具和获取工具,在Service层我们并不需要new实现类工具,而是建立一个Service层的Setter方式来注入UserDaoImpl依赖到UserServcieImpl中(这里可以把它们想为拼装),此时所用的注入方式叫做Setter方式依赖注入,现在不需要纠结,后续我会将依赖注入的所有方式枚举并剖析依赖注入头脑和依赖注入与IOC的关系。

Service层

// Service层接口
package com.mylifes1110.service;

import com.mylifes1110.bean.User;

public interface UserService {
    int insertUser(User user);
}

// Service层实现类
package com.mylifes1110.service.impl;

import com.mylifes1110.bean.User;
import com.mylifes1110.dao.UserDao;
import com.mylifes1110.service.UserService;

public class UserServiceImpl implements UserService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public int insertUser(User user) {
        System.out.println("------insertUser and UserService------");
        return userDao.insertUser(null);
    }
}

spring-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/beans/spring-context.xsd"
>

    <!--id:唯一标识 class:需要被建立的目的工具全限命名-->
    <bean id
="UserDao" class="com.mylifes1110.dao.impl.UserDaoImpl"/>

    <!--id:唯一标识 class:需要被建立的目的工具全限命名-->
    <bean id
="UserService" class="com.mylifes1110.service.impl.UserServiceImpl">
        <!--Setter方式依赖注入 name:Service层界说的userDao属性 ref:Dao层bean标签唯一标识-->
        <property name="userDao" ref="UserDao"/>
    </bean>

</beans>

测试类

/**
@MethodName insertUser1
@Param []
@Description 测试IOC的使用
@Author Ziph
@Date 2020/7/12
*/

@Test
public void insertUser1() {
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
    UserService userService = (UserService) context.getBean("UserService");
    userService.insertUser(null);
    // 打印效果
    ------insertUser and UserService------
    ------insertUser and UserDao------
}
在这里插入图片形貌,

allbet网址

欢迎进入欧博开户网址(Allbet Gaming):www.aLLbetgame.us,allbet网址开放allbet网址、allbet会员注册、代理开户、电脑客户端下载、苹果安卓下载等业务。

allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:px111.net:深度明白SpringIOC,面试你基本不需要慌!

网友评论

  • (*)

最新评论

站点信息

  • 文章总数:673
  • 页面总数:0
  • 分类总数:8
  • 标签总数:991
  • 评论总数:303
  • 浏览总数:13679