Java EE( SSM + Spring Boot + Vue.js 3 )框架整合开发 课件 第6章 Spring Boot核心_第1页
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合开发 课件 第6章 Spring Boot核心_第2页
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合开发 课件 第6章 Spring Boot核心_第3页
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合开发 课件 第6章 Spring Boot核心_第4页
Java EE( SSM + Spring Boot + Vue.js 3 )框架整合开发 课件 第6章 Spring Boot核心_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章SpringBoot核心授课教师:陈恒大连外国语大学本章目标理解SpringBoot的自动配置原理了解SpringBoot的条件注解掌握SpringBoot的核心注解掌握SpringBoot的基本配置1本章内容26.1SpringBoot的基本配置6.2读取应用配置6.3日志配置6.4SpringBoot的自动配置原理6.5SpringBoot的条件注解6.1SpringBoot的基本配置6.1.1启动类和核心注解@SpringBootApplication6.1.2关闭某个特定的自动配置6.1.3定制Banner6.1.4关闭banner6.1.5SpringBoot的全局配置文件6.1.6SpringBoot的Starters36.1.1启动类和核心注解@SpringBootApplicationSpringBoot应用通常都有一个名为*Application的程序入口类,该入口类需要使用SpringBoot的核心注解@SpringBootApplication标注为应用的启动类。SpringBoot的核心注解@SpringBootApplication是一个组合注解,主要组合了@SpringBootConfiguration、@EnableAutoConfiguration和@ComponentScan注解。源代码可以从spring-boot-autoconfigure-2.4.1.jar依赖包中查看org/springframework/boot/autoconfigure/SpringBootApplication.java。41.@SpringBootConfiguration注解@SpringBootConfiguration是SpringBoot应用的配置注解,该注解也是一个组合注解,源代码可以从spring-boot-2.4.1.jar依赖包中查看org/springframework/boot/SpringBootConfiguration.java。在SpringBoot应用中推荐使用@SpringBootConfiguration注解替代@Configuration注解。52.@EnableAutoConfiguration注解@EnableAutoConfiguration注解可以让SpringBoot根据当前应用项目所依赖的jar自动配置项目的相关配置。例如,在SpringBoot项目的pom.xml文件中添加了spring-boot-starter-web依赖,SpringBoot项目会自动添加Tomcat和SpringMVC的依赖,同时对Tomcat和SpringMVC进行自动配置。63.@ComponentScan注解该注解的功能是让SpringBoot自动扫描@SpringBootApplication所在类的同级包以及它的子包中的配置,所以建议将@SpringBootApplication注解的入口类放置在项目包下(GroupId+ArtifactId组合的包名),这样可以保证SpringBoot自动扫描项目所有包中的配置。7这样就不需要在配置文件中配置包的扫描。6.1SpringBoot的基本配置6.1.1启动类和核心注解@SpringBootApplication6.1.2关闭某个特定的自动配置6.1.3定制Banner6.1.4关闭banner6.1.5SpringBoot的全局配置文件6.1.6SpringBoot的Starters86.1.2关闭某个特定的自动配置通过查看@SpringBootApplication的源代码可知,应该使用@SpringBootApplication注解的exclude参数关闭特定的自动配置,以关闭neo4j自动配置为例,代码如下:@SpringBootApplication(exclude={Neo4jDataAutoConfiguration.class})9使用@EnableAutoConfiguration注解可以让SpringBoot根据当前应用项目所依赖的jar自动配置项目的相关配置。如果开发者不需要SpringBoot的某一项自动配置,该如何实现呢?6.1SpringBoot的基本配置6.1.1启动类和核心注解@SpringBootApplication6.1.2关闭某个特定的自动配置6.1.3定制Banner6.1.4关闭banner6.1.5SpringBoot的全局配置文件6.1.6SpringBoot的Starters106.1.3定制Banner首先,在src/main/resources目录下新建banner.txt文件,并在文件中添加任意字符串内容,如“#Hello,SpringBoot!”。然后,重新启动SpringBoot项目,将发现控制台启动信息已经发生改变。如果开发者想把启动字符串信息换成字符串图案,具体操作:首先,打开网站/software/taag,输入自定义字符串,单击网页下方的“Select&Copy”按钮。然后,将自定义banner字符串图案复制到src/main/resources目录下的banner.txt文件中,重新启动SpringBoot项目即可。116.1SpringBoot的基本配置6.1.1启动类和核心注解@SpringBootApplication6.1.2关闭某个特定的自动配置6.1.3定制Banner6.1.4关闭banner6.1.5SpringBoot的全局配置文件6.1.6SpringBoot的Starters126.1.4关闭banner开发者如果需要关闭banner,可以在src/main/resources目录下的perties文件中添加如下配置:spring.main.banner-mode=off136.1SpringBoot的基本配置6.1.1启动类和核心注解@SpringBootApplication6.1.2关闭某个特定的自动配置6.1.3定制Banner6.1.4关闭banner6.1.5SpringBoot的全局配置文件6.1.6SpringBoot的Starters146.1.5SpringBoot的全局配置文件SpringBoot的全局配置文件(perties或application.yml)位于SpringBoot应用的src/main/resources目录下。1.设置端口号server.port=88882.设置Web应用的上下文路径server.servlet.context-path=/XXX15这时应该通过“http://localhost:8080/XXX/testStarters”访问如下控制器类中的请求处理方法:@RequestMapping("/testStarters")publicStringindex(){}!!!在SpringBoot的全局配置文件中,可以配置与修改多个参数,读者想了解参数的详细说明和描述可以查看官方文档说明:https://docs.spring.io/spring-boot/docs/2.4.1/reference/htmlsingle/#common-application-properties。6.1SpringBoot的基本配置6.1.1启动类和核心注解@SpringBootApplication6.1.2关闭某个特定的自动配置6.1.3定制Banner6.1.4关闭banner6.1.5SpringBoot的全局配置文件6.1.6SpringBoot的Starters166.1.6SpringBoot的StartersSpringBoot提供了很多简化企业级开发的“开箱即用”的Starters。SpringBoot项目只要使用了所需要的Starters,SpringBoot即可自动关联项目开发所需要的相关依赖。例如,我们在ch6_1的pom.xml文件中,添加如下依赖配置:SpringBoot将自动关联Web开发的相关依赖,如tomcat、spring-webmvc等,进而对Web开发的支持,并将相关技术的配置实现自动配置。17<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>通过访问“https://docs.spring.io/spring-boot/docs/2.4.1/reference/htmlsingle/#using-boot-starter”官网,可以查看SpringBoot官方提供的Starters本章内容186.1SpringBoot的基本配置6.2读取应用配置6.3日志配置6.4SpringBoot的自动配置原理6.5SpringBoot的条件注解6.2读取应用配置6.2.1Environment6.2.2@Value6.2.3@ConfigurationProperties6.2.4@PropertySource196.2.1EnvironmentEnvironment是一个通用的读取应用程序运行时的环境变量的类,可以通过key-value方式读取perties、命令行输入参数、系统属性、操作系统环境变量等。【例6-1】使用Environment类读取perties配置文件的内容。1.创建SpringBoot项目ch6_1使用STS快速创建SpringWeb应用ch6_1。2.添加配置文件内容在src/main/resources目录下,找到全局配置文件perties,并添加如下内容:test.msg=readconfig206.2.1Environment3.创建控制器类EnvReaderConfigController在src/main/java目录下,创建名为com.ch6_1.controller的包(是com.ch6_1包(主类所在的包)的子包,保障注解全部被扫描),并在该包下创建控制器类EnvReaderConfigController。在控制器类EnvReaderConfigController中,使用@Autowired注解依赖注入Environment类的对象。21@RestControllerpublicclassEnvReaderConfigController{ @Autowired privateEnvironmentenv; @RequestMapping("/testEnv") publicStringtestEnv(){ return"方法一:"+env.getProperty("test.msg"); //test.msg为配置文件perties中的key }}6.2.1Environment4.启动SpringBoot应用运行Ch61Application类的main方法,启动SpringBoot应用。5.测试应用启动SpringBoot应用后,默认访问地址为:http://localhost:8080/,将项目路径直接设为根路径,这是SpringBoot的默认设置。因此,我们可以通过http://localhost:8080/testEnv测试应用(testEnv与控制器类ReaderConfigController中的@RequestMapping("/testEnv")对应)。226.2读取应用配置6.2.1Environment6.2.2@Value6.2.3@ConfigurationProperties6.2.4@PropertySource236.2.2@Value使用@Value注解读取配置文件内容示例代码如下:24@Value("${test.msg}")//test.msg为配置文件perties中的keyprivateStringmsg;//通过@Value注解将配置文件中key对应的value赋值给变量msg@RestControllerpublicclassValueReaderConfigController{

