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; 阅读详情

相关推荐

集成电路设计笔记(七)UVLO设计

1. 什么是UVLO 欠压锁定(Undervoltage-Lockout)简称UVLO,是电子设备中在电源电压低于正常工程准位时,切断电源的电路。在嵌入式系统中常会用UVLO监控电池电压,若电压低于一定值,会直接切断电源,保护嵌入式系统的电路。 许多电子设备中都有UVLO的功能,例如在镇流器中就有UVLO电路,若电压过低时直接切断电源。 UVLO就是低电压锁定; 低压关断. 欠压关断模式是当供电电压低于IC的开启门限电压时的一种保护模式。欠压关断模式可保证IC在供电电压不足时不致于被损坏。一个低电压锁定(

ccbirds 2万+

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

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

weixin_61925293的博客 215

算力网:正在编织的“第二电网“

中国算力网:编织智能时代的"第二电网" 中国正在构建全国一体化算力网,目标让算力资源像水电一样即取即用。这一国家战略通过"东数西算"布局,将东部算力需求与西部清洁能源优势结合,形成三级时延圈(1ms城市级、5ms区域级、20ms国家级)。算力网采用三层架构:基础设施层的八大枢纽节点作为"发电厂",编排管理层的智能调度系统作为"调度中心",运营服务层提供标准化算力服务。关键技术包括算力路由、异构算力统一度量、无损网络和液冷技术等。

这只是一个博客 669

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

Ansys Lumerical | 薄膜铌酸锂电光调制器的仿真与优化

本文详细介绍了使用Ansys Lumerical进行薄膜铌酸锂电光调制器仿真与优化的全流程。从基础原理到电学仿真、光学模拟技巧,再到设计优化实战经验,帮助工程师掌握这一先进光电器件的仿真方法。重点解析了薄膜铌酸锂的Pockels效应和Mach-Zehnder结构设计,并提供了常见问题排查指南和最新发展动态。

vulkan6gpu的博客 1199

S7-200 SMART PLC 子程序功能块(阀门控制)

由于S7-200 SMARTPLC的子程序种种功能、容量限制,有时想实现多次调用的子程序可能并不是太容易,这篇博客还是给出一些推荐写法,供大家参看。

RXXW_Dor的博客 8070

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

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

xxy1022_的博客 1369

Python图像处理之光斑分析

光斑是工程中经常出现的图像数据,其特点是目标明确,分布清晰。对光斑图像的分析,主要包括质心定位、目标截取以及半径拟合等。

微小冷的学习笔记 2857

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

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

丨康有为丨的博客 506

医疗影像配准与融合: 使用MATLAB对医学影像进行配准和融合,实现不同影像模态之间的对准和结构信息融合等

医疗影像配准与融合是医学影像处理的重要技术,它用于将不同来源、不同时间或不同模态的医学影像进行配准和融合,以获得更加完整、准确的患者解剖信息。基于MATLAB的医疗影像配准与融合可以帮助医生更准确地诊断疾病,制定更有效的治疗方案。医疗影像配准与融合是医学影像处理的关键技术,它对于提高医学影像诊断和治疗的准确性至关重要。MATLAB是一种功能强大的数学和科学计算软件,它可以为医疗影像配准与融合提供强大的工具和支持。

走向CTO的路上... 714

配置适合Gurobi的机器硬件环境需要考虑的因素

介绍了在为gurobi选择合适的硬件环境时,需要考虑三个方面的因素;

Linshaodan520的博客 1064

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

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

weixin_64173948的博客 1591

捷联惯导,其实没有你想象的那么复杂!(附:惯导嵌入式应用中需要的一些C代码)

摘要:捷联惯导系统将惯性测量单元固连于运动载体,通过核心算法实现导航解算。系统首先进行传感器误差补偿和初始对准,然后利用陀螺和加速度计数据,通过姿态更新算法(如四元数法)计算载体相对于地理系的姿态。加速度数据经比力方程转换后积分得到速度和位置,过程中需补偿圆锥误差和划船效应。捷联惯导通过数字平台替代物理平台,实现了载体坐标系与导航坐标系的实时转换,是当前惯性导航系统的主流方案。

victoryqian528的博客 270

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

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

ScorpC的博客 473

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring ioc&DI

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

huapiaoy的博客 1874

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_61925293的博客 115

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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、付费专栏及课程。

余额充值