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对象。

查看条件注解源码

6362edb4872446e6a8b9e0eac74a2449


SpringBoot 提供的常用条件注解:

ConditionalOnProperty:判断配置文件中是否有对应属性和值才初始化Bean

ConditionalOnClass:判断环境中是否有对应字节码文件才初始化Bean

ConditionalOnMissingBean:判断环境中没有对应Bean才初始化Bean

SpringBoot自动配置-切换内置web服务器

查看继承关系图

b74673e7894b4c9ebdefa40564336581
1b9df1801e5c42b0afcaa29c6f0f2b14

排除Tomcat

f5559320c97346c1b8b434878e684ebf


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 {
253e9669432b4fb8b9a33790dbaa37d6

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);    }}
4a27e094951e40e7a709907000ab3d32


Import4中用法:

1.导入Bean

  • 2.导入配置类
  • 3.导入ImportSelector的实现类。
  • 4.导入ImportBeanDefinitionRegistrar实现类

自定义依赖

969d4344b7d241e4a737a183e7383bb9

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...项目启动失败");    }}
d57d6f26b0874d1b912c06dd82ef74cf

Springboot Admin图形化管理平台

409a1e82a2b6460aa55562339120c8c8


以后可以server打成jar包,然后其他服务通过端口去绑定注册

Springboot 部署

部署有两个方式
1.通过maven或者命令直接打成jar包,通过cmd,直接运行jar包即可
2.通过war包启动,pom.xml里加入war,主文件继承SpringBootServletInitializer,重写方法,即可

e88354a4929d417d83489c2fbfdcf4ab

SpringBoot流程分析

初始化

  1. 配置启动引导类(判断是否有启动主类)
  2. 判断是否是Web环境
  3. 获取初始化类、监听器类
18adb213125e4d288571a82bd4a08af3


run

  1. 启动计时器
  2. 执行监听器
  3. 准备环境
  4. 打印banner:可以resource下粘贴自定义的banner

5.创建context

  1. refreshContext(context);
  2. 执行refreshContext方法后才真正创建Bean
3a2da31a66514370a000b178c7c363d5

最后给个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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/245154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

golang延时_golang 实现延迟消息原理与方法

实现延迟消息具体思路我是看的下面这篇文章https://mp.weixin.qq.com/s/eDMV25YqCPYjxQG-dvqSqQ实现延迟消息最主要的两个结构:环形队列:通过golang中的数组实现,分成3600个slot。任务集合:通过map[key]*Task,每个slot…

python特征工程插件_手把手教你用Python实现自动特征工程

任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置。 特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程。Prateek Joshi,是一名数据科学家,花了…

2020笔记本性价比之王_笔记本电脑性价比排行2020前十名?

展开全部1、 联想(Lenovo)拯救者R7000产品材质:32313133353236313431303231363533e58685e5aeb931333433656631ABCD面塑料产品尺寸:15.6寸CPU型号: AMD Ryzen5 4600H显卡型号:NVIDIA GeForce GTX 1650屏幕参数: 1080P I…

ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...

3月10日消息,王者荣耀在更新正式服后,安卓版和iOS版开通了资料互看。此前安卓和iOS上的游戏一直因为使用的服务器不同,不能实现两个平台的游戏互动,当然也不能实现同账号的资料同步。这对很多玩家来说造成一定的困扰,如…

存储型xss漏洞怎么解决_FinDOMXSS:一款针对DOM型XSS漏洞的快速扫描工具

FinDOM-XSSFinDOM-XSS是一款针对DOM型XSS漏洞的快速扫描工具,广大安全研究人员可以利用FinDOM-XSS快速地发现/扫描出目标应用中潜在的DOM型XSS漏洞。工具安装广大研究人员可以使用下列命令将该项目源码克隆至本地:$ git clone https://github.com/dwisis…

c语言如何判断数据是否符合正态分布_统计学里的数据正态性检验

在前面的文章中讲过,很多模型的假设条件都是数据是服从正态分布的。这篇文章主要讲讲如何判断数据是否符合正态分布。主要分为两种方法:描述统计方法和统计检验方法。01.描述统计方法描述统计就是用描述的数字或图表来判断数据是否符合正态分布。常用的方…

python matplotlib_Python の Matplotlib

matplotlib是python优秀的数据可视化第三方库。matplotlib.pyplot子库可以调用全部功能,便于用户使用。绘图-plt.plot(x,y,format,**kwargs)x:x轴数据y:y轴数据format_string:控制曲线的格式字符串,颜色线条点**kwargs…