@Value("${test.msg}") privateStringmsg; @RequestMapping("/testValue") publicStringtestValue(){ return"方法二:"+msg; }}http://localhost:8080/testValue测试应用6.2读取应用配置6.2.1Environment6.2.2@Value6.2.3@ConfigurationProperties6.2.4@PropertySource256.2.3@ConfigurationProperties使用@ConfigurationProperties首先建立配置文件与对象的映射关系,然后在控制器方法中使用@Autowired注解将对象注入。【例6-3】使用@ConfigurationProperties读取配置文件内容。26

#nestSimplepropertiesobj.sname=chenhengobj.sage=88#Listpropertiesobj.hobby[0]=runningobj.hobby[1]=basketball#MapPropertiesobj.city.cid=dlame=dalian 建立配置文件与对象的映射关系27@Component//使用Component注解,声明一个组件,被控制器依赖注入@ConfigurationProperties(prefix="obj")//obj为配置文件中key的前缀publicclassStudentProperties{ privateStringsname; privateintsage; privateList<String>hobby; privateMap<String,String>city; //省略set和get方法 @Override publicStringtoString(){ return"StudentProperties[sname="+sname +",sage="+sage +",hobby0="+hobby.get(0) +",hobby1="+hobby.get(1) +",city="+city+"]";}}创建控制器类ConfigurationPropertiesController28@RestControllerpublicclassConfigurationPropertiesController{

