当前位置: 首页 > 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.xdnf.cn/news/467425.html

相关文章:

  • 关于mysql分区键
  • Web GIS可视化地图框架Leaflet、OpenLayers、Mapbox、Cesium、ArcGis for JavaScript
  • 5.15本日总结
  • docker 命令操作大全
  • 【Matlab】最新版2025a发布,深色模式、Copilot编程助手上线!
  • redis中key的过期和淘汰
  • PDA手持终端应用有哪些?
  • Python生成器:高效处理大数据的秘密武器
  • YOLO11解决方案之距离计算探索
  • RHCE实验:通过脚本判断用户是否存在
  • 与entity物体的交互
  • 提升MySQL运维效率的AI利器:NineData深度评测与使用指南
  • 网页渲染的两条赛道
  • 语音识别——语音转文字
  • 20250515通过以太网让VLC拉取视熙科技的机芯的rtsp视频流的步骤
  • Spring Boot 拦截器:解锁5大实用场景
  • QImage高效率像素操作的方法
  • 基于windows环境Oracle主备切换之后OGG同步进程恢复
  • 兰亭妙微B端UI设计:融合多元风格,点亮品牌魅力
  • 嵌软面试每日一阅----通信协议篇(二)之TCP
  • 一招解决Tailwindcss4.x与其他库样式冲突问题
  • 报销单业务笔记
  • 中国近代史2
  • 深度学习框架对比---Pytorch和TensorFlow
  • MySQL 学习(十)执行一条查询语句的内部执行过程、MySQL分层
  • 验证可行分享-Rancher部署文档
  • CSRF攻击 + 观测iframe加载时间利用时间响应差异侧信道攻击 -- reelfreaks DefCamp 2024
  • 第一天的尝试
  • C语言中的指定初始化器
  • java 八股