starter机制
为什么要自定义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准备资源,加载资源
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'
比如上面这个,只有在导入了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方法
配置文件的优先级
- 先去项目根目录找config文件夹下找配置文件件
- 再去根目录下找配置文件
- 去resources下找cofnig文件夹下找配置文件
- 去resources下找配置文件
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日志框架
统一日志框架使用步骤归纳如下:
-
排除系统中的其他日志框架。
-
使用中间包替换要替换的日志框架。
-
导入我们选择的 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