当前位置: 首页 > news >正文

【Java】Spring IoC中的相关注解

Spring IoC中除了基础的@Bean,@Compoent,@RestController还有一些其他的注解可以用来控制Bean注入的时机一起来了解一下吧。

目录

  • @Lazy 懒加载注解
  • @Conditional 条件注解
  • @DependsOn 依赖注解
  • @Order 注入顺序注解

@Lazy 懒加载注解

@Lazy注解会延迟初始化这个Bean
当类上没有加@Lazy注解时,项目启动就会初始化这个Bean
当类上加上@Lazy注解时,只有真正使用到这个Bean,才会被初始化并注入的IoC容器中。

@Lazy
@Component
public class UserServiceImpl{public UserServiceImpl(){System.out.println("UserServiceImpl");}
}

@Lazy也可以写在属性上用来避免循环依赖。如下代码,如果没有使用@Lazy则会出现循环依赖导致启动失败。

@Component
public class UserServiceImpl{@Lazy@Autowiredprivate UserServiceImpl userService;public UserServiceImpl(){System.out.println("UserServiceImpl");}
}

@Conditional 条件注解

在类上加上@Conditional注解,然后自定一个实现类实现Condition接口,并且@Conditional关联到这个接口即可。
该接口只有一个实现方法,返回boolean类型,返回true则表示要注入到Ioc容器中,返回false则相反。

@Conditional(MyConditional.class)
@Component
public class UserServiceImpl{public UserServiceImpl(){System.out.println("UserServiceImpl");}
}
public class MyConditional implements Condition{@Overridepublic boolean matches(ConditionContext context,AnnotatedTypeMatadata metadata){return false;}
}

@DependsOn 依赖注解

表示该Bean初始化是依赖某个Bean,需要等依赖的Bean初始化完成后再注入到IoC容器中。
这个可以用来控制Bean的初始化顺序。

@DependsOn("userServiceImpl2")
@Component
public class UserServiceImpl{@Autowiredprivate UserServiceImpl userService;public UserServiceImpl(){System.out.println("UserServiceImpl");}
}
@Component
public class UserServiceImpl2{@Autowiredprivate UserServiceImpl userService;public UserServiceImpl(){System.out.println("UserServiceImpl2");}
}

@Order 注入顺序注解

Person接口有两个实现类,
UserController 使用List 将两个实现类都注入进来,那么List中的顺序是如何的呢?
如果没有使用@Order注解默认情况下是要做编码顺序来的也就是[PersonServiceImpl1,PersonServiceImpl2]
如果按照如下使用@Order注解则顺序是[PersonServiceImpl2,PersonServiceImpl1]
@Order注解中的值越小优先级越高
注意:@Order只影响依赖注入的顺序,不会影响Bean初始化的顺序。
Bean初始化的顺序依然是采用@DependsOn 注解来控制的。因此按照如下代码初始化顺序依然是默认的源码顺序也就是
[PersonServiceImpl1,PersonServiceImpl2]

public interface Person{
}
@Order(2)
@Component
public class PersonServiceImpl1 implements Person{public PersonServiceImpl1(){System.out.println("PersonServiceImpl1");}
}
@Order(1)
@Component
public class PersonServiceImpl2 implements Person{public PersonServiceImpl2(){System.out.println("PersonServiceImpl2");}
}
@RestController
public class UserController{public UserController(List<Person> personList){System.out.println(personList.size());System.out.println("UserController");}
}
http://www.dtcms.com/a/193330.html

相关文章:

  • Cloudflare防火墙拦截谷歌爬虫|导致收录失败怎么解决?
  • SpringBoot集成Redis:实现分布式锁(redistemplate,lua,redisson)
  • Synchronized详解及高频面试问答
  • Makefile与CMake
  • 登录接口中图片验证码Tesseract-OCR识别Java脚本
  • 优化算法加速深度学习模型训练
  • IEEE出版|连续多年稳定检索|第三届信号处理与智能计算国际学术会议(SPIC2025)
  • CentOS7 OpenSSL升级1.1.1w
  • Vue中的自定义指令适用于哪些场景
  • 报销单业务笔记
  • 题解:P12207 [蓝桥杯 2023 国 Python B] 划分
  • 贝叶斯优化Transformer融合支持向量机多变量回归预测,附相关性气泡图、散点密度图,Matlab实现
  • 深入探索向量数据库:构建智能应用的新基础
  • vue3搭建脚手架前的前置知识
  • psycopg_pool.PoolTimeout: couldn‘t get a connection after 120.00 sec异常
  • 技术文档:变频器干扰问题与解决方案
  • 使用 QGIS 插件 OpenTopography DEM Downloader 下载高程数据(申请key教程)
  • 压电陶瓷极化-佰力博与您探讨极化工艺的重要性及极化方法。
  • Open CASCADE学习|容器及其使用
  • 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(省赛)解题报告 | 珂学家
  • Zabbix Agent的区别与选择!
  • 鸿蒙OSUniApp制作自定义的下拉菜单组件(鸿蒙系统适配版)#三方框架 #Uniapp
  • 阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统
  • 【RabbitMQ】实现RPC通信的完整指南
  • MySQL——1、数据库基础
  • 25.5.15
  • homeassistant安装
  • 社区电商场景的 社群推广与维护系统化分析框架
  • MySQL如何查看某个表所占空间大小?(表空间大小查看方法)
  • 《教育退费那些事儿:从困境到破局》