Springboot 组件注册 条件注解
组件注册方式ConfigurationBean1、作用Bean 是 Spring 中手动注册 Bean 的核心注解作用在方法上告诉 Spring 该方法的返回值会被 Spring 容器管理成为 IoC 容器中的一个 Bean2、自定义bean作用名Bean 的默认名称是方法名比如你代码中方法名是 user01但可以通过 Bean(userhaha) 自定义 Bean 名称 容器启动时或首次获取 Bean 时会执行该方法并将返回对象存入 IoC 容器后续获取 Bean 时直接从容器取单例或重新执行方法多例Bean(userhaha) // 自定义Bean名称为userhaha替代默认的user01 public User user01(){...}3、Scope 用于指定 Bean 的作用域生命周期范围核心作用是控制 Spring 容器创建 Bean 实例的数量和时机。作用域说明singleton默认单实例IoC 容器启动时创建 Bean懒加载除外全局仅一个实例prototype多实例每次从容器获取 Bean 时都会重新执行Bean方法创建新实例requestWeb 环境每个 HTTP 请求创建一个新实例sessionWeb 环境每个 HTTP Session 创建一个新实例举例1、创建一个UserConfig配置类Configuration,然后在其中定义bean Bean(userhaha)再指定为多实例 Scope(prototype)Configuration public class UserConfig { Bean(userhaha) Scope(prototype) public User user01(){ var usernew User(); user.setId(1); user.setName(张三); return user; } } 在启动类中测试beanuserhaha是单例还是多例。SpringBootApplication MapperScan(org.example.mybatisdemo.mapper) public class MybatisDemoApplication { public static void main(String[] args) { var iocSpringApplication.run(MybatisDemoApplication.class, args); /*for(String name:ioc.getBeanDefinitionNames()){ System.out.println(name); }*/ Object userHaha1ioc.getBean(userhaha); Object userHaha2ioc.getBean(userhaha); System.out.println(userHaha1userHaha2); } }注解 / 配置核心作用实例数量执行结果你的代码Bean(userhaha)注册 Bean 并指定名称取决于 Scope-Scope(prototype)多实例作用域每次 getBean 新实例userHaha1userHaha2 → false默认无 Scope单实例作用域singleton全局唯一实例userHaha1userHaha2 → trueComponent上篇博客已介绍过。Import1、作用在 Spring 的开发场景中我们通常使用 Component、Service 或 Bean 来将类注册到 IoC 容器。但这些方式都有局限性Component 系列必须能修改目标类的源码添加注解。Bean 方法需要在配置类中手写实例化代码对于大量类或复杂构造函数显得繁琐。Import的出现正是为了解决以下痛点第三方类无源码如 Druid 连接池中的FastsqlException你无法在其源码上加Component。批量快速注册需要一次性将多个工具类或配置类导入容器而不想写一堆Bean方法。解耦配置将组件的扫描与定义分离实现模块化配置。一句话定义Import是 Spring 提供的一种“直通式”注册机制它允许开发者直接将指定的 Class 对象“硬塞”进 IoC 容器无需目标类配合也无需手动编写工厂方法。2、工作原理当 Spring 容器启动并扫描到带有 Import(XXX.class) 的配置类时它会直接实例化 XXX 类调用其默认构造函数并将其作为 Bean 注册到容器中。3、组件命名规则这是 Import 与普通 Component 最大的区别之一默认名称目标类的全限定名Full Qualified Name。例如导入 com.alibaba.druid.FastsqlException其在容器中的 Bean ID 默认为 com.alibaba.druid.FastsqlException。条件注解ConditionalOnXxxConditionalOnClass如果类路径中存在这个类则触发指定⾏为ConditionalOnMissingClass如果类路径中不存在这个类则触发指定⾏为ConditionalOnBean如果容器中存在这个Bean组件则触发指定⾏为ConditionalOnMissingBean如果容器中不存在这个Bean组件则触发指定⾏为ConditionalOnBeanvalue组件类型name组件名字判断容器中是否有这个类型的组件并且名字是指定的值场景 ● 如果存在 FastsqlException 这个类给容器中放⼀个 Cat 组件名cat01 ● 否则就给容器中放⼀个 Dog 组件名dog01 ● 如果系统中有 dog01 这个组件就给容器中放⼀个 User组件名zhangsan ● 否则就放⼀个User名叫lisiConfiguration public class AppConfig { ConditionalOnClass(namecom.alibaba.druid.FastsqlException) Bean public Cat cat01(){ return new Cat(); } ConditionalOnMissingClass(com.alibaba.druid.FastsqlException) Bean public Dog dog01(){ return new Dog(); } } 启动类中 SpringBootApplication MapperScan(org.example.mybatisdemo.mapper) public class MybatisDemoApplication { public static void main(String[] args) { for (String s : ioc.getBeanNamesForType(Cat.class)) { System.out.println(cat:s); } for (String s : ioc.getBeanNamesForType(Dog.class)) { System.out.println(dog:s); } } }总结1、本文首先介绍了springboot的组件注册Bean;Component;ImPort1)介绍了bean的作用自定义bean作用名的方式默认是方法名还分享了Scope的作用用于指定 Bean 的作用域指明 Spring 容器创建 Bean 实例的数量和时机介绍四种作用域singleton默认,prototype,request,session)及其说明。2还介绍了Import的作用向 IoC 容器注册组件解决Component和Bean的局限工作原理组件命名规则目标类的全限定名2、还列出了一些条件注解ConditionalOnXxxConditionalOnClassConditionalOnMissingClassConditionalOnBean等等并举了一个例子来演示ConditionalOnClass和ConditionalOnMissingClass注册组件的使用。3、并介绍了如何在配置文件中为一个java对象赋值将其注册为bean再使用ConfigurationProperties指定前缀
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2411641.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!