springboot加强
1.SpringBoot配置文件:修改springboot配置的默认值
a) 配置文件名称:application.properties或application.yml
i. application.properties传统方式,不是很优美规范
ii. application.yml: 冒号后面必须加上一个空格,且属性和值是大小写敏感的
- 配置例子语法
a) server:
port: 8081
path: /hello
b) 在yml配置文件配置对象的属性和值的写法:换行一定要缩进
friends:
lastName: zhangsan
age: 20
c) springboot读取配置
a) 使用@value标签读取
i. 配置文件配置
user:
name: ls
age: 18
ii. 绑定配置对象
@Component
public class User {
//@Value :从配置文件中取值 SPEL
@Value("${user.name}")
private String name = "zs";
@Value("${user.age}")
private Integer age = 18;
b) 使用@ConfigrationProperties
i. 配置文件配置
user:
name: ls
age: 18
ii. 绑定配置对象
@Component
@ConfigurationProperties(prefix = "person")
public class User {
//@Value :从配置文件中取值 SPEL
@Value("${user.name}")
private String name = "zs";
@Value("${user.age}")
private Integer age = 18;
2.多环境配置切换
a)
spring:
profiles:
active: prod #激活环境名称
---
server:
port: 8082
spring:
profiles: dev #指定环境名称是属于哪一个环境
---
server:
port: 8083
spring:
profiles: prod #指定是属于哪一个环境,是否已经激活
- 自动配置的原理
a)
3.Springboot整合测试
a) 导入测试依赖包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
类上打注解
@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class) //这事一个Spring测试,要告诉它在哪儿加载Spring配置文件,其实告诉它应用类型就ok
classes = 配置类的字节码对象
4.Springboot的日志支持slf4j日志框架实现
日志级别:trance<debug<info<warn<error,springboot是默认是开启info级别
如果要修改springboot默认的日志级别,就在springboot的主配置文件里面去修改日志级别,注意:这里一定要加上你打印日志所在类的包名
#修改springboot的默认的日志级别
logging:
level:
cn://包名,需要输出的日志的包
itsource:trace //日志级别
#root: trace
#根日志级别
a) slf4j日志框架实现了对其他日志框架封装
获取日志打印器
Logger
logger = LoggerFactory.getLogger(Xxx.class); //
所在类的字节码对象
logger.error("这是error错误");
对日志文件进行封装,每次运行就会打印出这个日志信息
b) slf4j日志框架通过门面设计模式来设计,但是其他日志框架又不遵循slf4j的规范,所以就slf4j设计了一个适配器模式来适配其他日志框架.重新写了一个包来适配其他日志框架.
logging:
level:
cn:
itsource: trace
file: mylog.txt #在target平级生成一个日志文件叫mylog.txt文件
pattern:
file: %d{yyyy-MM-dd} ===
[%thread] === %-5level === %logger{50} ==== %msg%n # 指定文件中日志输出的格式
b) 日志指定配置,当配置满足不了我们的需求时使用(logback-spring.xml),在springboot里面的日志框架是认识logback-spring.xml这个xml文件的.
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="1 seconds">
<!-- 日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n"/>
<!--ConsoleAppender 用于在屏幕上输出日志-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--定义控制台输出格式-->
<encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日志文件生成的路径-->
<file>logs/springboot.log</file>
<!--日志滚动条,日志文件装不下自动生成下一个日志文件-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--滚动条日志文件名称--> <fileNamePattern>logs/springboot-%d{yyyyMMdd}-%i.log.gz</fileNamePattern>
<maxFileSize>1KB</maxFileSize>
<maxHistory>30</maxHistory>
<!--滚动条日志文件总上限大小-->
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<!--定义控制台输出格式-->
<encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--root是默认的logger 这里设定输出级别是debug-->
<root level="info">
<!--定义了两个appender,日志会通过往这两个appender里面写-->
<!--会在控制台和日志文件进行一个输出-->
<appender-ref ref="stdout"/>
<appender-ref ref="file"/>
</root>
<!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
<!--additivity表示要不要使用rootLogger配置的appender进行输出-->
<logger name="cn.itsource" level="trace" additivity="false">
<appender-ref ref="stdout"/>
<appender-ref ref="file"/>
</logger>
</configuration>
5.模板引擎
a) 一些模板引擎: JSP、Velocity、Freemarker、Thymeleaf
b) Springboot推荐使用Thymeleaf模板引擎
i. 导入Thymeleaf包
<!--thymeleaf模板引擎包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
ii. 定义一个类设置模板生成的位置
@ConfigurationProperties(prefix = "spring.thymeleaf") public class ThymeleafProperties { // 定义编码格式 private static final Charset DEFAULT_ENCODING = StandardCharsets.UTF_8; // 定义视图解析前缀 private static final String DEFAULT_PREFIX = "classpath:/templates/"; // 定义视图解析后缀 private static final String DEFAULT_SUFFIX = ".html"; } 将HTML页面放入classpath:/templates/, thymeleaf会对页面进行自动渲染
这里本人没有写完ThymeleafProperties,因为springboot自身封装了前缀和后缀,直接写一个模板,就会自动生成一个页面,跳转页面时直接跳转到页面文件名.
iii. 配置视图解析器
- 直接在application.yml里面配置前缀和后缀
thymeleaf:
prefix: classpath:/templates/
suffix: .html
iv. Controller层
@Controller public class HelloController { @RequestMapping("/hello") public String hello(Model model){ //想页面 model.addAttribute("hello","yhptest"); //返回hello.HTML页面 return "hello"; } }
iv页面展示返回的数据
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>成功!</h1>
<!--使用语法th:text 将div里面的文本内容设置为 -->
<div th:text="${hello}">这是显示欢迎信息</div>
</body>
</html>
8.Springboot拦截器配置
1.自定义一个MyHanderAdapter 去实现(HanderInterceptor)
赋写preHeader方法
public class MyHandlerInterceptor implements HandlerInterceptor {
long start = System.currentTimeMillis();
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
start = System.currentTimeMillis();
return true;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("Interceptor cost="+(System.currentTimeMillis()-start));
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
这里我们需要实现HandlerInterceptor这个接口,这个接口包括三个方法,preHandle是请求执行前执行的,postHandler是请求结束执行的,但只有preHandle方法返回true的时候才会执行,afterCompletion是视图渲染完成后才执行,同样需要preHandle返回true,该方法通常用于清理资源等工作。除了实现上面的接口外,我们还需对主配置类其进行配置:
1 @Configuration 2 3 public class InterceptorConfig extends WebMvcConfigurerAdapter { 4 5 注入我们自定义的拦截器 6 @Autowired 7 8 private MyHandlerInterceptor myHandlerInterceptor; 9 10 @Override 11 12 public void addInterceptors(InterceptorRegistry registry) { 13 14 registry.addInterceptor(myHandlerInterceptor).addPathPatterns("/**");//拦截所有 15 16 super.addInterceptors(registry); 17 18 } 19 20 }
2.主配置类实现WebMvcConfigrater
赋写addInterceptor方法添加拦截器 // 添加拦截器 @Override public void addInterceptors(InterceptorRegistry registry) { // excludePathPatterns("/login"),放行/login路径,其他路径放行 registry.addInterceptor(myHealderConfigraterAdaper).excludePathPatterns("/login"); }
3.添加视图控制器
// 添加视图控制器 @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/mm").setViewName("hello2");//设置页面名称 }
9.springboot持久化
1.导入数据库驱动包和mybatis与springboot的整合包
(1) 2.手动配置DataSource:自定义配置类配置DataSource,在yml配置四大金刚.
在application.properties添加配置文件;
######################################################## ###datasource ######################################################## spring.datasource.url = jdbc:mysql://localhost:3306/ssm spring.datasource.username = root spring.datasource.password = root spring.datasource.driverClassName = com.mysql.jdbc.Driver spring.datasource.max-active=20 spring.datasource.max-idle=8 spring.datasource.min-idle=8 spring.datasource.initial-size=10
//配置别名
mybatis.type-aliases-package=包名,包名….
测试的时候一定要在配置类上配置@MapperScan("cn.itsource.springboot.mapper")扫描Mapper层
3.springboot自动配置DataSource
https://blog.csdn.net/tt50335971/article/details/85254730
4.springboot集成mybatis
<!-- mysql 数据库驱动. -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--
spring-boot mybatis依赖:
请不要使用1.0.0版本,因为还不支持拦截器插件,
1.1.1 是博主写帖子时候的版本,大家使用最新版本即可
-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
5事务实现
1.注解方式实现事务:配置类上@EnableTranscationManagment,在service层打上@Transcational标签
2.xml配置实现事务
c)导入aop的集成包
a)写一个xml配置文件
b)主配置类上使用注解导入xml配置文件
<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- aop应用事务管理 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
//只读事务
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
<tx:method name="get*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="search*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
//支持所有事物
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut expression="execution(* cn.itsource.eloan.core.service..*.*(..))" id="coreServicePointcut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="coreServicePointcut"/>
</aop:config>
注意:一定要在主配置类上加@ImportResource("classpath:xml文件名 ")标签
10,pageHeler分页使用: PageHelper是mybatis一个插件,可以用它完成分页
1.导入他的依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>4.1.0</version>
</dependency>
2.不用写count和每页条数的SQL语句和limit语句,返回的page对象相当于是之前的PageList对象,封装了我们之前写的count(数据总数)和ArrayList(每页的数据)
3.service层调用PageHelper去查询总条数和每页显示的数据数,查询的数据封装成Page对象, 返回这个Page对象.
public class testPageHelper { @Test public void testPageHelper() { //创建一个 spring 容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext*.xml"); //从 spring 容器中获取 TbItemMapper 代理对象 TbItemMapper tbItemMapper = applicationContext.getBean(TbItemMapper.class); //执行查询 TbItemExample example = new TbItemExample(); //分页处理 PageHelper.startPage(1, 10); //第一页 取10条 List<TbItem> list = tbItemMapper.selectByExample(example); for (TbItem tbItem : list) { System.out.println(tbItem.getId() + " "+ tbItem.getTitle()); } //取分页信息 PageInfo<TbItem> pageInfo = new PageInfo<>(list); System.out.println(pageInfo.getTotal()); } }
11.搭建一个完整springboot应用
浙公网安备 33010602011771号