Spring中的控制反转和依赖注入(IoC和DI)以及常见面试题

Spring 核心知识讲解,太简单啦! Spring Framework 简称 Spring,是 Java 开发中最常用的框架,地位仅次于 Java API,就连近几年比较流行的微服务框架 SpringBoot,也是基于 Spring 实现的,SpringBoot 的诞生是为了让开发者更方便地使用 Spring,因此 Spring 在 Java 体系中的地位可谓首屈一指。 当然,如果想要把 Spring 所有功能都讲的一清二楚,远远不是一两篇文章能够做到的,但幸运的是,Spring 的基础资料可以很轻易的搜索到,那么我们本讲主要的目的就是把 Sp 阅读详情

1.什么是Spring

Spring在不同情景下呢有不同的意思。

(1)比如说你的项目里面使用到了Spring,那这里的Spring指的是Spring家族,其中包含了各种各样的框架;

(2)要是说Spring有什么特点其中一个是IoC那么这里指的就是Spring Core,Spring Framework。(Spring Core 是 Spring Framework 的核心模块,主要负责实现 IoC 和 DI 功能;而 Spring Framework 是一个整合了多个模块的完整开发框架,包含 Spring Core、AOP、Web、Data 等模块)Spring是包含众多工具的IoC容器,它既然是容器里面肯定需要装东西,那Spring存储的是对象也可以称之为Bean,当然只在Spring范围内这么称呼。

Spring ,Spring MVC,Spring Boot的区别?(常见面试题)

Spring MVC,Spring Boot都属于Spring,Spring MVC是基于Spring的基础上开发出来的一种框架,主要用来做网站开发所以也叫Spring WEB MVC;Spring Boot是基于Spring的一套快速开发整合包,主要用来快速搭建框架。

2.什么是IoC?

IoC专业词汇解释是控制反转。意思就是原本我们使用对象的时候需要自己去new进行创建,那有了Spring之后,我们把创建对象的权力交由Spring来做,这就叫控制反转。其实有点像我们要得到某样东西可以选择买或者选择自己做,就比如我想要吃蛋糕,你可以搜教程和买工具然后自己做(这相当于我们自己创建对象);当然也可以直接去蛋糕店买想要什么蛋糕直接向店家描述然后让店家来给你做(这相当于由Spring来创建对象)。

优点:使用控制反转主要是为了解耦。这就牵扯到了软件的设计原则:高内聚,低耦合。

高内聚:一个模块内部的关系,低耦合:各个模块之前的关系。

同时也有节约空间的作用,比如说之前一个对象只能一个人来用,但是现在交给Spring创建大家都可以用,实现资源共享。

3.实现IoC(DI依赖注入实现)

IoC其实只是一种思想,那具体Spring怎么去实现的呢?使用DI也就是依赖注入。依赖注入就是指在容器运行期间,动态的为应用程序提供运行所依赖的资源。就类似于点餐,你告诉厨师想要吃什么这就是声明依赖,厨师给你提供餐食这就是注入依赖。

代码实现:

自己创建对象

private BookDao bookDao = new BookDa0();

声明依赖

@Component
public class BookDao{
    
}

注入依赖(告诉Spring,从容器中取出这个对象,赋值给当前对象属性)

@Autowired
private BookDao bookDao;

4.IoC详解

上面的只是让大家对IoC有个基础的认识,下面会对IoC进行详细的学习

4.1Bean的存储

前面说了Spring是IoC容器,存储的是对象,所以需要在类上加上@Component的注解来表示声明,而Spring框架提供了不止这一种注解。

类注解:@Controller,@Service,@Repository,@Component,@Configuration

方法注解:@Bean

4.1.1@Controller(控制器存储)

声明对象

@Controller
public class UseController {
    public void doController(){
        System.out.println("do controller");
    }
}

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        //Spring上下文,所以这里run方法返回的就是Spring的运行环境
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController bean = context.getBean(UserController.class);
        bean.doController();
    }

}

运行结果

ApplicationContext VS BeanFactory(常见面试题,八股文只需要背诵即可)

