ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Spring IOC

Spring IOC 1.什么是IOCIoCInversion of Control控制反转指将对象的创建交给Spring非IOC方式在UserService中依赖UserMapper,public class UserService { private UserMapper userMapper new UserMapper(); public void saveUser() { userMapper.save(); } }这部分代码做了两件事一.实例化对象new UserMapper()二.将新对象赋值给userMapper采用IOC的方式将上面两件事交给Spring来完成。可以简单理解将原来自己控制的对象反转交给Spring控制。2.创建对象Bean在Spring中由Spring创建和管理的对象称为Bean。并存放到Spring Bean容器中用于重复的使用。3.依赖注入(Dependency Injection)spring创建完成对象后再将对象依赖的对象进行注入。Spring可以通过以下三种方式注入构造器注入Service public class UserService { private final UserMapper mapper; public UserService(UserMapper mapper) { this.mapper mapper; } }Setter注入Service public class UserService { private UserMapper userMapper; Autowired public void setUserMapper(UserMapper userMapper) { this.userMapper userMapper; } }字段注入Service public class UserService { Autowired private UserMapper userMapper; }注通过反射进行赋值。上面都使用了Autowired的注解对于构造器注入这个注解可以省略。另外Resource注解也能实现注入的功能。但是它们的功能有一些区别。AutowiredResource来源spring提供Java 官方提供JSR-250 规范Bean查找方式先按类型 (type)再按名称先按名称 (name)再按类型必须注入默认true可以设置为false.Autowired(required true)是通过类型查找时可能会查找到多个同类型的Bean,它们的处理方式也不同Resource:抛异常Autowired:可通过Qualifiername userMapper指定Bean名称或Primary声明对应的Bean为首选Bean至于用谁都可以整个项目应保持统一。4.循环引用问题UserService、OrderService,互相引用。如果通过构造器方式注入将在启动项目时就报错。无法通过三级缓存解决因为在类实例化的时候就需要注入引用的Bean。对于其他方式的注入Srping通过三级缓存来解决循环引用问题。一级缓存singletonObjects已经创建完成可以使用的Bean实例。二级缓存earlySingletonObjects未完成依赖注入的Bean实例还需要注入依赖的对象。三级缓存singletonFactories将未完成依赖注入的Bean包装成ObjectFactory。过程创建userService允许循环依赖则将userService包装成ObjectFactory放入三级缓存。查找引用的orderService未找到则创建。创建orderService允许循环依赖将orderService包装成ObjectFactory放入三级缓存。发现引用了userService发现循环依赖则获取三级缓存中的ObjectFactoryuserService并生成userService放入二级缓存完成orderService 注入userService完成orderService 创建并放入一级缓存清空二级缓存的orderService 。userService从一级缓存查找orderService并注入完成后将userService放入一级缓存清空二级缓存的userService。二级缓存也能解决循环引用为什么要用三级因为Spring需要先实例化对象再创建代理对象。如果有循环依赖时会先将普通类通过ObjectFactory包装放入三级缓存中。其他类在调用ObjectFactory时判断是否生成代理对象。正常的代理类创建是在实例化类完成后在BeanPostProcessorsAfterInitialization,具体可以去了解Bean的创建流程。注Spring Boot 2.6.0 版本开始官方出于引导更优设计的考虑默认禁止了循环依赖如需开启可配置:spring.main.allow-circular-referencestrue
返回列表