springboot

132 阅读6分钟

starter机制

image.png

为什么要自定义starter 在我们的日常开发工作中,经常会有一些独立于业务之外的配置模块,我们经常将其放到一个特定 的包下,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集 成一遍,麻烦至极。如果我们将这些可独立于业务代码之外的功配置模块封装成一个个starter, 复用的时候只需要将其在pom中引用依赖即可,再由SpringBoot为我们完成自动装配,就非常轻 松了

starter是实现:

自定义starter

使用starter

自定义starter的步骤

1、 (1)新建maven jar工程,工程名为zdy-spring-boot-starter,导入依赖: (2)编写javaBean (3)编写配置类MyAutoConfiguration

导入依赖

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.2.9.RELEASE</version>
</dependency>
</dependencies>

热插拔技术

@configureMarker主要的目的是为了在启动时,判断是否有该注解,如果没有的话,就不实例化某个配置类

增加一个enable注解,用于

springApplication初始化过程(如何去处理注解@SpringBootApplication

springapplication准备资源,加载资源

image.png

run方法:

执行逻辑:

1、获取并启动监听器

2、根据用户配置,配置 environment系统环境

3、

4、刷新应用上下文前的准备阶段

prepareContext()方法

5、刷新应用上下文(IOC容器的初始化过程)

主要执行方法: //设置 beanFactory 的后置处理 invokBeanFactorypostProcess(beanFactory);0(解析核心配置类上的注解)

完成以上方法,需要实现三个步骤:

1 BeanDefinition的Resource定位(获取到这个类的全路径) 2 BeanDefinition的载入(将这些类解析城内部的Beandefinition,存入到容器中) 3 向IoC容器注册BeanDefinition

注解@Conditional,如果加了这个注解,springboot只有加载符合条件的bean'

image.png

比如上面这个,只有在导入了RabbitTemplate.class包和channel.class包后,这个配置注解才会生效,zhizhi

自动配置::根据我们添加的jar包依赖,会自动将一些配置类的bean注册进ioc容器,我们可以需要的地 方使用@autowired或者@resource等注解来使用它。

@SpringbootApplication,和main方法里面执行的run方法是核心

1、分析@SpringbootApplication

分析里面的注解 @AutoConfigurationPackages AutoConfigurationPackages.Registrar这个类就干一个事,注册一个 Bean ,这个 Bean 就是 org.springframework.boot.autoconfigure.AutoConfigurationPackages.BasePackages ,它有 一个参数,这个参数是使用了 @AutoConfigurationPackage 这个注解的类所在的包路径,保存自动配置 类以供之后的使用,比如给 JPA entity 扫描器用来扫描开发人员通过注解 @Entity 定义的 entity 类。

分析里面的注解 @import 给容器导入配置类

@springbootapplication:标为配置类

Spring 中有很多以 Enable 开头的注解,其作用就是借助 @Import 来收集并注册特定场景相关的 Bean ,并加载到 IOC 容器。

@EnableAutoConfiguration就是借助@Import来收集所有符合自动配置条件的bean定义,并加载到 IoC容器。

、@ComponentScan

总的来说,@springbootapplication只是将需要加载的配置类,读取存放(包含过滤),并没有对对象创建的动作

2、分析run方法

配置文件的优先级

  1. 先去项目根目录找config文件夹下找配置文件件
  2. 再去根目录下找配置文件
  3. 去resources下找cofnig文件夹下找配置文件
  4. 去resources下找配置文件

image.png

springboot自定义日志输出:

日志的优先级:trce<debuge<info<warning

日志的参数设置

%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# %d{yyyy-MM-dd HH:mm:ss.SSS} 时间
# %thread 线程名称
# %-5level 日志级别从左显示5个字符宽度
# %logger{50} 类名
# %msg%n 日志信息加换行
# 日志配置
# 指定具体包的日志级别
logging.level.com.lagou=debug
# 控制台和日志文件输出格式
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level
%logger{50} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
- %msg%n
# 日志输出路径,默认文件spring.log
logging.file.path=spring.log
#logging.file.name=log.log

日志框架的替换

springboot-starter的作用。在项目开发中的一个痛点就是要依赖很多包,这些jar包版本繁琐,存在版本冲突的风险。springboot-starter将所有的依赖打个一个starter包,开发者不需要细究里面的版本问题。

在springboot中引入第三方的包对象,可以使用@Configration 类 类的方法下加@Bean,方法返回的new对象就是加入到容器中的对象

idea如何使用热部署:

1、加xml配置依赖

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

2、ctr+alt+shift+/ 勾选 regist 里的 compiler.automake.allow.when.app.running

3、seting里面的compile中选 biuld project auto..

springboot配置类注解:

@Configuration:声明一个类作为配置类

@Bean:声明在方法上,将方法的返回值加入Bean容器

@Value:属性注入

@ConfigurationProperties(prefix = "jdbc"):批量属性注入

@PropertySource("classpath:/jdbc.properties")指定外部属性文件。在类上添加

使用例子1: 数据源的配置:

步骤1:引入数据源连接依赖

<dependency>
<groupId>com.github.drtrang</groupId>
<artifactId>druid-spring-boot2-starter</artifactId>
<version>1.1.10</version>
</dependency>

步骤2:application.properties添加信息

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_h
jdbc.username=root
jdbc.password=123

步骤3:创建JdbcConfiguration类: 使用spring中的value注解对每个属性进行注入,用bean注解将返回值添加到容器中

@Configuration

public class JdbcConfiguration {

@Value("${jdbc.url}")

String url;

@Value("${jdbc.driverClassName}")

String driverClassName;

@Value("${jdbc.username}")

String username;

@Value("${jdbc.password}")

String password;

@Bean
public DataSource dataSource() {

DruidDataSource dataSource = new DruidDataSource();

dataSource.setUrl(url);

dataSource.setDriverClassName(driverClassName);

dataSource.setUsername(username);

dataSource.setPassword(password);

return dataSource;

}

}

例子2

步骤1: @ConfigurationProperties批量注入

新建 JdbcProperties ,用来进行属性注入

@Configration
@EnableConfigrationProperties(JdbcProperties.class)
@ConfigurationProperties(prefix = "jdbc") //这里需要定义出在application文件中定义属
性值得前缀信息
public class JdbcProperties {
private String url;

private String driverClassName;

private String username;

private String password;

// 注:要生成属性的set方法

}

步骤2:添加spring-boot-configuration-processor后出现提示,加完依赖后通过Ctrl+F9来使之生效

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>

第三步:配置properties

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/springboot_h
jdbc.username=root
jdbc.password=123

例子3:第三方配置

除了 @ConfigurationProperties 用于注释类之外,您还可以在公共 @Bean 方法上使用它。当要将属 性绑定到控件之外的第三方组件时,这样做特别有用。

步骤1:

@Data
public class AnotherComponent {
private boolean enabled;
private InetAddress remoteAddress;
}

创建MyService

@Configuration
public class MyService {
@ConfigurationProperties("another")
@Bean
public AnotherComponent anotherComponent(){
return new AnotherComponent();
}
}
another.enabled=true
another.remoteAddress=192.168.10.11

测试类

private AnotherComponent anotherComponent;
@Test
public void myServiceTest(){
System.out.println(anotherComponent);
}

SpringBoot日志框架

统一日志框架使用步骤归纳如下:

  1. 排除系统中的其他日志框架。

  2. 使用中间包替换要替换的日志框架。

  3. 导入我们选择的 SLF4J 实现。

针对1:springboot的maven排除了日志,使用了exclude标签

spring注解:

常用注解:@Component、@Controller、@Service、@Repository、@Bean、@Autowired

@Autowire和@Resource都是Spring支持的注解形式动态装配bean的方式。@Resource默认按照名称(byName)装配,名称可以通过name属性指定。如果没有指定name,则注解在字段上时,默认取(name=字段名称)装配。如果注解在setter方法上时,默认取(name=属性名称)装配。

通过@Value可以将外部的值动态注入到Bean中,可以为基本类型数据和String类型数据的变量注入数据

@Scope

是pringboot注解:

SpringBootApplication

@Configuration ,@EnableAutoConfiguration 和 @ComponentScan

@RestController:用于标注控制层组件(如struts中的action),@ResponseBody和@Controller的合集。

@RequestMapping

@EnableAutoConfiguration

@ComponentScan

linux如何排查问题

第一步:使bai用

top命令,然后按shift+p按照CPU排序

找到占用CPU过高的进程的pid

top -H -p [进程id]

找到进程中消耗资源最高的线程的id

进程号转换为16进制

jstack [进程id] |grep -A 10 [线程id的16进制]”

1、根据top命令,发现PID为2633的Java进程占用CPU高达300%,出现故障。

自动装配

springcloud,rpc,kafa,,docker,linux,hadoop,hive