继承关系和功能方面来说:Spring 容器有两个顶级的接口:BeanFactory和 ApplicationContext。其中BeanFactory 提供了基础的访问容器的能力,而 ApplicationContext 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能之外,它还拥有独特的特性,还添加了对国际化支持、资源访问支持、以及事件传播等方面的支持。
从性能方面来说:ApplicationContext 是一次性加载并初始化,所有的 Bean 对象,而 BeanFactory 是需要那个才去加载那个,因此更加轻量。(空间换时间)

 4.1.2@Service(服务存储)

声明对象

@Service
public class UserService {
    public void doService(){
        System.out.println("do Service");
    }

}

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        //Spring上下文,所以这里run方法返回的就是Spring的运行环境
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController bean = context.getBean(UserController.class);
        bean.doController();
        UserService service = context.getBean(UserService.class);
        service.doService();
    }

}

运行结果:

4.1.3@Repository(仓库存储)

声明对象

@Repository
public class UserRepository {

    public void doRepository(){
        System.out.println("do Repository");
    }

}

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        //Spring上下文,所以这里run方法返回的就是Spring的运行环境
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController bean = context.getBean(UserController.class);
        bean.doController();
        UserService service = context.getBean(UserService.class);
        service.doService();
        UserRepository repository = context.getBean(UserRepository.class);
        repository.doRepository();
    }
}

运行结果:

4.1.4@Component(组件存储)

声明对象:

@Component
public class UserComponent {
    public void doUserComponent(){
        System.out.println("do UserComponent");
    }
}

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        //Spring上下文,所以这里run方法返回的就是Spring的运行环境
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController bean = context.getBean(UserController.class);
        bean.doController();
        UserService service = context.getBean(UserService.class);
        service.doService();
        UserRepository repository = context.getBean(UserRepository.class);
        repository.doRepository();
        UserComponent userComponent = context.getBean(UserComponent.class);
        userComponent.doUserComponent();
    }
}

运行结果:

4.1.5 @Configuration(配置存储)

声明对象:

@Configuration
public class UserConfig {

    public void doUserConfig(){
        System.out.println("do UserConfig");
    }

}

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        //Spring上下文,所以这里run方法返回的就是Spring的运行环境
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController bean = context.getBean(UserController.class);
        bean.doController();
        UserService service = context.getBean(UserService.class);
        service.doService();
        UserRepository repository = context.getBean(UserRepository.class);
        repository.doRepository();
        UserComponent userComponent = context.getBean(UserComponent.class);
        userComponent.doUserComponent();
        UserConfig userConfig = context.getBean(UserConfig.class);
        userConfig.doUserConfig();
    }
}

运行结果;

以上是通过类名来获取对象 

4.1.6通过名称来获取对象
  • 若未明确指定名称,Spring 会把类名的首字母小写作为默认名称。
  • 当类名以两个大写字母开头时,默认名称会和类名完全一样。
@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        //Spring上下文,所以这里run方法返回的就是Spring的运行环境
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController bean = context.getBean(UserController.class);
        bean.doController();
        UserService service = context.getBean(UserService.class);
        service.doService();
        UserRepository repository = context.getBean(UserRepository.class);
        repository.doRepository();
        UserComponent userComponent = context.getBean(UserComponent.class);
        userComponent.doUserComponent();
        UserConfig userConfig = context.getBean(UserConfig.class);
        userConfig.doUserConfig();
        System.out.println("------------");
        //根据名称获取对象,需要进行类型转换
        UserController controller = (UserController)context.getBean("userController");
        controller.doController();
        //根据名称和类名获取对象
        context.getBean("userService", UserService.class).doService();
    }
}

4.2为什么要这么多的类注解?

其实就类似于车牌号码一样,各个省份的车牌号开头是不一样的,节约号码的同时还能便于识别车辆的归属地。那这么多类注解的作用是类似的,是代码能够分层然后更好的去维护代码。

几个注解之间的关系:都是Component的衍生类,功能相同,但是规范里面不同的情形下用不同的注解。不过Controller比较特殊,如果外界想要访问,只能通过Controller,程序的入口只能通过Controller。

