【学习】Spring IoC&DI

这篇具有很好参考价值的文章主要介绍了【学习】Spring IoC&DI。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【学习】Spring IoC&DI,后端,spring,spring boot

  • 🎥 个人主页:Dikz12
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏

目录

Spring 是什么?

什么是 IoC容器?

传统开发模式 

loC开发模式

IoC的优势 

IoC 的使用

Bean的存储 

 方法注解

 DI

 属性注入

 构造⽅法注⼊

 Setter 注⼊

@Autowired存在的问题

 解决方案:

 @Autowired和@Resource的区别


Spring 是什么?

 Spring是一个开发应用框架,其目的是用于简化企业级应用程序开发. Springd的原生框架指的是Spring Core、Spring FrameWork; 这个概念是比较抽象的,可以用一句更具体的话来概述:Spring是包含众多工具的 IoC容器.

什么是 IoC容器?

“容器”通常指的是一种可以用来盛放物品的器皿;⽣活中的⽔杯,垃圾桶,冰箱等等这些都是容器,像 List/ Map就是数据存储的容器、Tomcat 就是Web容器;

IoC:Inversion of Control (控制反转),也是Spring两大核心思想之一. 也就是说: Spring是⼀个"控制反转"的容器.

什么是控制反转?

也就是控制权反转,获取依赖对象的过程被反转了,当需要 某个对象时,传统开发模式中需要自己通过new创建对象,现在不需要在进行创建,而是把这个创建对象的任务交给了容器. 程序只需要依赖注入(DI)就可以. 这个容器就是IoC容器.

IoC是一种思想,在生活中也有体现:

比如:传统的驾驶方式,车辆的控制权需要由驾驶员来控制,而现在就可以把驾驶权交给自动化系统来控制。

IoC是一种思想,DI是一种实现方式!

传统开发模式 

 设计轮⼦(Tire),然后根据轮⼦的⼤⼩设计底盘(Bottom),接着根据底盘设计⻋⾝(Framework),最后根据⻋⾝设计好整个汽⻋(Car)。这⾥就出现了⼀个"依赖"关系:汽⻋依赖⻋⾝,⻋⾝依赖底盘,底盘依赖轮⼦.

public class Main {
    public static void main(String[] args) {
        Car car = new Car(17);
        car.run();
    }
}

static class FrameWork {
    private Bottom bottom;

    public FrameWork(int size) {
        bottom = new Bottom(size);
    }
}

static class Bottom {
    private Tire tire;

    public Bottom(int size) {
        tire = new Tire(size);
        System.out.println("Bottom...init..");
    }
}

static class Tire {
    public int size;
    private String color;

    public Tire(int size) {
        this.size = size;
        System.out.println("tire....init...size:"+size);
    }
}

 从以上代码可以看出,以上程序的问题是:当最底层代码改动之后,整个调⽤链上的所有代码都需要修改.程序的耦合度⾮常⾼(修改⼀处代码,影响其他处的代码修改)

loC开发模式

把调⽤汽⻋的程序⽰例改造⼀下,把创建⼦类的⽅式,改为注⼊传递的⽅式.
 

public class Main {
    public static void main(String[] args) {
        Tire tire= new Tire(17,"red");
        Bottom bottom = new Bottom(tire);
        Framework framework = new Framework(bottom);
        Car car = new Car(framework);
        car.run();
    }
}

代码经过以上调整,⽆论底层类如何变化,整个调⽤链是不⽤做任何改变的,这样就完成了代码之间的解耦,从⽽实现了更加灵活、通⽤的程序设计了.

IoC的优势 

  1. 资源集中管理,实现资源的可配置和易管理。
  2. 降低了使⽤资源双⽅的依赖程度,也就是我们说的耦合度(解耦)。

IoC 的使用

Bean的存储 

 共有两类注解类型可以实现:

  • 1. 类注解:@Controller、@Service、@Repository、@Component、@Configuration.
  • 2. ⽅法注解:@Bean.
@Controller //把这个对象交给Spring进行管理
public class UserController {
    public void hello() {
        System.out.println("Hello,Controller");
    }
}

 获取对象:

    public static void main(String[] args) {
      ApplicationContext context = SpringApplication.run(IocDemoApplication.class, args);
      //从Spring上下⽂中获取对象
        UserController userController = context.getBean(UserController.class);
        userController.hello();
    }

