springboot 获取bean_SpringBoot高级(自动配置 事件监听 监控)
SpringBoot自动配置
condition-1
Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载相应的Bean
@Conditional要配和Condition的实现类(ClassCondition)进行使用
- ClassCondition
public class ClassCondition implements Condition { /** * * @param context 上下文对象。用于获取环境,IOC容器,ClassLoader对象 * @param metadata 注解元对象。 可以用于获取注解定义的属性值 * @return */ @Override public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //1.需求: 导入Jedis坐标后创建Bean //思路:判断redis.clients.jedis.Jedis.class文件是否存在 boolean flag = true; try { Class> cls = Class.forName("redis.clients.jedis.Jedis"); } catch (ClassNotFoundException e) { flag = false; } return flag; }}
UserConfig
@Configurationpublic class UserConfig { @Bean @Conditional(ClassCondition.class) public User user(){ return new User(); }}
测试
@SpringBootApplicationpublic class SpringbootConditionApplication { public static void main(String[] args) { //启动SpringBoot的应用,返回Spring的IOC容器 ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args); Object user = context.getBean("user"); System.out.println(user); }}
依赖
redis.clients jedis
这一段是判断jedis这个依赖要有没有来决定是否生成对应的bean对象,需要实现Condition接口,重写mathes方法,返回false则不创建对象,在这个user对象上加入注解@Conditioal(xxx.class)来实现判断。
Condition-2
需求:将类的判断定义为动态的。判断哪个字节码文件存在可以动态指定。
自定义条件注解类
import org.springframework.context.annotation.Conditional;import java.lang.annotation.*;@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documented@Conditional(ClassCondition.class)public @interface ConditionOnClass { String[] value();}
**注意:**此处@ConditionOnClass为自定义注解
@Configurationpublic class UserConfig { @Bean //@Conditional(ClassCondition.class) @ConditionOnClass("com.alibaba.fastjson.JSON") public User user(){ return new User(); } @Bean @ConditionalOnProperty(name = "itcast",havingValue = "ii") public User user2(){ return new User(); }}
测试User对象的创建
@SpringBootApplicationpublic class SpringbootConditionApplication { public static void main(String[] args) { //启动SpringBoot的应用,返回Spring的IOC容器 ConfigurableApplicationContext context = SpringApplication.run(SpringbootConditionApplication.class, args); Object user = context.getBean("user"); System.out.println(user); }}
- 自定义注解其实是对原来注解的封装
- @ConditionalOnProperty是看配置文件中是否存在一个这样的键值对,如果有则创建、
-执行顺序:
@ConditionOnClass的value值,找到依赖和自定义注解类,通过自定义注解类上的class找到具体要执行的代码,决定是否生成bean对象。
查看条件注解源码
SpringBoot 提供的常用条件注解:
ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean
ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean
ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean
SpringBoot自动配置-切换内置web服务器
查看继承关系图
排除Tomcat
pom文件中的排除依赖效果
org.springframework.boot spring-boot-starter-web spring-boot-starter-tomcat org.springframework.boot spring-boot-starter-jetty org.springframework.boot
SpringBoot自动配置-Enable注解原理
SpringBoot不能直接获取在其他工程中定义的Bean
演示代码:
springboot-enable工程
/** * @ComponentScan 扫描范围:当前引导类所在包及其子包 * * com.itheima.springbootenable * com.itheima.config * //1.使用@ComponentScan扫描com.itheima.config包 * //2.可以使用@Import注解,加载类。这些类都会被Spring创建,并放入IOC容器 * //3.可以对Import注解进行封装。 *///@ComponentScan("com.itheima.config")//@Import(UserConfig.class)@EnableUser@SpringBootApplicationpublic class SpringbootEnableApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringbootEnableApplication.class, args); //获取Bean Object user = context.getBean("user"); System.out.println(user); }}
pom中引入springboot-enable-other
com.itheima springboot-enable-other 0.0.1-SNAPSHOT
springboot-enable-other工程
UserConfig
@Configurationpublic class UserConfig { @Bean public User user() { return new User(); }}
EnableUser注解类
import org.springframework.context.annotation.Import;import java.lang.annotation.*;@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(UserConfig.class)public @interface EnableUser {
myImportSelector
public class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { return new String[]{"com.itheima.domain.User", "com.itheima.domain.Role"}; } }
ImportBeanDefinitionRegistrar 实现类
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition(); registry.registerBeanDefinition("user", beanDefinition); }}
Import4中用法:
1.导入Bean
- 2.导入配置类
- 3.导入ImportSelector的实现类。
- 4.导入ImportBeanDefinitionRegistrar实现类
自定义依赖
SpringBoot事件监听
Java中的事件监听机制定义了以下几个角色:
①事件:Event,继承 java.util.EventObject 类的对象
②事件源:Source ,任意对象Object
③监听器:Listener,实现 java.util.EventListener 接口 的对象
SpringBoot 在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作。
- ApplicationContextInitializer、
- SpringApplicationRunListener、
- CommandLineRunner、
- ApplicationRunner自定义监听器的启动时机:MyApplicationRunner和MyCommandLineRunner都是当项目启动后执行,使用@Component放入容器即可使用
MyApplicationRunner
/** * 当项目启动后执行run方法。 */@Componentpublic class MyApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("ApplicationRunner...run"); System.out.println(Arrays.asList(args.getSourceArgs())); }}
MyCommandLineRunner
@Componentpublic class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("CommandLineRunner...run"); System.out.println(Arrays.asList(args)); }}
MyApplicationContextInitializer的使用要在resource文件夹下添加META-INF/spring.factories
org.springframework.context.ApplicationContextInitializer=com.itheima.springbootlistener.listener.MyApplicationContextInitializer
@Componentpublic class MyApplicationContextInitializer implements ApplicationContextInitializer { @Override public void initialize(ConfigurableApplicationContext applicationContext) { System.out.println("ApplicationContextInitializer....initialize"); }}
MySpringApplicationRunListener的使用要添加构造器(最屌)
public class MySpringApplicationRunListener implements SpringApplicationRunListener { public MySpringApplicationRunListener(SpringApplication application, String[] args) { } @Override public void starting() { System.out.println("starting...项目启动中"); } @Override public void environmentPrepared(ConfigurableEnvironment environment) { System.out.println("environmentPrepared...环境对象开始准备"); } @Override public void contextPrepared(ConfigurableApplicationContext context) { System.out.println("contextPrepared...上下文对象开始准备"); } @Override public void contextLoaded(ConfigurableApplicationContext context) { System.out.println("contextLoaded...上下文对象开始加载"); } @Override public void started(ConfigurableApplicationContext context) { System.out.println("started...上下文对象加载完成"); } @Override public void running(ConfigurableApplicationContext context) { System.out.println("running...项目启动完成,开始运行"); } @Override public void failed(ConfigurableApplicationContext context, Throwable exception) { System.out.println("failed...项目启动失败"); }}
Springboot Admin图形化管理平台
以后可以server打成jar包,然后其他服务通过端口去绑定注册
Springboot 部署
部署有两个方式
1.通过maven或者命令直接打成jar包,通过cmd,直接运行jar包即可
2.通过war包启动,pom.xml里加入war,主文件继承SpringBootServletInitializer,重写方法,即可
SpringBoot流程分析
初始化
- 配置启动引导类(判断是否有启动主类)
- 判断是否是Web环境
- 获取初始化类、监听器类
run
- 启动计时器
- 执行监听器
- 准备环境
- 打印banner:可以resource下粘贴自定义的banner
5.创建context
- refreshContext(context);
- 执行refreshContext方法后才真正创建Bean
最后给个banner
1
${AnsiColor.BRIGHT_GREEN}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$${AnsiColor.BRIGHT_YELLOW}$$ _.ooOoo._ $$${AnsiColor.BRIGHT_RED}$$ o888888888o $$${AnsiColor.BRIGHT_CYAN}$$ 88" . "88 $$${AnsiColor.BRIGHT_MAGENTA}$$ (| ^_^ |) $$${AnsiColor.BRIGHT_GREEN}$$ O = /O $$${AnsiColor.BRIGHT_RED}$$ ____/`-----'____ $$${AnsiColor.BRIGHT_CYAN}$$ .' | |$$ `. $$${AnsiColor.BRIGHT_MAGENTA}$$ / ||| : |||$$ $$${AnsiColor.BRIGHT_GREEN}$$ / _||||| -:- |||||- $$${AnsiColor.BRIGHT_YELLOW}$$ | | - $$/ | | $$${AnsiColor.BRIGHT_GREEN}$$ | _| ''-----/'' | | $$${AnsiColor.BRIGHT_YELLOW}$$ .-___ `-` ____/-. / $$${AnsiColor.BRIGHT_CYAN}$$ ___`. .' /--.-- `. . ___ $$${AnsiColor.BRIGHT_RED}$$ ."" '_/____.' >'"". $$${AnsiColor.BRIGHT_GREEN}$$ | | : `- `.;`. _ /``;.`/ - ` : | | $$${AnsiColor.BRIGHT_YELLOW}$$ `-. _ ___ /___ _/ .-` / / $$${AnsiColor.BRIGHT_CYAN}$$ ========`-.____`-._________/____.-`____.-'======== $$${AnsiColor.BRIGHT_MAGENTA}$$ `=---=' $$${AnsiColor.BRIGHT_YELLOW}$$ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ $$${AnsiColor.BRIGHT_GREEN}$$ 佛祖保佑 永无BUG 永不修改 $$${AnsiColor.BRIGHT_YELLOW}$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$${AnsiColor.BRIGHT_YELLOW}
2
${AnsiColor.BRIGHT_GREEN}/***${AnsiColor.BRIGHT_YELLOW}* ┌─┐ ┌─┐ + +${AnsiColor.BRIGHT_GREEN} * ┌──┘ ┴───────┘ ┴──┐++${AnsiColor.BRIGHT_YELLOW} * │ │${AnsiColor.BRIGHT_YELLOW} * │ ─── │++ + + +${AnsiColor.BRIGHT_BLACK} * ███████───███████ │+${AnsiColor.BRIGHT_GREEN} * │ │+ * │ ─┴─ │ * │ │ * └───┐ ┌───┘ ${AnsiColor.BRIGHT_GREEN}* │ │ * │ │ + + * │ │ * │ └──────────────┐ * │ │ * │ ├─┐ * │ ┌─┘ * │ │ * └─┐ ┐ ┌───────┬──┐ ┌──┘ + + + + * │ ─┤ ─┤ │ ─┤ ─┤ * └──┴──┘ └──┴──┘ + + + + * 神兽保佑 * 代码无BUG! */
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:
http://blog.csdn.net/m0_46690280/article/details/108567548
springboot 获取bean_SpringBoot高级(自动配置 事件监听 监控)相关推荐
- SpringBoot核心原理:自动配置、事件驱动、Condition
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/l6108003/article/ details/106966386 前言 SpringBoot是Spring的包装,通过自动 ...
- SpringBoot重点详解--事件监听
目录 自定义事件监听 Springboot 启动事件监听 Springboot 事件监听为 Bean 与 Bean 之间的消息通信提供支持:当一个 Bean 做完一件事以后,通知另一个 Bean 知晓 ...
- java框架之SpringBoot(5)-SpringMVC的自动配置
本篇文章内容详细可参考官方文档第 29 节. SpringMVC介绍 SpringBoot 非常适合 Web 应用程序开发.可以使用嵌入式 Tomcat,Jetty,Undertow 或 Netty ...
- [Flex]Flex编程注意之自动获取焦点、监听全局键盘事件
http://www.k-zone.cn/zblog/post/flex-air-auto-set-focus.html 这是<Flex第一步>群里面一个朋友问我的问题,特此拿出分享一下. ...
- springBoot启动事件监听机制
springBoot启动之事件监听机制源码解析 1. Java的事件监听机制 在进行正式的分析之前,先介绍一下Java的事件监听机制.参考05–SpringBoot启动之事件监听机制 Java事件监听 ...
- Jquery系列:checkbox 获取值、选中、设置值、事件监听等操作
<div id="divId" class="divTable"><div class="tableBody">&l ...
- java怎么设置不同事件_activiti 全局流程监听ActivitiEventListener,实现监听不同类型事件,不需要在acitivit中配置任务监听,非常方便...
如果我们像给任务配置监听,按照常规的做法是这样的 一个个配置,比较麻烦. 现在利用ActivitiEventListener,监听全局事件,并且可以判断不同的事件类型,进而执行不同的业务逻辑. 1.定 ...
- Springboot事件监听机制:工作原理
目录 前言 1.观察者模式 1.1观察者模式的核心元素 1.2观察者模式的工作流程 2.springboot事件监听机制的基本工作原理 2.1事件发布器是什么时候在哪里产生的呢? 2.2事件监听器是什 ...
- 微信公众号获取事件监听
微信公众号获取事件监听 使用到的工具类 XML (MessageUtil) 实体类(TextMessage) /*** 验证消息来自于服务器** @param signature* @param ti ...
最新文章
- Deepbox网络结构
- 人工智能基础-算法工程师为什么要懂线性代数?
- Python常用的模块和简单用法
- CodeForces - 165E Compatible Numbers(SOSdp)
- 【最新合集】PAT乙级最优题解(题解+解析+代码)
- 数据库范式(1NF 2NF 3NF BCNF)详解
- flink开发案例_为什么说 Flink + AI 值得期待?
- phpcms 轮播图 (posid推荐位 )调用 - 代码篇
- 计算机未来发展的5个前景,学习成绩普通,高考志愿填报不妨考虑这5个专业,未来发展很不错...
- 2018ACM-ICPC南京赛区网络赛: J. Sum(积性函数前缀和)
- 体表面积在线计算机,体表面积计算器
- Sentaurus TCAD 2013安装包下载
- 简单银行账户管理系统
- 子曰:中庸之为德也,其至矣乎!民鲜久矣。
- Gartner2015新兴技术炒作曲线图
- 【C++学习笔记】迭代器和数组
- Python中len()和range()函数
- LeetCode 6036. 构造字符串的总得分和
- android学习总结(一)
- hadoop实战(一)
热门文章
- 配置库用户_GEE学习笔记 六十八:【GEE之Python版教程二】配置Python开发环境
- mysql平台workb_MySQL:MySQL Workbench的使用
- python的socket编程执行顺序_Python篇-Socket网络编程
- k5b型计算机联锁知识,DS6-K5B计算机联锁系统日常维护注意事项
- 阿里妈妈技术团队5篇论文入选 SIGIR 2022!
- mysql group函数_MySQL函数:group_concat()函数
- 『设计模式』一句话教你分清楚UML组合聚合和联系!
- 数学--数论--积性函数(初步)
- springboot + kafka
- 各种光源(灯)的光谱