【第13期】springboot: springboot *** 作pdf

【第13期】springboot: springboot *** 作pdf,第1张

一、pdf模板制作

1)word编辑模板

2)转成pdf模板

这个比较简单,wps另存为pdf格式就行

然后,对其中的变量字段进行修改,改成和程序中的实体对象字段对应,这一步很重要,切记。

双击后,修改文本属性,可以设置字体大小、字体类型以及其它的,自己 *** 作一遍就ok了。

二、springboot对接pdf

1)依赖包引入

2)pdf工具类

service

在程序中调用成功后,就ok了

接触Spring Boot已经很长时间了,但对SpringBoot的理解还是虚虚实实,找不着北,所以决定花一些时间总解下,虽然不知道能不能坚持下来,但先开始吧!

Spring Boot是一个便于创建独立的、生产级的、基于Spring的应用程序框架,你可以很方便的启动程序。

以上是SpingBoot官方给的特点,涵盖了SpringBoot的主要特性,下面也谈谈自己的使用心得。

可以在 >

以上是一个最简单的Springboot程序(203版本)示例,也是我们最通用的写法,但其中其实封装这一系列复杂的功能 *** 作,让我们开始逐步进行分析。

首先这里最重要的必然是注解 @SpringBootApplication

@SpringBootApplication 注解由几个注解复合组成,其中最主要的就是 @SpringBootConfiguration 、 @EnableAutoConfiguration 和 @ComponentScan 这三个。

其中的 @ComponentScan 是spring的原生注解, @SpringBootConfiguration 虽然是springboot中的注解,但其实质就是包装后的 @Configuration ,仍然是spring中的注解,用于代替xml的方式管理配置bean

@EnableAutoConfiguration 的定义如上,这里最重要的注解是 @Import ( @AutoConfigurationPackage 注解的实现也是基于 @Import ),借助 @Import 的帮助,将所有符合自动配置条件的bean定义加载到IoC容器中。关于 @EnableAutoConfiguration 注解后续涉及到时会再详细说明。这里我们先回到启动类的 run 方法从头分析初始化流程。

可以看到'run'方法最终调用的是 new SpringApplication(primarySources)run(args) ,这里首先创建了 SpringApplication 对象,然后调用其 run 方法

这里主要是为 SpringApplication 对象进行初始化,这里要专门提一下的是 webApplicationType 和 getSpringFactoriesInstances 。

它用来标识我们的应用是什么类型的应用,来看一下 deduceWebApplicationType() 方法的实现

其返回值是 WebApplicationType 类型的枚举类,其值有 NONE 、 SERVLET 、 REACTIVE 三种,分别对应非WEB应用,基于servlet的WEB应用和基于reactive的WEB应用。

这里的核心是 SpringFactoriesLoaderloadFactoryNames(type, classLoader) 方法,来看一下

重点关注一下 loadSpringFactories(classLoader) 做了什么

这里的 FACTORIES_RESOURCE_LOCATION 定义为 META-INF/springfactories ,因此该方法会扫描所有包下的该文件,将其解析成map对象并缓存到 cache 中以避免重复加载,springboot包下该文件的部分片段如下

从这里可以看出, setInitializers((Collection) getSpringFactoriesInstances( ApplicationContextInitializerclass)) 和 setListeners((Collection) getSpringFactoriesInstances(ApplicationListenerclass)); 分别对应设置的是上述这些类。

解析完成后调用 createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names) 处理解析结果,生成对应的实例,源码如下

这里的核心是通过 ClassUtilsforName(name, classLoader) 方法,以反射的方式生成类实例 instanceClass 。由此可以看出 SpringFactoriesLoaderloadFactoryNames(type, classLoader) 的作用就是将 META-INF/springfactories 中配置的内容进行实例化的工厂方法类,具备很强的扩展性,与SPI机制有异曲同工

的效果。

看完 SpringApplication 的初始化,接着跳回 run 方法继续分析

这里挑其中比较重要的几个方法进行分析

通过 getOrCreateEnvironment() 方法创建容器环境

可以看到 environment 存在则不会重复创建,当应用类型为servlet时创建的是 StandardServletEnvironment 对象,否则创建 StandardEnvironment 对象。

接着来看 configureEnvironment(environment, applicationArgumentsgetSourceArgs())

configurePropertySources(environment, args) 加载启动命令行的配置属性,来看一下实现