【学习】Spring IoC&DI,后端,spring,spring boot

  • @Controller:控制层,接收请求,对请求进⾏处理,并进⾏响应.
  • @Servie:业务逻辑层,处理具体的业务逻辑.
  • @Repository:数据访问层,也称为持久层.负责数据访问操作
  • @Component :组件存储.
  • @Configuration:配置层.处理项⽬中的⼀些配置信息

 方法注解

类注解是添加到某个类上的,但是存在两个问题:

  • 1. 使⽤外部包⾥的类,没办法添加类注解
  • 2. ⼀个类,需要多个对象,⽐如多个数据源

这种场景,我们就需要使⽤⽅法注解@Bean.

@Configuration
public class BeanConfig {
    @Bean("u1")
    public User user1() {
        User user = new User();
        user.setName("zhangsan");
        user.setAge(18);
        return user;
    }
}

@Bean 方法注解要搭配类注解一起使用,否则就是报错!! 可以对Bean对象进行重命名操作.

 DI

 依赖注⼊是⼀个过程,是指IoC容器在创建Bean时,去提供运⾏时所依赖的资源,⽽资源指的就是对象.

关于依赖注⼊,Spring也给我们提供了三种⽅式:

  • 1. 属性注⼊
  • 2. 构造⽅法注⼊
  • 3. Setter注⼊

 属性注入

 属性注⼊是使⽤@Autowired注解实现的. 比如:将Service 类注⼊到 Controller类中.

@Controller //把这个对象交给Spring进行管理
public class UserController {
    @Autowired
    private UserService userService;
    public void hello() {
        System.out.println("Hello,Controller");
        userService.hello();
    }
}
@Service
public class UserService {
    public void hello() {
        System.out.println("Hello,UserService...");
    }
}

【学习】Spring IoC&DI,后端,spring,spring boot

 构造⽅法注⼊

@Controller
public class UserController2 {
    //注⼊⽅法2: 构造⽅法
    private UserService userService;

    public UserController2() {

    }
    @Autowired
    public UserController2(UserService userService) {
        this.userService = userService;
    }
    public void hi(){
        System.out.println("hi,UserController2...");
        userService.hello();
    }
}

去掉@Autowired,就会报异常,如下:

【学习】Spring IoC&DI,后端,spring,spring boot

 如果类只有⼀个构造⽅法,那么,@Autowired注解可以省略;如果类中有多个构造⽅法,那么需要添加上@Autowired来明确指定到底使⽤哪个构造⽅法。

 Setter 注⼊

@Controller
public class UserController3 {
    //注⼊⽅法3: Setter⽅法注⼊
    private UserService userService;

    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void hello() {
        System.out.println("hello,UserController3...");
        userService.hello();
    }
}

【学习】Spring IoC&DI,后端,spring,spring boot

如果去掉@Autowired的话,就会报空指针异常!

【学习】Spring IoC&DI,后端,spring,spring boot

@Autowired存在的问题

 当同⼀类型存在多个bean时,使⽤@Autowired会存在问题.

【学习】Spring IoC&DI,后端,spring,spring boot 

【学习】Spring IoC&DI,后端,spring,spring boot

会出两个bean对象,非唯一的bean对象,Spring就不知道要用那个了,直接就启动失败! 

 解决方案:

1.修改@Autowired的属性名跟Bean的名称一致.

【学习】Spring IoC&DI,后端,spring,spring boot

【学习】Spring IoC&DI,后端,spring,spring boot 

 2.使⽤@Primary注解:当存在多个相同类型的Bean注⼊时,加上@Primary注解,来确定默认的实现.

【学习】Spring IoC&DI,后端,spring,spring boot

3. 使⽤@Qualifier注解:指定当前要注⼊的bean对象。在@Qualifier的value属性中,指定注⼊的bean的名称。 @Qualifier注解不能单独使⽤,必须配合@Autowired使⽤.

【学习】Spring IoC&DI,后端,spring,spring boot

【学习】Spring IoC&DI,后端,spring,spring boot

 4.使⽤@Resource注解:是按照bean的名称进⾏注⼊。通过name属性指定要注⼊的bean的名称。

【学习】Spring IoC&DI,后端,spring,spring boot文章来源地址https://www.toymoban.com/news/detail-851627.html

 @Autowired和@Resource的区别

  1.  @Autowired默认是以类型注入的,当同一个类型有多个对象,也会按名称进行匹配,如果名称匹配不到,就会报错;@Resource 是按照名称注入的,使用name指定注入。
  2. @Autowired是由Spring提供的注解;@Resource是JDK提供的注解。

