springboot手动装配
一 自定义@Enable模块
【1】、基于注解驱动实现
1、建一个config类
public class HelloWorldConfig {@BeanLfh lfh () {System.out.println("-------------->初始化");return new Lfh();}
}
public class Lfh {public String hi() {return "hello world";}
}
2、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({HelloWorldConfig.class}) //HelloWorldConfig 自定义的配置类
public @interface HelloWorld {}
3、装配
@HelloWorld //自定义注解 启动时装配
@SpringBootApplication
public class SpringbootLearnApplication {public static void main(String[] args) {SpringApplication.run(SpringbootLearnApplication.class, args);}}
4、这样在项目中可以直接使用了
@AutowiredLfh lfh;@GetMapping("/hi")public String hi() {return lfh.hi();}
5、启动项目
输出
PS:可参考@EnableWebMvc注解。
【2】、基于接口驱动实现
1、再建一个类
public class HelloWorldConfig2 {@BeanLfh lfh () {System.out.println("-------------->初始化");return new Lfh();}
}
2、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({HelloWorldConfigSelecltor.class}) //HelloWorldConfigSelecltor 自定义的配置类
public @interface HelloWorldSelector {boolean isLinux() default false;
}
3、选择性装配 ,新建config类,引入ImportSelector接口
//选择性装配
public class HelloWorldConfigSelecltor implements ImportSelector{@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {Map<String, Object> attributesMap = annotationMetadata.getAnnotationAttributes(HelloWorldSelector.class.getName());//获取接口中islinux值,根据不同的值装配不同的配置boolean islinux = (boolean) attributesMap.get("isLinux");if(islinux) {return new String[]{HelloWorldConfig.class.getName()};} else {return new String[]{HelloWorldConfig2.class.getName()};}}
}
4、装配
//@HelloWorld //自定义注解 启动时装配
//isLinux = false ,装配HelloWorldConfig2
@HelloWorldSelector(isLinux = false)
@SpringBootApplication
public class SpringbootLearnApplication {public static void main(String[] args) {SpringApplication.run(SpringbootLearnApplication.class, args);}}
5、启动项目
PS : 参考@EnableCaching注解
二 、条件装配
实现Condition接口,并实现matches()方法,如果matches方法返回true,那么带有@Conditional注解的bean就会装载,false就不会装载
1、自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
@Documented
@Conditional({OnSystemCondition.class}) //这里不再是Import接口,而是Conditional
public @interface ConditionalSystem {String system();
}
2、新建配置类
public class OnSystemCondition implements Condition {@Overridepublic boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {Map<String, Object> attributesMap = annotatedTypeMetadata.getAnnotationAttributes(ConditionalSystem.class.getName());System.out.println("------------------?system-->" + attributesMap.get("system"));//条件配置,返回true是才装配return "linux".equals(attributesMap.get("system").toString());}
}
3、在HelloWorldConfig类和HelloWorldConfig2类上使用注解
@ConditionalSystem(system = "windows") //条件装配
public class HelloWorldConfig {@ConditionalSystem(system = "linux") //条件装配
public class HelloWorldConfig2 {
4、运行逻辑
首先根据@HelloWorldSelector(isLinux = false) 选择加载 HelloWorldConfig2,
再根据HelloWorldConfig上的@ConditionalSystem(system = “linux”) 的system = "linux"的条件进行判断,true加载,false不加载。
PS:参考@ConditionalOnBean注解。
springboot手动装配相关推荐
- 【SpringBoot】Spring手动装配和SpringBoot自动装配
文章目录 1. Warm up 1.1 setter注入 1.2 构造器注入 1.3 属性注入 2. Warm up again 2.1 基于XML的配置 2.2 基于JavaConfig类的配置 3 ...
- 刨析 SpringBoot 自动装配原理,其实很简单
J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...
- springboot手动提交kafka offset
转载自 springboot手动提交kafka offset enable.auto.commit参数设置成了false 但是测试发现enable.auto.commit参数设置成了false,kaf ...
- Springboot自动装配源码分析
Springboot自动装配源码分析 1.从@SpringbootApplication点进去 2.可以看到核心的三个注解 @SpringbootConfiguration @EnableAutoCo ...
- 手写springboot自动装配 autoConfiguration
springboot自动装配 + java敏感词匹配 1. 项目准备 deploy项目 : https://gitee.com/hctrl/deploy word-spring-boot-start ...
- 【理解springboot自动装配原理】
理解springboot自动装配原理: 最近读了小马哥(mercyblitz)Springboot编程思想(核心篇),有了一些心得和感悟,分享给大家: 1. 官网介绍了激活自动装配的方法: * 文档提 ...
- 淘宝(SpringBoot自动装配原理)
什么是 SpringBoot 自动装配 通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能 SpringBoot 是如何实现自动装配的 SpringBoot 的核心注解 S ...
- SpringBoot自动装配原理浅析
Springboot自动装配原理 SpringBoot是当下J2EE最为流行的框架,它有着轻量,快捷等特点,让程序员们可以专注在业务逻辑的编写上,而不用花太多的力气在一些环境的配置,整合组件的配置上面 ...
- 面试终极宝典:Springboot自动装配原理
Springboot的自动装配过程,网上大多都是罗列代码,即使看完了,也还存在很多的疑点.下面,这是我总结的在面试过程中介绍SpringBoot自动装配原理的话术,拿来即用就可. Springboot ...
最新文章
- 【Angular4】英雄指南demo
- java对象深入理解
- python简单代码input-python基础 input()函数
- C指针--通过二级指针往回拉数据
- linux游戏脚本,ubuntu 新手一键配置脚本
- 【LeetCode从零单排】No198.House Robber No91.Decode Ways139 word break(动态规划典型应用)
- etcd和mysql_etcd和redis比较
- 有意思的 Node.js 内存泄漏问题
- Redis哨兵的详解
- c++思维导图_40+张最全Linux/C/C++思维导图,你确定不收藏?
- Java的代码书写规范
- mysql collate
- LeetCode 46. Permutations
- 【数据分享】滤泡性淋巴瘤研究数据集
- 基于深度学习的银行卡号识别
- 深度讲解如何发挥出文章title标题的作用
- RC时间常数 积分微分 耦合
- Ubuntu18.04下快速的安装UHD与GnuRadio并连接USRP设备
- 一键GHOST光盘版官方版
- rangeOfString
热门文章
- Diamond 3.5简易教程(二)------软件的简单使用
- 数字图像处理与Python实现-颜色空间转换-RGB颜色空间与HSL颜色转换
- 信捷总线11轴伺服程序,本人原创,客户设备完美运行,plc程 序框架逻辑很顺畅,梯形图只有逻辑程序,不包含任何运算,运用大量c语言完美简化程序
- 基于web得数字媒体资源库系统
- ROS学习笔记63《arduino 红外测距仪》
- 产生式推理的简单识别系统
- pip安装wxpython报错traceback_使用源码编译wxpython-基于python2.7
- 长城出手!5年1000亿+1万人软件团队,吹响“决战2025”集结号
- Linux 代理 http 和 socks 配置区别
- FastDFS上传下载文件