当前位置: 首页 > 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");}
}

相关文章:

  • 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-编程技能赛-本科组(省赛)解题报告 | 珂学家
  • 香港特区立法会通过条例草案便利外地公司迁册来港
  • “女硕士失踪13年生两孩”案进入审查起诉阶段,哥哥:妹妹精神状态好转
  • 杭勇已任常州市政协党组成员,此前任常州市委常委、秘书长
  • 足球少年郎7月试锋芒,明日之星冠军杯构建顶级青少年赛事
  • 巴方:印度上周导弹袭击造成至少40名平民死亡
  • 中国-拉共体论坛第四届部长级会议北京宣言