Spring框架解析01——什么是控制反转与依赖注入

Spirng框架解析01

前言:Spring框架是什么?
Spring框架是一个轻量级的企业级开发的一站式解决方案!

1、控制反转(Inversion of Contorl -IoC)

1.1IoC的概念

啥叫IoC?干哈的啊?博主当年面试经常会被面试官这么问!今天我们就好好唠唠啥是IoC!

IoC:控制反转,在Spring框架中指的是将对象的创建权移交给容器(ApplicationContext容器)。重点:容器来负责创建对象和维护对象之前的依赖关系,而不是对象本身进行自己的创建和依赖。

说白了就是以前是对象自己管自己,现在是交给了一个叫做(ApplicationContext)的容器来统一管理。

小伙伴们是不是疑惑了!为啥要这么干了不是吃饱撑着吗?自己管自己不就好了吗?干嘛设计个容器来管理全部的了?放心,前辈们这么设计肯定是有意义的!

1.2 IoC的意义

实际上,对象管理自己的时候通过 new一下就好了,但是为什么Spring还要用容器管理了!原因是需要将复杂的类关系进行解耦!众所周知JAVA是单继承的语言,所以在扩展类的时候其实是很麻烦的一件事情。因此,Spring框架就通过依赖注入的方式和控制反转相结合的方式将不同的类(Spring将这些被ApplicationContext控制的类称之为Bean)进行组合,这个意味着不需要继承某个类或者实现其他接口就能够拥有其他类的方法或者是属性。

举个栗子:
男人类继承自人类,那么男人类就可以拥有人类的属性和行为了 。
但是如果你不想男人类继承人类也同样拥有人类的属性和行为,那么你就可以通过依赖注入的方式将人类定义在男人类的类里面,这样你可以在不继承人类的基础上拥有了人类的属性和方法。

1.3IoC的实现

控制反转的实现是通过 AppliactionContext这个容器实现的,具体的代码实现等等和依赖注入截图展示。此处不做过多说明!

2、依赖注入 (Dependency injection -DI)

2.1DI是含义

依赖注入的含义指的是将一个A类申明到一个目标B类中去,然后目标B类中就有了A类的方法和属性,这个的好处就是现实了父子类之间的解耦,不需要进行继承,B类便有了A类的方法。简单来说依赖注入=将一个类放到另一个类里面。

2.2 DI的意义

DI在Spring中是实现IoC的一个具体方式,通过依赖注入进行控制反转。意义就是解耦,体现的是一种“组合”的理念!在Spring中控制反转的意义和DI的意义我觉得应该是一致的就是降低类与类之间的耦合性!

3、IoC和DI的代码实现

3.1IoC中的注解