@Autowired StudentPropertiesstudentProperties; @RequestMapping("/testConfigurationProperties") publicStringtestConfigurationProperties(){ returnstudentProperties.toString(); }}通过http://localhost:8080/testConfigurationProperties测试应用6.2读取应用配置6.2.1Environment6.2.2@Value6.2.3@ConfigurationProperties6.2.4@PropertySource296.2.4@PropertySource可以使用@PropertySource注解找到项目的其他配置文件,然后结合6.2.1~6.2.3节中任意一种方式读取即可。【例6-4】使用@PropertySource+@Value读取其他配置文件内容。在ch6_1的src/main/resources目录下创建配置文件perties和perties,并在perties文件中添加如下内容:在perties文件中添加如下内容:30your.msg=hello.my.msg=testPropertySource创建控制器类PropertySourceValueReaderOhterController在ch6_1项目的com.ch6_1.controller包中,创建名为PropertySourceValueReaderOhterController的控制器类。在该控制器类中,首先使用@PropertySource注解找到其它配置文件,然后使用@Value注解读取配置文件内容31@RestController@PropertySource({"perties","perties"})publicclassPropertySourceValueReaderOhterController{ @Value("${my.msg}")privateStringmymsg; @Value("${your.msg}")privateStringyourmsg; @RequestMapping("/testProperty") publicStringtestProperty(){return"其他配置文件perties:"+mymsg+"<br>"+"其他配置文件perties:"+yourmsg; }}通过http://localhost:8080/testProperty测试应用本章内容326.1SpringBoot的基本配置6.2读取应用配置6.3日志配置6.4SpringBoot的自动配置原理6.5SpringBoot的条件注解6.3日志配置默认情况下,SpringBoot应用使用LogBack实现日志,使用apacheCommonsLogging作为日志接口,因此代码中通常如下所示使用日志:33@RestControllerpublicclassLogTestController{

