自动配置的实现原理【精通】
- 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); } }