一 自定义@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手动装配相关推荐

  1. 【SpringBoot】Spring手动装配和SpringBoot自动装配

    文章目录 1. Warm up 1.1 setter注入 1.2 构造器注入 1.3 属性注入 2. Warm up again 2.1 基于XML的配置 2.2 基于JavaConfig类的配置 3 ...

  2. 刨析 SpringBoot 自动装配原理,其实很简单

    J3 SpringBoot # 源码 # 自动装配 一日我在愉快得遨游时,看到有鱼友在问:SpringBoot 中引入了 Nacos 依赖为啥就可以直接使用 Nacos 中的相关功能呀! 认真思考了一 ...

  3. springboot手动提交kafka offset

    转载自 springboot手动提交kafka offset enable.auto.commit参数设置成了false 但是测试发现enable.auto.commit参数设置成了false,kaf ...

  4. Springboot自动装配源码分析

    Springboot自动装配源码分析 1.从@SpringbootApplication点进去 2.可以看到核心的三个注解 @SpringbootConfiguration @EnableAutoCo ...

  5. 手写springboot自动装配 autoConfiguration

    springboot自动装配 + java敏感词匹配 1. 项目准备 deploy项目 :  https://gitee.com/hctrl/deploy word-spring-boot-start ...

  6. 【理解springboot自动装配原理】

    理解springboot自动装配原理: 最近读了小马哥(mercyblitz)Springboot编程思想(核心篇),有了一些心得和感悟,分享给大家: 1. 官网介绍了激活自动装配的方法: * 文档提 ...

  7. 淘宝(SpringBoot自动装配原理)

    什么是 SpringBoot 自动装配 通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能 SpringBoot 是如何实现自动装配的 SpringBoot 的核心注解 S ...

  8. SpringBoot自动装配原理浅析

    Springboot自动装配原理 SpringBoot是当下J2EE最为流行的框架,它有着轻量,快捷等特点,让程序员们可以专注在业务逻辑的编写上,而不用花太多的力气在一些环境的配置,整合组件的配置上面 ...

  9. 面试终极宝典:Springboot自动装配原理

    Springboot的自动装配过程,网上大多都是罗列代码,即使看完了,也还存在很多的疑点.下面,这是我总结的在面试过程中介绍SpringBoot自动装配原理的话术,拿来即用就可. Springboot ...

最新文章

  1. 【Angular4】英雄指南demo
  2. java对象深入理解
  3. python简单代码input-python基础 input()函数
  4. C指针--通过二级指针往回拉数据
  5. linux游戏脚本,ubuntu 新手一键配置脚本
  6. 【LeetCode从零单排】No198.House Robber No91.Decode Ways139 word break(动态规划典型应用)
  7. etcd和mysql_etcd和redis比较
  8. 有意思的 Node.js 内存泄漏问题
  9. Redis哨兵的详解
  10. c++思维导图_40+张最全Linux/C/C++思维导图,你确定不收藏?
  11. Java的代码书写规范
  12. mysql collate
  13. LeetCode 46. Permutations
  14. 【数据分享】滤泡性淋巴瘤研究数据集
  15. 基于深度学习的银行卡号识别
  16. 深度讲解如何发挥出文章title标题的作用
  17. RC时间常数 积分微分 耦合
  18. Ubuntu18.04下快速的安装UHD与GnuRadio并连接USRP设备
  19. 一键GHOST光盘版官方版
  20. rangeOfString

热门文章

  1. Diamond 3.5简易教程(二)------软件的简单使用
  2. 数字图像处理与Python实现-颜色空间转换-RGB颜色空间与HSL颜色转换
  3. 信捷总线11轴伺服程序,本人原创,客户设备完美运行,plc程 序框架逻辑很顺畅,梯形图只有逻辑程序,不包含任何运算,运用大量c语言完美简化程序
  4. 基于web得数字媒体资源库系统
  5. ROS学习笔记63《arduino 红外测距仪》
  6. 产生式推理的简单识别系统
  7. pip安装wxpython报错traceback_使用源码编译wxpython-基于python2.7
  8. 长城出手!5年1000亿+1万人软件团队,吹响“决战2025”集结号
  9. Linux 代理 http 和 socks 配置区别
  10. FastDFS上传下载文件