privateLoglog=LogFactory.getLog(LogTestController.class); @RequestMapping("/testLog") publicStringtestLog(){ ("测试日志"); return"测试日志"; }}日志级别日志级别有ERROR、WARN、INFO、DEBUG和TRACE。SpringBoot默认的日志级别为INFO,日志信息可以打印到控制台。但开发者可以自己设定SpringBoot项目的日志输出级别,例如在perties配置文件中加入以下配置:34#设定日志的默认级别为infologging.level.root=info#设定org包下的日志级别为warn=warn#设定com.ch.ch4_1包下的日志级别为debug.ch.ch4_1=debug输出日志到文件SpringBoot项目默认并没有输出日志到文件,但开发者可以在perties配置文件中指定日志输出到文件,配置示例如下:35logging.file=my.log该日志文件位于SpringBoot项目运行的当前目录(项目工程目录下)。logging.file=c:/log/my.log将在c:/log目录下生成一个名为my.log的日志文件。不管日志文件位于何处,当日志文件大小到达10MB时,将自动生成一个新日志文件。日志格式控制36logging.pattern.console=%level%date{yyyy-MM-ddHH:mm:ss:SSS}%logger{50}.%M%L:%m%nlogging.pattern.file=%level%date{ISO8601}%logger{50}.%M%L:%m%n控制台日志输出格式文件日志输出格式logging.pattern.console:指定控制台日志格式。logging.pattern.file:指定日志文件格式。%level:指定输出日志级别。%date:指定日志发生的时间。ISO8601表示标准日期,相当于yyyy-MM-ddHH:mm:ss:SSS。%logger:指定输出Looger的名字,包名+类名,{n}限定了输出长度。%M:指定日志发生时的方法名。%L:指定日志调用时所在代码行,适用于开发调试,线上运行时不建议使用此参数,因为获取代码行对性能有消耗。%m:表示日志消息。%n:表示日志换行。本章内容376.1SpringBoot的基本配置6.2读取应用配置6.3日志配置6.4SpringBoot的自动配置原理6.5SpringBoot的条件注解6.4SpringBoot的自动配置原理从6.1.1节,我们可知SpringBoot使用核心注解@SpringBootApplication将一个带有main方法的类标注为应用的启动类。@SpringBootApplication注解最主要的功能之一是为SpringBoot开启了一个@EnableAutoConfiguration注解的自动配置功能。@EnableAutoConfiguration注解主要利用了一个类名为AutoConfigurationImportSelector的选择器向Spring容器自动配置一些组件。@EnableAutoConfiguration注解的源代码可以从spring-boot-autoconfigure-2.4.1.jar(org.springframework.boot.autoconfigure)依赖包中查看。386.4SpringBoot的自动配置原理从源代码中可以看出,最终SpringBoot是通过加载所有(inmultipleJARfiles)META-INF/spring.factories配置文件进行自动配置的。所以,@SpringBootApplication注解通过使用@EnableAutoConfiguration注解自动配置的原理是:从classpath中搜索所有META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的配置项通过Java反射机制进行实例化,然后汇总并加载到Spring的IoC容器。39本章内容406.1SpringBoot的基本配置6.2读取应用配置6.3日志配置6.4SpringBoot的自动配置原理6.5SpringBoot的条件注解6.5SpringBoot的条件注解6.5.1条件注解6.5.2实例分析6.5.3自定义条件6.5.4自定义Starters416.5.1条件注解打开spring.factories配置文件中任意一个AutoConfiguration,一般都可以找到条件注解。所谓Spring的条件注解,就是应用程序的配置类在满足某些特定条件才会被自动启用此配置类的配置项。SpringBoot的条件注解位于spring-boot-autoconfigure-2.4.1.jar的org.springframework.boot.autoconfigure.condition包下。条件注解都是组合了@Conditional元注解,只是针对不同的条件去实现。426.5SpringBoot的条件注解6.5.1条件注解6.5.2实例分析6.5.3自定义条件6.5.4自定义Starters436.5.2实例分析从SpringMVC项目的web.xml文件中过滤器的配置可知,SpringBoot自动配置HTTP编码需要满足的条件是:配置CharacterEncodingFilter的Bean,并设置encoding和forceEncoding这两个参数。通过查看源代码可知org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration类,根据条件注解配置了CharacterEncodingFilter的Bean,并设置了encoding和forceEncoding这两个参数。446.5SpringBoot的条件注解6.5.1条件注解6.5.2实例分析6.5.3自定义条件6.5.4自定义Starters456.5.3自定义条件Spring的@Conditional注解根据满足某特定条件创建一个特定的Bean。例如,当某jar包在类路径下时,自动配置一个或多个Bean。即根据特定条件控制Bean的创建行为,这样我们就可以利用此特性进行一些自动配置。那么,开发者如何自己构造条件呢?在Spring框架中,可以通过实现Condition接口,并重写matches方法来构造条件。【例6-7】如果类路径classpath(src/main/resources)下存在文件perties,则输出“perties文件存在。”;否则输出“perties文件不存在!”。46构造条件47publicclassMyConditionimplementsCondition{ @Override publicbooleanmatches(ConditionContextcontext,AnnotatedTypeMetadatametadata){ returncontext.getResourceLoader().getResource("classpath:perties").exists(); }}publicclassYourConditionimplementsCondition{ @Override publicbooleanmatches(ConditionContextcontext,AnnotatedTypeMetadatametadata){ return!context.getResourceLoader().getResource("classpath:perties").exists(); }}创建不同条件下Bean的类48packagecom.ch6_1.conditional;publicinterfaceMessagePrint{ publicStringshowMessage();}packagecom.ch6_1.conditional;publicclassMyMessagePrintimplementsMessagePrint{ @Override publicStringshowMessage(){ return"perties文件存在。"; }}packagecom.ch6_1.conditional;publicclassYourMessagePrintimplementsMessagePrint{ @Override publicStringshowMessage(){ return"perties文件不存在!"; }}创建配置类49@ConfigurationpublicclassConditionConfig{