这里的 MutablePropertySources 对象用于存储配置集合,其内部维护了一个 CopyOnWriteArrayList 类型的list对象,当默认配置存在时,会向该list的尾部插入一个 new MapPropertySource("defaultProperties", thisdefaultProperties) 对象。

接着来看 configureProfiles(environment, args)

这里主要做的事情就是获取 environmentgetActiveProfiles() 的参数设置到 environment 中,即 springprofilesactive 对应的环境变量。

最后来看一下 listenersenvironmentPrepared(environment)

这里的 listeners 就是之前通过 META-INF/springfactories 注册的所有listeners,后面我们先以其中最重要的 ConfigFileApplicationListener 做为例子进行分析,接着来看 listenerenvironmentPrepared(environment)

可以看到这里创建了一个 ApplicationEnvironmentPreparedEvent 类型的事件,并且调用了 multicastEvent 方法,通过该方法最终会调用到listener的 onApplicationEvent 方法,触发事件监听器的执行。

接下来具体看一下 ConfigFileApplicationListener 的 onApplicationEvent 方法做了什么

可以看到当监听到 ApplicationEnvironmentPreparedEvent 类型的事件时,调用 onApplicationEnvironmentPreparedEvent( (ApplicationEnvironmentPreparedEvent) event) 方法

可以看到这里通过 loadPostProcessors() 方法加载了 META-INF/springfactories 中的所有 EnvironmentPostProcessor 类到list中,同时把 ConfigFileApplicationListener 自己也添加进去了。接着遍历list中所有对象,并执行 postProcessEnvironment 方法,于是接着来看该方法

这里的核心是 new Loader(environment, resourceLoader)load() ,这里的 Loader 是一个内部类,用于处理配置文件的加载,首先看一下其构造方法

可以看到这里的 resourceLoader 又是通过 SpringFactoriesLoader 进行加载,那么来看看 META-INF/springfactories 中定义了哪些 resourceLoader

从名字就可以看出来, PropertiesPropertySourceLoader 和 YamlPropertySourceLoader 分别用于处理properties和yml类型的配置文件。

接着来看看 load() 方法做了什么

initializeProfiles() 进行了 profiles 的初始化,默认会添加 null 和 default 到 profiles 中, null 对应配置文件applicationproperties和applicationyml, default 对应配置文件application-defaultyml和application-defaultproperties,这里的 null 会被优先处理,由于后处理的会覆盖先处理的,因此其优先级最低。

接着来看 load(profile, this::getPositiveProfileFilter, addToLoaded(MutablePropertySources::addLast, false)) 方法

这里重点是通过 getSearchLocations() 获取配置文件的路径,默认会获得4个路径

接着会遍历这些路径,拼接配置文件名称,选择合适的yml或者properties解析器进行解析,最后将结果添加到 environment 的 propertySources 中。

可以看到这里也是根据 webApplicationType 的取值,分别创建不同的返回类型。

这里的 sources 装的就是我们的启动类,然后通过 load(context, sourcestoArray(new Object[0])) 方法进行加载

来看一下 loader 是如何被加载的

经过一系列调用之后最终由 load(Class<> source) 方法执行,这里比较有趣的是当Groovy存在时居然是优先调用Groovy的方式进行加载,否则才走 thisannotatedReaderregister(source) 方法将启动类注册到 beanDefinitionMap 中。

这个 refresh() 方法相当重要,尤其是 invokeBeanFactoryPostProcessors(beanFactory) ,这是实现spring-boot-starter-(mybatis、redis等)自动化配置的关键部分,后续再详细讲解。

至此Springboot的启动流程已经大体分析完了,也了解了配置文件和启动类分别是是如何被加载的,但仍有两个问题待解,一是Springboot的核心思想约定大于配置是如何做到的,二是Springboot的各种spring-boot-starter-是如何发挥作用的,这两个问题留待后续文章继续分析。

初看@SpringBootApplication有很多的注解组成,其实归纳就是一个"三体"结构,重要的只有三个Annotation:

(1)@Configuration注解

(2)@ComponentScan

(3)@EnableAutoConfiguration

从源码中可以知道,最关键的要属@Import(EnableAutoConfigurationImportSelectorclass),借助EnableAutoConfigurationImportSelector,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器。同时借助于Spring框架原有的一个工具类:SpringFactoriesLoader,@EnableAutoConfiguration就可以实现智能的自动配置。

