版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
SpringBoot-all
course1 课程一 SpringBoot快速入门
https://start.spring.io/ Springboot项目快速构建网站
@SpringBootApplication注解
查看源码发现它相当于SpringBootConfiguration Springboot配置类似于Configuration注解
EnableAutoConfiguration 自动注入配置
ComponentScan 扫描 这三个注解
course2 课程2 SpringBoot配置分析
默认配置文件application.properties默认的位置在classpath根目录,或者是classpath/config目录下
file:/,file:config/
也可以使用yaml格式,application.yml或者application.yaml
application中是自定义参数,在Courese2Application用三种方式取得配置文件中的值
1.@Value Spring注解 默认值方式为${"hello:huangsm"}
2.Environment SpringBoot新特性,通过键值对的方式获取配置值
3.通过@ConfigurationProperties(prefix = "huel") 代码参考Huel实体类
TomcatProperties支持集合和数组的注入
2.动态的引入配置文件
自定义MyEnvironmentPostProcessor实现EnvironmentPostProcessor接口
3.各个生产环境的切换---通过配置方式
#测试环境
spring.profiles.active=dev
maven启动参数方式切换配置文件(表示启用多个)
--spring.profiles.active=dev,prod
4.根据不同环境注入不同的Bean
详情查看MyConfig编码
@Profile注解在类上或者方法上使用,代表装配不同的Bean
course3 课程3 SpringBoot自动配置
1.Condition接口 (用来自定义条件装配来使用)
其中有一个抽象方法matches,参数分别为ConditionContext context, AnnotatedTypeMetadata metadata
如何这个方法返回true表示可以自动装配,false表示不装配
2.Conditional注解 对接口的注解封装
基于条件的自动装配,一般配合Condition接口一起使用,只有接口实现类返回true,才装配,否则不装配,
他可以用在方法上,也可以用在类上。
3. @ConditionalOnProperty(name="runable.enabled",havingValue = "true")
读取配置文件中的runable.enabled,为true该Bean装配,否则不装配
4. @ConditionalOnClass(name = "com.google.gson.Gson")
表示类路径下存在Gson这个包的时候才装配
5.@ConditionalOnBean(name = "user")
根据容器中是否存在某个bean来进行装配
6.ConditionalOnMissingBean(name="user")
当容器中不存在bean时才装配
course4 课程4 Spring Boot @Enable*注解的工作原理
1.@EnableConfigurationProperties注解
用来启用一个特性的,这个特性就是,可以把配置文件的属性注入到bean里面去,和@ConfigurationProperties一起使用
2.@EnableAsync启用异步,一般适合@Async一起使用
3.@Enable的工作原理在于引入一个或者多个配置
@Enable中做重要的注解在于@import将Bean装配导入到spring容器,@Enable内部就是导入一个配置类
4.@import用来导入一个或者多个类(bean会被Spring容器所托管)或者配置类(配置类中的bean都会被spring容器所托管)
5.ImportSelector
其中有一个selectImports方法,方法的返回值必须是一个class(全称),该class会被spring容器所托管起来
6.ImportBeanDefinitionRegistrar
通过实现这个接口的registerBeanDefinitions方法,调用一下代码:
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(User.class);
registry.registerBeanDefinition("user", beanDefinitionBuilder.getBeanDefinition());
course5 课程5 Spring Boot @EnableAutoConfiguration深入分析(无代码偏理论和源码分析,可以仔细研究这个注解的源码)
1.@EnableAutoConfigurationchong
作用:从classpath中搜索所以META-INF/spring.factories配置文件,然后将其中
org.springframework.boot.autoconfigure.EnableAutoConfiguration key对应的配置项加载到spring容器中
只有org.springframework.boot.autoconfigure.EnableAutoConfiguration为true时才会生效,默认为true
@EnableAutoConfiguratio还可以进行排除:排除方式有俩种:1.通过class来排除
2.根据类的名字来排除
2.其内部实现的关键点
ImportSelector 该接口的方法返回值都会被纳入到Spring容器管理中
SpringFactoriesLoader 该类可以从classpath中搜索所以META-INF/spring.factories配置文件,并读取配置
course6 课程6 Spring Boot 事件监听 --四种方式讲解如何配置事件监听 (代码也放在course5中)
事件流程
-
自定义事件,一般是继承ApplicationEvent抽象类
-
定义事件监听器,一般是实现ApplicationListener接口
-
启动事件,需要把监听器加入到spring容器中
1.添加事件监听器app.addApplicationListener(new MyApplicationListener()); 2.使用@Component将事件监听器加入到spring容器中 3.通过全局配置的方式context.listener.classes=com.springboot.study.course5.listener.MyApplicationListener 4.自定义事件处理器,类似于代码中的MyEventHandle
-
发布事件 app.publishEvent(new MyApplicationEvent(new Object()));
源码分析
- DelegatingApplicationListener,查看这个类,阅读源码,配置方式的源码
- EventListenerMethodProcessor,事件处理器方式源码,其核心实现根据@EventListener来处理监听事件
course7 课程7 Spring Boot 扩展分析ApplicationContextInitializer、CommandLineRunner、ApplicationRunner、ApplicationArguments
1.ApplicationContextInitializer 接口是在Spring容器执行refreshed之前的一个回调
使用步骤:
- 写一个类,实现ApplicationContextInitializer接口
- 注册ApplicationContextInitializer
注册方法:
-
ApplicationContextInitializer.addInitializers
-
通过配置文件配置:context.initializer.classes指定,需要指定多个请看course7代码配置文件
-
通过METE/INF中的spring.factorties文件中指定(也可以注册监听器)
-
CommandLineRunner是Spring容器启动成功后的最后一步回调 (步骤参考ServerSuccessReport代码)
使用步骤 -
写一个类实现CommandLineRunner接口
-
通过@Component将它交给容器管理
通过@Order(param)来控制多个CommandLineRunner实现类的执行顺序,param参数数字最大,最早执行。
3. CommandLineRunner,ApplicationRunner区别:
区别在于方法的参数不一样
CommandLineRunner的参数是最原始的参数,没有做任何处理
ApplicationRunner的参数是ApplicationArguments 是对原始参数进一步的封装
- ApplicationArguments是对参数(main方法)进一步处理,可以解析–name=value的,我们可以通过name来获取value
course8 课程8 Spring Boot 补充讲解
@SpringBootApplication
默认扫描当前类已经子类下的所有包
1.@SpringBootApplication(exclude = ServerSuccessReport.class)
不扫描ServerSuccessReport这个类
2.@SpringBootApplication(excludeName = "com.springboot.study.course7.MyApplicationContextInitializer")
不扫描MyApplicationContextInitializer这个类
3.@SpringBootApplication(scanBasePackages = "com.springboot.study.course7")
扫描com.springboot.study.course7下的所有类
4.@SpringBootApplication(scanBasePackageClasses = MyApplicationContextInitializer.class)
扫描这个类
banner
- 在resources添加自己的banner.txt替换系统的banner
- 也可以关闭banner
- 支持图片格式banner,支持jpg,png,gif
- 修改全局配置文件
banner.location=my.txt
banner.charset=GBK
banner.image.location=my.jpg
course9 课程9 Spring Boot 运行流程分析
- 俩种方法创建SpringBoot启动类
第一种调用方式: SpringApplication app=new SpringApplication(Course7Application.class); app.run(args); 第二种调用方式: SpringApplication.run(Course7Application.class, args);
- 运行流程
- 判断是不是Web环境
- 加载所有classpath下面的META-INF/spring.factorties ApplicationContextInitializer
- 加载所有classpath下面的META-INF/spring.factorties ApplicationListener
- 推断main方法所在的类
- 开始执行run方法
- 设置java.awt.headless系统变量
- 加载所有classpath下面的META-INF/spring.factorties SpringApplicationRunnerListener
- 执行所有SpringApplicationRunnerListener的started方法
- 实例化ApplicationArguments对象
- 创建environment
- 配置environment,主要是把run方法的参数配置到environment中
- 执行所有SpringApplicationRunnerListener的environmentPrepared方法
- 如果不是web环境,但是是web的environment,则把这个web的environment转换长标准的environment
- 打印banner
- 初始化applicationContext,如果是web环境,则实例化AnnotationConfigEmbeddedWebApplicationContext对象,否则实例化AnnotationConfigApplicationContext对象
- 如果beanNameGenerator不为空,就把beanNameGenerator对象注入到applicationContext里面去
- 回调所有的ApplicationContextInitializer方法
- 执行所有SpringApplicationRunnerListener的contextPrepared方法
- 依次往spring容器中注入:ApplicationArguments,Banner
- 加载所有的源到applicationContext里面去
- 执行所有SpringApplicationRunnerListener的contextLoaded方法
- 执行applicationContext的refresh方法,并且调用applicationContext的registerShutdownHook方法
- 回调,获取容器中所有的ApplicationRunner,CommandLineRunner接口,然后排序,依次调用
- 执行所有SpringApplicationRunnerListener的finished方法
course10 课程10 Spring Boot Web开发
- 快速开发一个接口(参照代码)
- 修改默认端口号 修改配置文件server.port=8181
- @RequestParam默认参数必须提供,修改required可以不用提供值 @RequestParam(value = “name”,required = false,defaultValue = “huangsm”)
- @PathVariable获得路径中的值,参考代码
- @RestController返回Json格式给前台
- 整合JSP引入依赖tomcat-embed-jasper,配置spring.mvc.view.prefix=/WEB-INF/jsp/和spring.mvc.view.suffix=.jsp(详情参考JspController)
- 整合freemarker,引入spring-boot-starter-freemarker,ftl页面放在templates中(详细看代码,和配置文件)
- 配置访问默认前缀 server.servlet.context-path=/huangsm,默认为/
- 更换web容器,首先在spring-boot-starter-web排序spring-boot-starter-tomcat的依赖,在添加spring-boot-starter-jetty的依赖(这里就不测试了)
- SpringBoot访问静态资源,可以将静态资源放在src/main/webapp下,springboot中将它放入static中,可以通过freemarker访问(详细看代码),也可以直接访问
#修改默认静态页面路径
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/static/,classpath:/static/,classpath:/public
- 方式一:如何在SpringBoot中使用servlet,详细查看UserServlet类,需要使用@WebServlet("/user.do")表明路径,在启动类中开启对Servlet的扫描@ServletComponentScan
- 如何在SpringBoot中使用Filter,实现Filter接口,编写自己的业务逻辑,通过@WebFilter注解添加过滤规则(详细参考LogFilter代码)
- 如何在SpringBoot中使用Listener,实现ServletContextListener接口,实现他的俩个方法,通过@WebListener注解启动监听器
- 方式二:用配置类来使用Servlet、Filter、Listener(使用详细查看servlet包下代码)
1.编写Servlet 2.装配相应的bean到spring容器中 servlet ->ServletRegistrationBean filter ->FilterRegistrationBean listener ->ServletListenerRegistrationBean
- 如何在Springboot中使用拦截器(详细步骤参考interceptor和config中的配置即可)1.写一个拦截器实现HandlerInterceptor接口2.在WebMvc配置类中实现addInterceptors方法即可。
- 配置错误页面跳转,首先排除springboot自带的错误处理页面@SpringBootApplication(exclude = ErrorMvcAutoConfiguration.class),页面跳转处理逻辑参考exception包下的CommonErrorPageRegistry类
- 全局异常处理器(详细代码参考exception包下的GolbalExceptionHandler类)
course11 课程11 Spring Boot 定制和优化内嵌的Tomcat
tomcat: 参数的使用 accesslog: enabled: true 开启日志 directory: G:\logs 存放日志的底单 address: 192.168.12.60 规定只允许访问的ip
- 编码方式定制tomcat容器,详情看tomcat包下TomcatCustomizer类
course12 课程12 Spring Boot JDBC --多种数据源的配置、JdbcTemplate、事务的处理
- 首先加入spring-boot-starter-jdbc依赖,然后Springboot自动装配DataSource,在全局配置文件中配置即可,详细参考(application.yml文件)
- SpringBoot会自动装配jdbcTemplate,可以直接使用。详细使用方式参考代码(TestDao)
- spring.datasource.type可以指定具体使用哪种数据源,默认支持tomcat-jdbc,Hikari,dbcp,dbcp2,首先排除默认数据源,然后在引入对应的数据源依赖及可以使用
- 自定义配置DataSource,首先引入依赖,然后创建DataSource配置类,装配一个数据源到spring容器中(详细代码参考DataSourceConfig代码,注意在application.yml文件中指定DataSource的类型)
- Springboot中开启事务,首先要使用@EnableTransactionManagement注解,启用对事务的支持,然后加上@Transactional(rollbackFor = Exception.class)对全部一次都进行事务回滚,他只能标注在spring容器管理的公用方法才会生效
course13 课程13 Spring Boot AOP(面向切面编程)
- 添加spring-boot-starter-aop依赖,默认就开启了aop的支持,编写一个切面类(详细代码参考aop包下的Log类),@EnableAspectJAutoProxy //启用aop
- 是否启用aop 默认为true:spring.aop.auto=true, false-jdk动态代理,true-cglib代理方式,默认为false:spring.aop.proxy-target-class=false,如果配置了false,切面的类没有接口依然使用cglib
course14 课程14 Spring Boot Starter --快速构建自定义的Spring Boot Starter
自己开发一个spring boot starter的步骤
- 新建一个maven项目
- 需要一个配置类,配置类里面需要装配好需要提供出去的类
- (1)使用Enable,配合@Import注解使用 (2)或者/META-INF/spring.factories
course15 课程15 Spring Boot 日志–演示了如何在Spring Boot里面使用日志配置,以及logback,log4j2等日志的使用
- logging.level.*=debug 修改日志信息级别 *可以是包也可以是类或者root
- 日志级别有:TRACE,DEBUG,INFO,ERROR,WARN,FATAL,OFF OFF表示关闭日志输出
- logging.file=G:/logs/my.log 指定日志文件路径 logging.path=G:/logs制定日志目录(此时的日志名字为spring.log) 日志文件输出,文件大小10M之后就会分割了
- logging.pattern.console配置日志在控制台的输出格式logging.pattern.file配置日志在文件中的输出格式
- 在classpath下放一個logback.xml,logback-spring.xml的文件,即可控制日志文件的配置
- (1)使用其他日志组件步骤,排除掉默认的日志组件:spring-boot-starter-logging(2)加入新的日志路径依赖(3)把相应的配置文件放到classpath下
course16 课程16 Spring Boot 监控和度量 --Spring Boot内置的监控点、自定义的监控状况检查、自定义度量统计,输出等等
- 添加spring-boot-starter-actuator依赖,并且在全局配置文件中开启management.endpoints.web.exposure.include=*,访问localhost:port/actuator就可以监控应用信息
- 可以在http://localhost:9000/actuator/info显示配置文件中以info开头的信息,会显示git.properties中的信息
- SpringBoot2.0监控点详情http://www.ityouknow.com/springboot/2018/02/06/spring-boot-actuator.html
course17 课程17 Spring Boot 测试 --实战演示在Spring Boot里面的测试案例,以及如何测试Controller
- Springboot测试步骤,直接在测试类上加如下俩个注解@RunWith(SpringRunner.class),@SpringBootTest
- 测试环境下配置配置类,通过@TestConfiguration,在测试类上的加上@SpringBootTest(classes = TestBeanConfig.class)就可以导入配置类中的bean
- Mock测试方式,详细参考代码UserMapperTest类
- 测试controller第一种方式:参考UserControllerTest代码 第二种方式参考UserControllerTest2
course18 课程18 Spring Boot 构建微服务实战 -一分钟配置一个Spring boot + Mybatis的微服务环境
- 参考代码
course19 课程19 Spring Boot 服务的注册和发现
- 这里使用的注册中心是zookeeper,使用的zookeeper客户端是curator(详细使用方法看course18和course19代码)
- 服务注册参考course18代码的register包下的ServiceRegister类
course20 课程20 SpringBoot的部署与打包
- 打包mvn clean package
- 将jar包部署在服务器上
- java -jar jar包名
- mvn clean package dependency:copy-dependencies