zoukankan      html  css  js  c++  java
  • springboot高级(条件注解 Enable*注解 自动配置 事件监听 监控actuator)

     

    1.SpringBoot 提供的常用条件注解:

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

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

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

        条件注解源码位置:

         示例:当配置文件中有 xin = laoyang 时,才创建User对象的Bean。

    @Configuration
    public class UserConfig {
    
        @Bean
        @ConditionalOnProperty(name = "xin",havingValue = "laoyang")
        public User user2(){
            return new User();
        }
    
    }

     2.SpringBoot 切换内置的web容器:

     springboot内置了4种web容器可供切换 spring-boot-autoconfigure-2.2.8.RELEASE.jar

        切换方式: 示例切换到jetty容器

        添加排除时,也可以在org.springframework.boot右键Diagrams-->Show Dependencies...找到spring-boot-starter-tomcat右键Exclude

           <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <!--排除tomcat依赖-->
                <exclusions>
                    <exclusion>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                        <groupId>org.springframework.boot</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
    
            <!--引入jetty的依赖-->
            <dependency>
                <artifactId>spring-boot-starter-jetty</artifactId>
                <groupId>org.springframework.boot</groupId>
            </dependency>

     3.SpringBoot Enable注解原理:

           原因:@ComponentScan 扫描范围:当前引导类所在包及其子包

           三种解决方案:

              1.使用@ComponentScan扫描com.laoyang.config包

              2.可以使用@Import注解,加载类。这些类都会被Spring创建,并放入IOC容器

              3.可以对Import注解进行封装,写成EnableXXX

           重点:Enable注解底层原理是使用@Import注解实现Bean的动态加载

     

       Import 4种用法

    1. 导入Bean  @Import(User.class)

    2. 导入配置类 @Import(UserConfig.class)

    3. 导入ImportSelector的实现类 @Import(MyImportSelector.class)
    4. 导入ImportBeanDefinitionRegistrar实现类 @Import({MyImportBeanDefinitionRegistrar.class})

       @EnableAutoConfiguration中使用的是第三种方式:@Import(AutoConfigurationImportSelector.class)

        - @EnableAutoConfiguration 注解内部使用 @Import(AutoConfigurationImportSelector.**class**)来加载配置类。

        - 配置文件位置:META-INF/spring.factories,该配置文件中定义了大量的配置类,当 SpringBoot 应用启动时,会自动加载这些配置类,初始化Bean

        - 并不是所有的Bean都会被初始化,在配置类中使用Condition来加载满足条件的Bean

        

       我们可以在resource目录下创建META-INF文件夹并创建spring.factories    注意:”\ “是换行使用的

      如:

     org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.laoyang.redis.config.RedisAutoConfiguration

     

     4.SpringBoot 事件监听:

    SpringBoot 在项目启动时,会对几个监听器进行回调,我们可以实现这些监听器接口,在项目启动时完成一些操作。

    • ApplicationContextInitializer、

    • SpringApplicationRunListener、

    • CommandLineRunner、

    • ApplicationRunner

      自定义监听器的启动时机:MyApplicationRunner和MyCommandLineRunner都是当项目启动后执行,使用@Component放入容器即可使用。

    @Component
    public 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

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

    5. SpringBoot监控-actuator基本使用

    springboot自带监控功能actuator,可以对程序内部诸如 监控状态,Bean的加载、配置属性,日志等。

    ①导入依赖坐标

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

    ②访问http://localhost:8080/acruator 即可 ,看到一些json数据格式的链接。 可以把没格式的json数据放到 json.cn 网页中格式化看.

    http://localhost:8080/actuator/info   info相关的 (配置文件中以info开头的信息可以看到)

    http://localhost:8080/actuator/health  health健康相关的, 只有简单的状态 UP或DOWN

    测试的时候可以开启health检查的完整信息,生产还是关掉哦

        management.endpoint.health.show-details=always   默认是never

     

    除了上面的info health之外,如果还要看到其它的信息时,可以增加如下配置

         management.endpoints.web.exposure.include=*

    spring-boot-admin 提供了图形化的方式查看上述的一些信息。

    SpringBoot Admin 有两个角色,客户端(Client)和服务端(Server)。

    创建服务端:

    Ops-->Spring Boot Admin(Server)或者直接编辑pom.xml写坐标

        <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-server</artifactId>
        </dependency>

    在引导类上启用监控功能@EnableAdminServer

     

    创建客户端:

        <dependency>
                <groupId>de.codecentric</groupId>
                <artifactId>spring-boot-admin-starter-client</artifactId>
        </dependency>

    配置相关信息

    # 执行admin.server地址
    spring.boot.admin.client.url=http://localhost:9000
    
    management.endpoint.health.show-details=always
    management.endpoints.web.exposure.include=*

    启动server和client服务,访问server即可。

     当然,ieda在控制台旁边的Endpoints也能看到这些相关信息.

    ----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


    未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    暑假集训(2)第九弹 ----- Points on Cycle(hdu1700)
    暑假集训(1)第八弹 -----简单迷宫(Poj3984)
    暑假集训(1)第七弹 -----Oil Deposits(Poj1562)
    暑假集训(1)第六弹 -----简单计算器(Hdoj1237)
    暑假集训(1)第五弹 -----Rails(Uva514)
    暑假集训(1)第四弹 -----Find a way(Hdu2612)
    暑假集训(1)第三弹 -----Dungeon Master(Poj2251)
    暑假集训(1)第二弹 -----Catch the cow(Poj3278)
    EF框架搭建(一)
    领域驱动有感<上>
  • 原文地址:https://www.cnblogs.com/xin1006/p/15581288.html
Copyright © 2011-2022 走看看