SpringBoot高级使用

自动配置的实现原理【精通】

  • SpringBoot通过Spring提供的Condition条件,预制了常用框架的核心类。

SpringBoot如何自定义条件Condition?【精通】

  • 实现Condition接口
    • 在matches方法中,返回条件是否成立
  • 使用@Conditional注解,在需要判断条件的方法是使用
@Bean
@Conditional(ClassCondition.class)
public User user(){
    return new User();
}

SpringBoot如何自定义注解或带参的条件Condition?【精通】

  • 实现Condition接口
    • metadata可获取自定义注解动态设置的参数信息
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        //2.需求: 导入通过注解属性值value指定坐标后创建Bean
        //获取注解属性值  value
        Map<String, Object> map = metadata.getAnnotationAttributes(ConditionOnClass.class.getName());
        //System.out.println(map);
        String[] value = (String[]) map.get("value");

        boolean flag = true;
        try {
            for (String className : value) {
                Class<?> cls = Class.forName(className);
            }
        } catch (ClassNotFoundException e) {
            flag = false;
        }
        return flag;

    }
  • 自定义一个注解,并在注解上使用@Conditional指定条件的实现类

    @Conditional(ClassCondition.class)
    public @interface ConditionOnClass {
        String[] value();
        String temp() default "123";
    }
    
  • 使用自定义注解在需要判断条件的方法是使用

    	@Bean
        @ConditionOnClass("com.alibaba.fastjson.JSON")
        public User user(){
            return new User();
        }
    

JavaConfig怎么使用呢?【精通】

  • @Configuration 标识当前类是一个配置类
  • @Bean 标识方法的返回值对象,需要放置到IOC容器中
    • 如果没特殊指定Bean名称,则自动使用方法名称作为Bean名称
@Configuration
public class UserConfig {

    @Bean
    //@Conditional(ClassCondition.class)
    //@ConditionOnClass("com.alibaba.fastjson.JSON")
    public User user(){
        return new User();
    }

    @Bean
    @ConditionalOnProperty(name = "roc",havingValue = "ou")
    public User user2(){
        return new User();
    }

}

自定义注解【精通】

  • 注解类需要使用@interface标注
  • @Target:指定当前注解可以在类的那些地方使用【必须】
    • ElementType.TYPE 类
    • ElementType.METHOD 方法
    • ElementType.PARAMETER 参数
    • ElementType.FIELD 字段
  • @Retention:指定注解在那些阶段有效【必须】
    • SOURCE:只在编译时有效
    • CLASS:在字节码文件中,但是运行时无效果
    • RUNTIME:运行时
  • @Documented:当前注解可生成文档
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ClassCondition.class)
public @interface ConditionOnClass {
    String[] value();
    // 设置默认值
    String temp() default "123";
}

SpringBoot如何切换内置服务器【了解】

  • 排除WEB依赖中的tomcat依赖

    <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <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>
    

SpringBoot导入扫描其它包的3种方式?

  • @ComponentScan(“com.roc.config”)
  • @Import(UserConfig.class):把指定的类导入并加载ioc容器中
  • @EnableUser

@Import注解的4种使用方式【熟练】

  • 导入Bean:该bean直接会实例化,并加入ioc容器
  • 导入JavaConfig:该配置类定义的Bean会全部加入IOC容器
  • 导入实现ImportSelector接口的类:该导入会把接口方法返回的数组中的类,全部导入IOC容器
  • 导入实现ImportBeanDefinitionRegistrar接口的类:该导入允许自定义去直接注册Bean到IOC容器中

SpringBootApplication注解的分析【了解】

  • SpringBootConfiguration:说明可以在启动类中,配置Bean
  • ComponentScan: 说明启动类会自动扫描当前包及子包
  • EnableAutoConfiguration:开启SpringBoot自动配置Bean的功能(当前项目下所有满足条件的Bean)
    • 查找项目下所有jar下的META-INF/spring.factories文件中配置的key为org.springframework.boot.autoconfigure.EnableAutoConfiguration的属性值
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication

SpringBoot自定义starter步骤?【熟练】

  • 1、实现自定义starter的所需使用的属性对象(参考:RedisProperties)

  • 2、实现自动配置类

    • 属性对象定义后,需要通过@EnableConfigurationProperties导入才能从IOC中获取使用
    • 在自动配置类中,可在方法参数中直接使用IOC容器中已经存在的Bean
    • 注意:在自动配置类中,需要使用Condition条件来判断项目环境是否需要自动配置
    @Configuration
    @EnableConfigurationProperties(RedisProperties.class)
    @ConditionalOnClass(Jedis.class)
    public class RedisAutoConfiguration {
    
    
        /**
         * 提供Jedis的bean
         */
        @Bean
        public Jedis jedis(RedisProperties redisProperties) {
            System.out.println("RedisAutoConfiguration....");
            return new Jedis(redisProperties.getHost(), redisProperties.getPort());
        }
    
    }
    
  • 3、在META-INF/spring.factories中注册自定义配置类

    • 注意:key固定是org.springframework.boot.autoconfigure.EnableAutoConfiguration
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.roc.redis.config.RedisAutoConfiguration

SpringBoot事件监听【精通】

  • CommandLineRunner和ApplicationRunner监听

    • 时机:上下文加载完成,项目启动完成之前
    • 配置:无特殊配置,把相关实现类注册到IOC容器中,即可自动运行
  • ApplicationContextInitializer

    • 时机:上下文开始初始化之前

    • 配置:需要把其实现类注册到SpringApplication中

      • 注册方式一:配置文件spring.factories
      org.springframework.context.ApplicationContextInitializer=com.roc.springbootlistener.listener.MyApplicationContextInitializer
      
      • 注册方式二:通过API注册
      SpringApplication app = new SpringApplication(SpringbootListenerApplication.class);
      app.addInitializers(new MyApplicationContextInitializer());
      app.run(args);
      
  • ApplicationListener<事件类型>

    • 时机:对应事件的事件

    • 配置:需要把其实现类注册到SpringApplication中

       public static void main(String[] args) {
              SpringApplication app = new SpringApplication(SpringbootListenerApplication.class);
              app.addInitializers(new MyApplicationContextInitializer());
              app.addListeners( new SpringContextListenerTest());
              app.run(args);
          }
      
    • 例:监听项目启动就绪

    public class SpringContextListenerTest implements ApplicationListener<ApplicationReadyEvent> {
        @Override
        public void onApplicationEvent(ApplicationReadyEvent ApplicationReadyEvent) {
            System.out.println("我是菩萨,保佑你无BUG!!!");
        }
    }
    

SpringBoot常用条件注解【属性】

在这里插入图片描述

SpringBoot监控Actuator【精通】

  • 定义:actuator实际一个Springboot提供的统一监控springboot项目的工具包

  • 使用:

    • 导包

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

      # 开启健康检查的完整信息
      management.endpoint.health.show-details=always
      # 将所有的监控endpoint暴露出来
      management.endpoints.web.exposure.include=*
      

搭建SpringBoot 服务端 Server【精通】

  • 常用功能

    • 通过loggers,来动态设置某个包下的日志级别

    • 查看服务线程的运行状态

在这里插入图片描述

  • 导包

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

  • 编码

    @EnableAdminServer
    @SpringBootApplication
    public class SpringbootAdminServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootAdminServerApplication.class, args);
        }
    
    }
    

搭建SpringBoot 客服端 Client【了解】

  • 导包

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

    # 执行admin.server地址
    spring.boot.admin.client.url=http://localhost:9000
    
  • 编码

SpringBoot项目打包jar【精通】

  • 配置maven工程打包成jar

    <packaging>jar</packaging>
    
  • 配置springboot的打包插件

    <build>
            <finalName>springboot</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    

SpringBoot项目打包war【精通】

  • 配置maven工程打包成jar
<packaging>war</packaging>
  • 配置springboot的打包插件
<build>
        <finalName>springboot</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
  • 改造启动类

    • 继承SpringBootServletInitializer
    • 重写configure方法
    @SpringBootApplication
    public class SpringbootDeployApplication extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootDeployApplication.class, args);
        }
    
    
        @Override
        protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
            return builder.sources(SpringbootDeployApplication.class);
        }
    }
    
    pringBootApplication
    public class SpringbootDeployApplication extends SpringBootServletInitializer {
    
      public static void main(String[] args) {
          SpringApplication.run(SpringbootDeployApplication.class, args);
      }
    
    
      @Override
      protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
          return builder.sources(SpringbootDeployApplication.class);
      }
    }
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值