总结 :@EnableAutoConfiguration作用就是从classpath中搜寻所有的META-INF/springfactories配置文件,并将其中orgspringframeworkbootautoconfigureEnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。这些功能配置类要生效的话,会去classpath中找是否有该类的依赖类(也就是pomxml必须有对应功能的jar包才行)并且配置类里面注入了默认属性值类,功能类可以引用并赋默认值。生成功能类的原则是自定义优先,没有自定义时才会使用自动装配类。

1、从spring-boot-autoconfigurejar/META-INF/springfactories中获取redis的相关配置类全限定名(有120多个的配置类)RedisAutoConfiguration,一般一个功能配置类围绕该功能,负责管理创建多个相关的功能类,比如RedisAutoConfiguration负责:JedisConnectionFactory、RedisTemplate、StringRedisTemplate这3个功能类的创建

2、RedisAutoConfiguration配置类生效的一个条件是在classpath路径下有RedisOperations类存在,因此springboot的自动装配机制会会去classpath下去查找对应的class文件。

3如果pomxml有对应的jar包,就能匹配到对应依赖class,

4、匹配成功,这个功能配置类才会生效,同时会注入默认的属性配置类@EnableConfigurationProperties(RedisPropertiesclass)

5Redis功能配置里面会根据条件生成最终的JedisConnectionFactory、RedisTemplate,并提供了默认的配置形式@ConditionalOnMissingBean(name = "redisTemplate")

6最终创建好的默认装配类,会通过功能配置类里面的 @Bean注解,注入到IOC当中

7用户使用,当用户在配置文件中自定义时候就会覆盖默认的配置@ConditionalOnMissingBean(name = "redisTemplate")

1通过各种注解实现了类与类之间的依赖关系,容器在启动的时候Applicationrun,会调用EnableAutoConfigurationImportSelectorclass的selectImports方法(其实是其父类的方法)-- 这里需要注意,调用这个方法之前发生了什么和是在哪里调用这个方法需要进一步的探讨

2selectImports方法最终会调用SpringFactoriesLoaderloadFactoryNames方法来获取一个全面的常用BeanConfiguration列表

3loadFactoryNames方法会读取FACTORIES_RESOURCE_LOCATION(也就是spring-boot-autoconfigurejar 下面的springfactories),获取到所有的Spring相关的Bean的全限定名ClassName,大概120多个

4selectImports方法继续调用filter(configurations, autoConfigurationMetadata);这个时候会根据这些BeanConfiguration里面的条件,来一一筛选,最关键的是

@ConditionalOnClass,这个条件注解会去classpath下查找,jar包里面是否有这个条件依赖类,所以必须有了相应的jar包,才有这些依赖类,才会生成IOC环境需要的一些默认配置Bean

5最后把符合条件的BeanConfiguration注入默认的EnableConfigurationPropertie类里面的属性值,并且注入到IOC环境当中

引入spring-boot-starter-cache依赖

@EnableCaching

在SpringBoot启动器上添加注解,开启缓存。

@Cacheable

在方法上添加此注解,若不指定key则以传入参数生成key,缓存该方法的返回参数。

@CacheEvict

在方法上添加此注解,若不指定key则以传入参数生成key,删除该缓存。

@CachePut

在方法上添加此注解,若不指定key则以传入参数生成key,调用该方法后更新缓存。

引入spring-boot-starter-data-redis依赖,SpringBoot会自动切换

applicationproperties中添加redis主机地址:springredishost=19216837135

@Autowired

StringRedisTemplate stringRedisTemplate;//键值对都为String的 *** 作器

@Autowired

RedisTemplate redisTemplate;//键值对都为对象的 *** 作器,对象需继承序列号接口

自定义RedisTemplate可实现不同的序列化方式,默认为jdk序列化方式。

添加自定义缓存管理器(需定义泛型),在service里添加@CacheConfig(cacheManager="")注解指定缓存管理器。

@Async

此注解标注在方法或类型上,可开启异步处理。

@EnableScheduling

在SpringBoot启动器上添加注解,开启定时任务。

@Scheduled

可以在方法和注解类型上添加注解,设置任务的定时规则。

引入spring-boot-starter-mail

配置applicationproperties

注入邮件发送bean

发送简单邮件

发送带附件的邮件

引入jar包

spring-boot-starter-security

创建一个配置类,继承WebSecurityConfigurerAdapter,需要注解@EnableWebSecurity开启,重写configure(>

以上就是关于【第13期】springboot: springboot *** 作pdf全部的内容,包括:【第13期】springboot: springboot *** 作pdf、SpringBoot-简介、Springboot初始化流程解析等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10178574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存