Spring中是通过ApplicationContext容器将类进行Bean控制,这个意味着就是将类变成一个Bean然后进行注册!首先,我们第一个要干的就是将我们的类变成一个Bean。然后通过容器将Bean(类)注入到其他你需要的Bean中去!随带提一下,Spring提供使用xml、注解、JAVA配置、groovy配置实现Bean的创建和注入。
无论是xml配置、注解配置还是Java配置,我们都称之为配置元数据,所谓元数据就是指解释数据的数据。
这里我们需要用到Spring中的几个注解 .(用来申明Bean的注解

@Component 组件,没有明确的角色
@Service 在service层使用 (业务逻辑层)
@Controller 在展示层用 (MVC->Spring MVC)使用
@Repository 在数据访问层(dao层)使用

接下来是注入Bean的注解 ,一般情况下通用。

  • @Autowired spring提供的 ,自动注入注解(常用)
  • @Resource: JSR-250 提供的注解(较为常用 )
  • @Inject: JSR-330 提供的注解 (博主未使用过)

3.2IoC和DI的代码实现

接下来我们将通过上面的注解来实现ApplicationContext容器如何来初始化Bean,并且注入到其他Bean中。我们即将使用的容器是 AnnotationConfigApplicationContext,言下之意就是通过注解配置的上下文应用!

示例:

  1. 创建MAVEN项目,并放入Spring框架的依赖包。
    在这里插入图片描述
    博主用的是IDEA开发,然后创建的是MAVEN项目 。需要实现的是创建一个Maven控制的项目。
    接着,放入Spring的依赖包.
    在这里插入图片描述
    创建好项目后我们进行Bean的编写。
  2. 创建两个个Bean (UserService,和UserServiceController)!
    目标: 我们将UserService业务层注入到UserServiceController 展示层。
    代码实现

(1)、userService代码实现。

package com.demo05.service;
import org.springframework.stereotype.Service;
//将这个userService注册为Bean,实际上 这个注解组合了Component 有兴趣的小伙伴可以点击进去瞧一瞧
@Service
public class userService {
    //这里写一个方法和属性
    public String say(String word){
        return "这是userService的方法"+ word;
    }
}

(2)、userServiceController代码实现

package com.demo05.controller;

import com.demo05.service.userService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

@Controller
//注册成展示层bean,其实在我们这个例子中你用service,
// 用controller,component,都差不都反正底层都是component有疑问可以自己点注解进去瞧一瞧
public class userServiceController {
    //将service注入到此处来。 这就是所谓的依赖注入 ,就是在另一个类里面搞一个类放进来,但是我们	不用new让容器 去把类初始化,然后塞进去。
    @Autowired
    private userService userservice;
    public String sayHello(String ss){
        //这里 ,就可以体现出我们没有创建service类,并且也没有继承service类,但是我们能够使用他的方法。
        return userservice.say(ss);
    }
}

  1. 创建Config类(用来代替xml配置文件)。
package com.demo05.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

//首先第一步申明这个类是一个 配置类。左右就是相当于xml。
@Configuration
//这个扫描器是用来扫描的,扫描我们目标包下面的被申明为bean的 类 ,然后交给applicationcontext进行控制。
@ComponentScan("com.demo05")
public class userServiceConfig {
    //这个里面也可以配置当是了 ,我现在没有用那种设置的方式,嗯,这个可以研究一下
    //因为?@Bean 注解可以 使用的 。
}

  1. 初始化Application容器。
    Application容器用的是AnnotationConfigApplicationContext容器!

import com.demo05.config.userServiceConfig;
import com.demo05.controller.userServiceController;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class text {
   public static void main(String[] args){
       //第一步创建一个 annotationconfigapplication容器 ,把配置类丢进去
       AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(userServiceConfig.class);
       //然后了 这个时候我们要获取到容器里面的 bean集合里面的 userServiceConfig。
       //这样我们就获得到了 userServcieConfig的 类了
       userServiceController userservicecontroller = applicationContext.getBean(userServiceController.class);
       //然后调用方法,看能不能用到了userservice的方法。
       String s= userservicecontroller.sayHello("这是userController的方法");
       System.out.print(s);
   }
}

  1. 配置好以后的效果图
    在这里插入图片描述
  2. 测试是否成功。

我们启动测试类,需要得到的结果是:(我们能够通过容器获取到 userServiceController这个类,同时我们使用userServiceController能够使用到userService类中的方法)。
1、通过ApplicationContext是否得到了一个被创建好的userServiceController这个类。
2、通过userServiceController类是否能够调用到userService中的方法。

在这里插入图片描述
7. 测试总结
通过截图我们不难看出,我们可以通过applicationcontext来获取的 userServiceController类,证实了 我们是通过容器来创建类,而不用去new一个类!同时可以通过容器来进行调用类。
其次,我们可以通过userServiceController进行调用userService的类中的方法证明了依赖注入的思想。就是通过组合来扩展类的方法和属性。这是Spring框架的一个非常核心的理念。我们日常开发也常用这些注解,小伙伴们可以进行测试理解!

4、结论

Spring框架的核心理念是IoC,DI以及AOP.IoC,是控制反转,将创建类,使用类的权限交给ApplicationContext(容器).DI,是依赖注入,理念就是通过组合代替继承。
理解好这些概念,对我们进行代码的开发非常有帮助,能够写出更加层次清晰,逻辑清楚的代码。也就是健壮性啊,稳定性啊啥啥啥的~ 在我这里就是出现BUG少,可扩展能力强!

ps:一些写在结尾的话

自从去年在srm部门进行开发后,我用java语言写代码能力就一直在下降。虽说所有语言都只是工具,但是工具也有喜欢和不喜欢用的!接下来,我将在原部门进行SpringCloud的开发。因此,我决定好好沉淀一下自己对JAVA开发框架的理解。第一步就是Spring框架的学习,这是目前企业级主流框架,希望能通过梳理这些主流框架,来理解大佬们的设计思想和理念。后续,我会继续这些主流框架的分析例如SpirngBoot|SpringCloud等等…希望有小伙伴们可以一起交流,一起探讨,本文内容只是博主的拙见,有不足或者错误之处还请给位大佬指出~一起加油!

还有,前两天看到一篇博客,博客上说:如果自己只把自己当成码农,自己都看不起自己的行业那么你就真的只是一个码农,但是如果你觉得你尊重你的行业那么你就是一个可以成为大佬的程序员! 我觉得挺有道理的,因此在这里分享给小伙伴们!我们是可以改变世界的一群人,就算别人觉得我们是码农,我们也是可以成为袁隆平级别的码农!
当然,我觉的我们不只是码农,我觉的我们都是一群创造者,在0和1的世界创造属于我们的世界!
话有点多,哈哈!那就这样,记得持续关注我~~啾咪。

源代码:
链接:https://pan.baidu.com/s/1hBkWWw6COGHFf3q3qfnINg
提取码:z409
复制这段内容后打开百度网盘手机App,操作更方便哦

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值