@Bean

@Conditional(MyCondition.class) publicMessagePrintmyMessage(){ returnnewMyMessagePrint(); }

@Bean @Conditional(YourCondition.class) publicMessagePrintyourMessage(){ returnnewYourMessagePrint(); }}使用@Bean和@Conditional实例化符合条件的Bean创建测试类50packagecom.ch6_1.conditional;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;publicclassTestMain{ privatestaticAnnotationConfigApplicationContextcontext; publicstaticvoidmain(String[]args){ context=newAnnotationConfigApplicationContext(ConditionConfig.class); MessagePrintmp=context.getBean(MessagePrint.class); System.out.println(mp.showMessage()); }}运行当SpringBoot应用ch6_1的src/main/resources目录下存在perties文件时,运行测试类,控制台显示“perties文件存在。”;当SpringBoot应用ch6_1的src/main/resources目录下不存在perties文件时,运行测试类,控制台显示“perties文件不存在!”。516.5SpringBoot的条件注解6.5.1条件注解6.5.2实例分析6.5.3自定义条件6.5.4自定义Starters526.5.4自定义Starters从6.1.6节可知,第三方为SpringBoot贡献了许多Starters。那么,我们作为开发者是否也可以贡献自己的Starters?学习SpringBoot的自动配置机制后,答案是肯定的。【例6-8】自定义一个Starter(spring_boot_mystarters)。要求:当类路径中存在MyService类时,自动配置该类的Bean,并可以将相应Bean的属性在perties中配置。53新建SpringBoot项目spring_boot_mystarters首先,通过选择菜单“File->New->SpringStarterProject”打开“NewSpringStarterProject”对话框。其次,在对话框中输入项目名称spring_boot_mystarters。最后,单击“Next”与“Finish”按钮。54修改pom文件修改SpringBoot项目spring_boot_mystarters的pom文件,增加SpringBoot自身的自动配置作为依赖。55<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId></dependency>创建属性配置类MyProperties56packagecom.ch.spring_boot_mystarters;importperties.ConfigurationProperties;//在perties中通过my.msg=设置属性@ConfigurationProperties(prefix="my")publicclassMyProperties{ privateStringmsg="默认值"; publicStringgetMsg(){ returnmsg; } publicvoidsetMsg(Stringmsg){ this.msg=msg; }}创建判断依据类MyService自定义的Starters将根据该类的存在与否来创建该类的Bean,该类可以是第三方类库的类。57packagecom.ch.spring_boot_mystarters;publicclassMyService{ privateStringmsg; publicStringsayMsg(){ return"my"+msg; } publicStringgetMsg(){ returnmsg; } publicvoidsetMsg(Stringmsg){ this.msg=msg; }}创建自动配置类MyAutoConfiguration58@Configuration//开启属性配置类MyProperties提供参数@EnableConfigurationProperties(MyProperties.class)//类加载器(类路径)中是否存在对应的类@ConditionalOnClass(MyService.class)//应用环境中属性是否存在指定的值@ConditionalOnProperty(prefix="my",value="enabled",matchIfMissing=true)publicclassMyAutoConfiguration{ @Autowired privateMyPropertiesmyProperties; @Bean //当容器中不存在MyService的Bean时,自动配置这个Bean

@ConditionalOnMissingBean(MyService.class) publicMyServicemyServic

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论