4.3@Bean 

五大注解只能加在类上,并且只能加在自己的代码上。如果使用了第三方的jar包,我们也想要交给Spring管理的话是不能使用五大注解的;同时遇到对于同一个类中需要定义多个对象的时候比如说数据库操作需要定义多个数据源时也是不能使用五大注解的。所以我们需要使用@Bean这个方法注解。

@Bean我们在获取对象的时候往往使用名称来获取,因为使用类名的时候,同时我们又定义了多个对象,这些对象的类型一样就会报错。

数据源:

@Data
public class UserInfo {

    private int age;
    private   String name;
    private int id;

}

 使用BeanConfig这个类来定义和返回UserInfo对象,这里的@Bean需要搭配五大注解使用。因为整个项目里面的文件是非常多的,那在运行的时候需要扫描文件,但是不可能每一个文件都去扫描,那么这个时候搭配五大注解来使用就是告诉Spring运行的时候需要扫描到当前的文件。

@Configuration
public class BeanConfig {
    @Bean
    public UserInfo userInfo() {
        UserInfo userInfo = new UserInfo();
        userInfo.setAge(22);
        userInfo.setName("张三");
        userInfo.setId(1);
        return userInfo;
    }
    @Bean
    public UserInfo userInfo2() {
        UserInfo userInfo = new UserInfo();
        userInfo.setAge(24);
        userInfo.setName("李四");
        userInfo.setId(2);
        return userInfo;
    }
}

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserInfo userInfo = context.getBean(UserInfo.class);
        System.out.println(userInfo);
    }
}

代码报错,获取到了两个userInfo,因为定义多个对象的时候使用了相同类型。 

Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'com.example.springtest.demos.web.config.UserInfo' available: expected single matching bean but found 2: userInfo,userInfo2
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveNamedBean(DefaultListableBeanFactory.java:1273)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveBean(DefaultListableBeanFactory.java:494)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:349)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:342)
	at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1172)
	at com.example.springtest.SpringTestApplication.main(SpringTestApplication.java:37)

 @Bean中存储对象的名称就是对象的方法名

@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserInfo userInfo =(UserInfo) context.getBean("userInfo");
        System.out.println(userInfo);
    }
}

 运行结果:

5.DI详解

DI直译是依赖注入,它也有很多其他的名称如“属性装配”“依赖装配”。依赖注入的方式大概分为以下三种

5.1属性注入

属性注入以类型进行匹配,与注入的属性名称无关。

@Controller
public class UserController {

    @Autowired
    private UserService us;
    public void doController(){
        us.doService();
        System.out.println("do controller");
    }
}
@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController controller =(UserController) context.getBean("userController");
        controller.doController();
    }
}

 

但是如果一个类型存在多个对象时,优先名称匹配,如果名称匹配不上,就会报错。而且无法注入一个Final修饰的属性。所以官方不建议使用这种方式来进行依赖注入。

解决办法

(1).属性名和你需要使用的对象名保持一致

(2).使用@Primary注解标识默认的对象

(3).使用@Qualifier

 

(4).使用@Resource注解

@Autowird 与 @Resource的区别(常见面试题)
(1)@Autowired 是Spring框架提供的注解,而@Resource是JDK提供的注解
(2)@Autowired 默认是按照类型注入,而@Resource是按照名称注入,相比于 @AutoWired 来说,@Resource支持更多的参数设置,例如 name 设置,根据名称获取 Bean。

补充:@Autowired 默认是按照类型注入的,但是同一个类型存在多个对象的时候会按名称匹配,名称也匹配不上则会报错。

5.2构造方法注入

如果存在多个构造函数时,需要加@AutoWired来注明要使用哪一个构造函数,如果只有一个构造函数时@AutoWired可以省略

@Controller
public class UserController {

    private UserService us;
    private UserInfo info;
    public UserController(){

    }
    @Autowired
    public UserController(UserService us){
        this.us = us;
    }
    public UserController(UserService us, UserInfo info){
        this.us = us;
        this.info = info;
    }
    public void doController(){
        us.doService();
        System.out.println("do controller");
    }
}
@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController controller =(UserController) context.getBean("userController");
        controller.doController();
    }
}

