springboot加强

1.SpringBoot配置文件:修改springboot配置的默认值  

a)  配置文件名称:application.properties或application.yml

                 i.     application.properties传统方式,不是很优美规范

                ii.     application.yml: 冒号后面必须加上一个空格,且属性和值是大小写敏感的

  1. 配置例子语法

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  #指定是属于哪一个环境,是否已经激活

  1. 自动配置的原理

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.     配置视图解析器

  1. 直接在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应用

原文地址:https://www.cnblogs.com/8888-lhb/p/11538501.html