mysql 数据库还原 不齐_请教mysql数据库还原问题。

你的位置:问答吧-> 数据库-> 问题详情请教mysql数据库还原问题。50多m,能不能拆分?上传到服务器上总是超时。怎么办?[ 本帖最后由 geniux 于 2007-9-24 15:23 编辑 ]作者: geniux发布时间: 2007-09-20继续请教,现在数据库传…

python self理解_Python面向对象总结,让你快速掌握面向对象常用的用法

python等面向对象的提出是为了更好的处理和管理同属一个类别的事情,这样就可以省去多余重复的基础代码,让程序变得更加简洁和强大。对于学习编程的朋友来说,熟悉掌握面向对象是非常重要的。下面开始讲讲关于python面向对象的知识,…

mysql 查询 汇总_Mysql-Sql查询汇总

软件测试Mysql-Sql查询汇总简单查询创建students表create table students(id int not null unique primary key auto_increment,name varchar(10) not null,class varchar(10) not null,grade int)添加数据insert into students values(0,老1,1班,80);insert into students val…

pat和ccf哪个含金量高_函授和网络教育哪个好 哪个含金量高

函授和网络教育都是成人教育学习的方式,但是考生报考的时候选择哪个比较好,下面小编整理了相关信息,以供参考。一、函授好还是网络教育好其实这两种教育方式都各有各的优点,两者都是不可替代的,这两种方式对于不同阶段…

mysql各种联结的区别_mysql几种连接方式区别

mysql的几种join2017年03月19日 14:49:07 carl-zhao 阅读数:7845 标签: mysqlsqljoin 更多个人分类: MySQL版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012410733/article/details/63…

python和office_Python在office开发中的应用

Python with Excel 有几个很好的Python模块能够方便地操作Excel的数据,包括读与写,不要求本地安装Excel。例如pandas, openpyxl, xlrd, xlutils 和 pyexcel. 详情可以参考下面的介绍: https://www.datacamp.com/community/tutorials/python-e…

android通过用户名密码访问服务器获取信息_MySQL ------ 管理用户对数据库的访问控制(GRANT 与 REVOKE)(二十九)...

数据库服务器通常包含着关键的数据,所以为了确保这些数据的安全和完整需要要利用访问控制。MySQL服务器的安全基础是:用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据具有访问权)访…

mysql安全补丁如何处理_3分钟学会mysql数据库的逻辑架构原理

这篇文章主要是从mysql数据库的逻辑架构来认识掌握mysql的原理。只要是稍微有一点计算机的相关知识相信都能看明白。一、笼统的逻辑架构先给出一张逻辑架构图,这张图是让你从宏观的角度来分析认识一下。从这张图你可以获取到如下的信息:(1&am…

onclick 源码_仿照React源码流程打造90行代码的Hooks

作者:苏畅转发链接:https://mp.weixin.qq.com/s/YLSD4IojDWTPlov_RQtVAA前言你可能已经看过其它简易的Hooks实现。那么本文和其它实现有什么区别呢?本文的实现完全参照React源码的运行流程。学懂本文,去看React源码,你…

java写一个窗体并连接MySQL_大神帮忙写一个简单地java页面,连接MySQL数据库之后能够显示数据库上的数据...

展开全部用jdbc 连接mysql数据库就行了,网上搜下一大把。--记得在classpath下加入mysql 的jdbc驱动包。/*** author :来e68a84e8a2ad3231313335323631343130323136353331333337386636自互联网*/import java.sql.DriverManager;import java.sql.ResultSet…

java break 在if 中使用_java中使用国密SM4算法详解

前言上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。ps:我们既可以基…

移动web前端开发框架_移动前端开发是Web前端开发吗?

移动端开发并不是Web前端开发,但移动前端开发和web前端开发其实都属于前端开发的范围,目前前端发展的趋势就是大前端,可以说是包罗万象。但不论趋势如何发展,目前来看HTML、CSS和JavaScript依然是整个前端开发的三大基石。所以不论…

mtk一键usb驱动_三菱MRJEB驱动器报错,导致报错原因37.1参数设置范围异常?

三菱MR-JE-B驱动器报错,导致报错原因37.1参数设置范围异常?最近海蓝机电工程师们在做一个项目,做的是三菱MR-JE-B驱动器。工程师们在实操这个项目过程中遇到各种问题,其中就像驱动器报错的问题,导致报错的原因显示37,1…