5.3Setter方法注入

@Controller
public class UserController {

    private UserService us;

    @Autowired
    public void setUs(UserService us) {
        this.us = us;
    }

    public void doController(){
        us.doService();
        System.out.println("do controller");
    }
}
@SpringBootApplication
public class SpringTestApplication {

    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringTestApplication.class, args);
        UserController controller =(UserController) context.getBean("userController");
        controller.doController();
    }
}

5.4 三种方式的优缺点对比(八股文面试题)

Spring入门程序_07***【Bean的常用装配(1)——基于Xml装配(使用 “构造注入” )】面试题:Spring框架中的IOC(控制反转)和DI(依赖注入)是什么?它们有什么区别? 目录小结目录结构代码输出 小结 (1)需要注意的就是User类中提供了带参的构造方法。 (2)@Override。。。。重写toString()方法。 (3)xml中 新出现的<constructor-arg>标签以及index,value,list等。 目录结构 代码 User.java类 package com.itheima.assemble; import java.util.List; public class User { private String username; 阅读详情

相关推荐

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 416

面试题-说一下spring中IOC 是什么?以及和DI 的区别?

是一种设计模式,是指创建对象的控制权的转移。最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。和控制反转是同一个概念的不同角度的描述,DI是IOC的一种具体实现方式,它是通过注入依赖来实现对象之间的关系 依赖注入的方式有构造器,setter方法等。简而言之,IOC是一种思想或原则,它描述了对象控制权的转移,而DI是IOC的一种具体实现方式,它通过注入依赖来实现对象之间的关系。

weixin_61925293的博客 215

Spring面试题-Spring控制反转(IOC)

目录什么是Spring IOC容器?有什么作用?优点是什么?Spring IoC的实现机制是什么?Spring 的 IoC支持哪些功能IoC和DI的区别是什么?紧耦合和松耦合有什么区别?如何编写松耦合代码?BeanFactory的作用BeanDefinition的作用BeanFactory和ApplicationContext有啥区别?BeanFactory和FactoryBean有什么区别?说下Spring IOC容器的加载过程Spring IoC有哪些扩展点,在什么时候调用? 什么是Spring IOC

weixin_45785536的博客 2870

DSSAT模型建模教程

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。现有版本V4.7能模拟27种主要农作物的生长发育和产量形成过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。如果你是个模型入门者,这次将让你体验一键模拟的乐趣。

weixin_55561616的博客 1414

AI脸部替换Roop-Unleashed,一键整合包教程

Roop-Unleashed是一个无须训练模型的深度伪造工具,专为图像和视频的面部替换而设计。它通过简洁的浏览器界面提供用户友好且跨平台的使用体验,无论用户是业余爱好者还是专业人士,都能快速上手。它无需复杂的设置即可实现高效的处理和转换,使图像和视频的编辑变得更加轻松和便捷。

m0_72580657的博客 1万+

面试必看!!!关于IOC的十道面试题

面试必看!!!关于IOC的十道面试题

xxy1022_的博客 1369

【fNIRS可视化学习1】基于NIRS-SPM进行光极可视化并计算通道坐标

设头皮上的目标点为P₀(x₀, y₀, z₀),需要在大脑皮层点集S上找到最合适的投影点P'。

Rose9614的博客 2208

【Spring面试题】IOC控制反转和DI依赖注入(详解)

婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。,想办法认识她们,投其所好送其所要,然后嘿嘿。

丨康有为丨的博客 506

CANoe/CANalyzer新手必看:从零配置到报文分析的完整流程(附B站官方教程实操)

本文为CANoe/CANalyzer新手提供从零配置到报文分析的完整流程指南,涵盖硬件连接、工程配置、报文捕获及信号级分析等关键步骤。通过详细的实操案例和B站官方教程,帮助工程师快速掌握汽车电子总线分析工具的核心应用,提升诊断效率与通信系统理解。

y7z8a的博客 773

FPGA实战:MIG IP核AXI接口DDR3读写优化指南

本文详细解析了FPGA中MIG IP核AXI接口的DDR3读写优化策略,涵盖关键参数配置、突发传输技巧及时序收敛方案。通过AXI接口优化和突发长度选择,可实现高达12.8GB/s的理论带宽,提升DDR3访问效率。文章还提供了Vivado配置实例和调试技巧,助力开发者解决FPGA内存控制中的实际问题。

weixin_29168393的博客 546

[Spring] IoC 控制反转和DI依赖注入和Spring中的实现以及常见面试题

Spring是一个开源框架,他让我们的开发更加简单,它支持广泛的应用场景,有着活跃而庞大的社区,这也是Spring能够长久不衰的原因.这个概念还是相对于比较抽象,我们用通俗易懂的话来讲,Spring是包含了众多工具方法的IoC容器 那么问题来了,容器是什么.什么是IoC容器。

weixin_64173948的博客 1591

无人机视角下基于YOLOv5/v8/v10的车辆检测系统:从算法原理到UI界面实战

随着无人机技术的普及和智慧城市的发展,无人机视角下的车辆检测在交通监控、战场侦察、灾害救援等领域展现出巨大的应用价值。然而,无人机航拍图像存在目标尺度小、视角多变、背景复杂等挑战。本文深入探讨了如何利用YOLOv5、YOLOv8、YOLOv10三个代表性目标检测算法,构建一套完整的无人机车辆检测系统。文章不仅详细解析了各版本YOLO的核心技术演进,还提供了从数据集准备、模型训练、性能评估到基于PyQt5/PySide6的图形界面开发的完整代码实现。通过本文,读者将能够掌握构建无人机实时车辆检测系统的全流程技

YOLO 172

面试题总结:Spring框架(二):IOC控制反转、DI依赖注入

软件工程中对象之间的耦合度就是对象之间的依赖性。 对象之间的耦合越高,维护成本越高。因此对象的设计应使类之间的耦合最小。 IOC容器凭什么叫IOC 控制反转,到底反转了什么? 早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了,因为大多数应用程序都是由两个或是更多的类通过彼此的合作来实现企业逻辑,这使得每个对象都需要获取与...

ScorpC的博客 473

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Spring ioc&DI

我们上面说了五大类注解,但是类注解存在两个问题:1.如果我们使用外部包中的类,没办法添加类注解2.一个类,如果需要多个对象,那就需要用到我们的方法注解我们先来看如何去使用我们会发现报错了,找不到这个类型的bean,这是因为spring根本没有去看我们加载了@Bean注解的这个类,因为我们进程中有很多的类,有内部的有外部的,Spring不可能把所有的都加载一遍,所以他只会把添加了五大注解的类,存储到spring容器中我们发现为什么我这次使用了类注解,也报错了啊。

huapiaoy的博客 1874

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

面试题-Spring中IOC控制反转的方式有哪几类?DI依赖注入的方式有那些?

在类上添加@Configuration注解,方法上添加@Bean注解,可以将方法返回结果添 加到Spring容器中。:在配置类中添加包扫描标签,在类中添加4个注解,项目启动时会扫描指定包中的类是。@AutoWired 按照类型匹配可以搭配@qualifier使用 是按照名字使用的。@AutoWired 是spring的注解 @Resource 是jdk的注解。通过@AutoWired、@Resource进行注入。本质容器调用构造器方法进行注入。

weixin_61925293的博客 115

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring核心原理之IoC容器初体验(2)

其它面试题(springboot、mybatis、并发、java中高级面试总结等)《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />其它面试题(springboot、mybatis、并发、java中高级面试总结等)[外链图片转存中…(img-Yo1wDMKo-1711859439462)][外链图片转存中…(img-wkK6uytZ-1711859439462)][外链图片转存中…(img-mMEARlql-1711859439462)]

2401_83915450的博客 581

Spring IoC(控制反转)和依赖注入(DI)详解

Spring IOC详解

codedot 1280

26(2)Spring 核心功能演示 + 面试题

面试

d_xia的博客 265

Spring面试题

1. 你怎么理解spring的DI和IOC di以来注入描述对象之间的依赖关系在spring工厂中设置注入或者构造注入维护关系 IOC控制返回描述对象的方式改变原来的对象在程序中没用了spring之后创建独享 2. spring中的Autwired和Resource的区别 @Autowire 暗雷自动分配 @Resource 先按类型自动装配,在暗属性名称自动装配 ...

weixin_43726409的博客 127

Spring Core深度解析:IoC与DI如何让你的代码像奶茶一样丝滑?

解耦神器:通过IoC/DI实现组件松耦合效率工具:自动管理对象生命周期扩展基石:为AOP、事务等高级特性打下基础你的项目中有没有被Spring Core拯救过的场景?欢迎评论区分享!(建议结合Spring官方文档实践,本文代码适用于学习交流)

程序猿小白菜 1109

IOC/DI 实现原理详解

​​​​​​​答:ApplicationContext扩展了BeanFactory,提供更多企业级功能,且默认预初始化单例Bean。答:构造器注入需在实例化阶段完成依赖注入,此时Bean尚未放入缓存,无法提前暴露引用。填充BeanB属性时发现依赖BeanA,从三级缓存获取BeanA的工厂,生成早期引用并注入。:按依赖顺序创建Bean实例(默认单例且非延迟加载的Bean在容器启动时创建)。:IOC的实现方式,由容器动态注入对象所需的依赖,而非对象自行创建。:存放Bean工厂对象,用于生成早期Bean引用。

qq_62112907的博客 980

【SSM框架 | day24 Spring IOC 与 DI 核心原理深度解析】

本文介绍了Spring框架的核心思想IOC(控制反转)与DI(依赖注入)。传统开发中对象创建和依赖管理由程序主动控制,导致高耦合,而Spring通过IOC容器管理对象生命周期,实现解耦。文章详细讲解了IOC入门案例、DI实现方式、Bean配置管理(包括作用域、实例化方式、生命周期控制),以及Setter注入、构造器注入、自动装配等依赖注入方式。最后总结了IOC/DI的设计思想,并解答了循环依赖、容器选择等常见面试问题,帮助开发者理解Spring如何通过反转控制实现松耦合架构。

King_model的博客 998

核心依赖注入(Dependency Injection, DI)详解

定义:依赖注入是Spring核心机制之一,指将对象依赖(成员变量、参数、资源)由框架自动传入,而不是由对象自己创建依赖。👉本质:控制反转(IoC)的一种实现方式✔ 依赖注入让代码解耦,核心是由容器管理依赖关系✔ 推荐构造器注入,强制性强、利于测试✔ 多个 Bean 用@Qualifier或@Primary解决冲突✔ 循环依赖场景下用 Setter 或@Lazy✔ 注入配置用@Value,动态获取 prototype 用@Lookup。

m0_69529796的博客 839

什么是 IoC?

什么是 IoC? IoC,Inversion of Control(控制反转)。 是一种设计思想,在Java开发中,将你设计好的对象交给容器控制,而不是显示地用代码进行对象的创建。 把创建和查找依赖对象的控制权交给 IoC 容器,由 IoC 容器进行注入、组合对象。这样对象与对象之间是松耦合、便于测试、功能可复用(减少对象的创建和内存消耗),使得程序的整个体系结构可维护性、灵活性、扩展...

ConstXiong 7776

service层_三大框架 —— 业务层框架Spring+IoC+DI

1. 初识Spring框架Spring是一个业务层框架,实现类ioc容器和aop。用spring添加依赖业务层主要处理业务逻辑如:注册时在业务层判断用户名是否存在。获取商品价格时,判断用户是否是会员,商品有没有参加店铺活动,有没有参加商城活动。@Service :表示这个类是业务层的类,spring就会创建对象,放在容器中@autowired:由spring提供的,spring框架从容器中找到一个...

weixin_39864387的博客 627
上一篇: Python中的内置函数
下一篇: 数据库框架Mybatis(超详细版)
change_topic
博客等级 码龄4年 97粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值