到了这里,关于【学习】Spring IoC&DI的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring IOC DI - 整合MyBatis

    Spring 框架的优势(对比以前项目的缺点) (1)单纯使用Mybatis框架,业务层代码复杂,需要用大量的代码自行解析mybatis.xml配置文件,压力都给到了业务层代码,如下代码: 学习了spring以后,mybaits的使用会更加简单,会简化业务层处理的代码。 (2)层与层之间的耦合性太高了

    2024年02月04日
    浏览(43)
  • 【Spring篇】IOC/DI注解开发

    🍓系列专栏:Spring系列专栏 🍉个人主页:个人主页 目录 一、IOC/DI注解开发 1.注解开发定义bean  2.纯注解开发模式 1.思路分析 2.实现步骤 3.注解开发bean作用范围与生命周期管理 1.环境准备 2.Bean的作用范围 3.Bean的生命周期 4.注解开发依赖注入 1.环境准备 2.注解实现按照类型注入

    2024年02月03日
    浏览(76)
  • 什么是IoC?什么是Spring IoC?什么是DI?

    首先说明 IoC 是一种思想,IoC的全称是Inversion of Control,翻译成中文叫做 “控制反转” 用人话来说,IoC的思想就是将一个对象对另一个对象的控制权交出去(不必关心交给谁),从而让对象之间的依赖关系降低,降低代码之间耦合程度。 我们可以写一个简单的代码来举个例子

    2024年02月14日
    浏览(50)
  • spring--Ioc控制反转/DI依赖注入

    1.概念:在使用对象的时候,由主动的new转换为外部提供对象,将对象创建的控制权交给外部,即控制反转 2.spring提供了一个容器,称为IOC容器,用来从当ioc中的外部 3.被管理或者被创建的对象在ioc中被叫做bean 使用步骤 1.导入依赖 spring-context 依赖,用到xml文件就需导入 2.创建

    2024年02月12日
    浏览(42)
  • 一文吃透 Spring 中的IOC和DI

    ✅作者简介:2022年 博客新星 第八 。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏:SSM 框架从入门到精通 ✨特色专栏:国学周更-心性养成之路 🥭本文内容:一文吃透 Spring 中

    2024年01月25日
    浏览(57)
  • Spring框架中IOC和DI详解

    来源黑马Spring课程,觉得挺好的 1、为什么要学习spring? 如果让本人用一句话去回答这个问题,那么我只能说:在J2EE的学习之路上,spring给我带来了开发的春天,让我们从JSP、sevlet的高耦合的开发中彻底的解救出来。 spring是目前最主流的框架 spring是学习后面课程(比如:

    2023年04月15日
    浏览(58)
  • Spring框架IOC容器和DI依赖注入

    IOC(Invertion Of Control):控制反转,使用对象时,由使用new创建对象转变为由外部提供对象,此过程中对象的创建控制权由程序转移到外部的思想称之为控制反转. DI(Dependency Injection):依赖注入,在容器中建立bean与bean之间的关系的过程,称之为依赖注入 pom.xml依赖引入 BookDao BookDaoImpl Book

    2023年04月09日
    浏览(89)
  • Spring 是什么?IoC 和 DI的区别

    我们通常讲的Spring指的是Spring Framework(Spring框架),它是一个开源的框架,有着活跃而庞大的社区,这也是它之所谓经久不衰的原因。官方的解读是:Spring官网 翻译过来就是:Spring使Java编程对每个人来说更快、更容易、更安全。Spring对速度、简单性和生产力的关注使它成为全球最受欢

    2024年02月08日
    浏览(45)
  • 【Spring教程九】Spring框架实战:全面深入详解IOC/DI注解开发

    欢迎大家回到《 Java教程之Spring30天快速入门》,本教程所有示例均基于Maven实现,如果您对Maven还很陌生,请移步本人的博文《 如何在windows11下安装Maven并配置以及 IDEA配置Maven环境》,本文的上一篇为《 IOC/DI配置管理第三方bean 加载properties文件》。 Spring的IOC/DI对应的配置开

    2024年02月03日
    浏览(49)
  • 【Spring】Spring有什么用?Spring核心与设计思想之IOC与DI

     Spring是一个开源的、轻量级的、面向企业级的Java应用框架。它提供了一种基于依赖注入和面向切面编程的方式,帮助开发者构建高效、可扩展的应用程序。  具体来说, Spring可以看作一个包含众多工具方法的IOC容器。 Spring的出现是为了让开发更简单~ 那么问题就很明确了

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包