【三】day08/27(个人笔记)Spring相关知识点

DI解析器 context:annotation-config/ (可以不配)

零件扫描 <context:component-scan base-package=“路径”/>

AOP注解解析器 aop:aspectj-autoproxy/ 让AOP的注解起作用

MVC注解解析器 mvc:default-servlet-handler/

DI注解 注入而已(propery)

Ioc注解(bean)

四个注解的功能是相同的,只是用于标注不同类型的类上:

  • @Repository:用于标注数据访问组件,即 DAO 实现类上。
  • @Service:用于标注业务层实现类上。
  • @Controller:用于标注控制层类上(如 SpringMVC 的 Controller)。
  • @Component:当不是以上的话,可以使用这个注解进行标注

AOP

AOP术语

  • Joinpoint:连接点,一般指需要被增强的方法。where:去哪里做增强。
  • Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是连接点的集合。where:去哪些地方做增强。
  • Advice:增强,当拦截到 Joinpoint 之后,在方法执行的什么时机(when)做什么样(what)的增强。根据时机分为:前置增强、后置增强、异常增强、最终增强、环绕增强。
  • Aspect:切面,Pointcut + Advice,去哪些地方 + 在什么时候 + 做什么增强。
  • Target:被代理的目标对象。
  • Weaving:织入,把 Advice 加到 Target 上之后,创建出 Proxy 对象的过程。
  • Proxy:一个类被 AOP 织入增强后,产生的代理类

Spring Boot:

1、JavaConfig 方式配置 IoC

JavaConfig 方式中使用注解彻底的替代 XML 文件,那么到底要怎么告诉 Spring 容器,bean 没有定义在 XML 文件中,而是定义在一个 Java 配置类中。

  • @Configuration:在类上贴该注解表示该类是 Spring 的配置类,具有 applicationContext.xml 文件的作用。
  • @Bean:在 Spring 的配置类的方法上贴该注解后,该方法返回的对象会交给 Spring 容器管理,替代 applicationContext.xml 中的 bean 标签。
  • @ComponentScan:在 Spring 配置类上贴该注解表示开启组件扫描器,默认扫描当前配置类所在的包,也可以自己指定,替代 XML 配置中的 <context:component-scan /> 标签。
  • AnnotationConfigApplicationContext:该类是 ApplicationContext 接口的实现类,该对象是基于 JavaConfig 的方式来运作的 Spring 容器。

2.配置类方式

@Import(OtherJavaConfig.class) // 在主配置类中关联次配置类

@ImportResource(“classpath:XML文件路径”) // 在主配置类中关联 XML 配置

Spring boot(正式):

1.问题:

​ 1.创建Spring boot项目的时候可能报错 https://start.aliyun.com/

​ 2.规范

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r4Pug0Co-1661561404399)(C:\Users\luzey\AppData\Roaming\Typora\typora-user-images\image-20220711095110859.png)]

2.相关注解:

@SpringBootTest 表示该类是一个测试类

@SpringBootApplication 表示该类是一个配置类,底层有自动装配事务的相关注解 @ComponentScan:开启组件扫描

3.Spring Boot 参数配置(掌握)

1、参数来源

  • 命令行启动项目时传入的参数,如:java -jar xxx.jar --server.port=80
  • application.properties 或者 application.yml 文件。

一般用的比较多的就是直接在 application.properties 或者 application.yml 配置,其次是命令行启动方式。

1.2、application.yml 语法

server:  
  port: 80
  session-timeout: 30  
  tomcat.uri-encoding: UTF-8  
  
spring:  
  datasource:  
    url: jdbc:mysql://localhost:3306/crm  
    username: root  
    password: admin  
    driverClassName: com.mysql.jdbc.Driver

Spring Boot 自动配置原理

<!-- MySQL 驱动 -->
	数据源
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>
<!-- Spring JDBC 和 TX -->
SqlSessionFactoryBuilder
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Mybatis 集成到 SpringBoot 中的依赖 -->
连接mapper	调用mapper
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>
# 配置数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///area?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin

# 配置别名
mybatis.type-aliases-package=cn.wolfcode.domain

# 打印 SQL 日志
logging.level.cn.wolfcode.mapper=trace
# 告诉 Spring Boot 什么访问的路径是找静态资源 		#方便后面操作拦截器
spring.mvc.static-path-pattern=/static/**
集成 Thymeleaf
<!-- 引入 Thymeleaf 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
# 热部署文件,页面不产生缓存,及时更新
spring.thymeleaf.cache=false
统一异常处理

自己定义一个控制器增强器,专门用于统一异常处理,该方式一般用于 5xx 类错误。

@ControllerAdvice // 控制器 增强器
public class ExceptionControllerAdvice {
    @ExceptionHandler(RuntimeException.class) // 处理什么类型的异常
    public String handlException(RuntimeException e, Model model) {
        e.printStackTrace(); // 记得这行代码保留,不然项目后台出异常,开发工具控制台看不多错误信息
        return "errorView"; // 指定错误  页面视图名称
    }
}
添加拦截器

1.编写拦截器 师兄handlerInter… 重写preHandle

2.配置类拦截器

@Autowired
private LoginInterceptor loginInterceptor;

@Autowired
private PermissionInterceptor permissionInterceptor;

public void addInterceptors(InterceptorRegistry registry) {
    // 注册登录拦截器
    registry.addInterceptor(loginInterceptor)
        // 对哪些资源起过滤作用
        .addPathPatterns("/**")
        // 对哪些资源起排除作用
        .excludePathPatterns("/login", "/static/**");
    // 注册登录拦截器
    registry.addInterceptor(permissionInterceptor)
        // 对哪些资源起过滤作用
        .addPathPatterns("/**")
        // 对哪些资源起排除作用
        .excludePathPatterns("/login", "/static/**");
}
}
系统日志

1.@Slf4j 然后添加配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:开启日志框架的热部署,默认值 true 表示开启
    scanPeriod:热部署的频率,默认值 60 second
    debug:设置输出框架内部的日志,默认值 false
-->
<configuration scan="true" scanPeriod="60 second" debug="false">
    <property name="appName" value="springboot demo" />
    <contextName>${appName}</contextName>
    
    <!-- appender:日志输出对象,配置不同的类拥有不同的功能
        ch.qos.logback.core.ConsoleAppender:日志输出到控制台        
    -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd-HH:mm:ss} %level [%thread]-%logger{35} >> %msg %n</pattern>
     </encoder>
   </appender>
    
    <!-- ch.qos.logback.core.FileAppender:日志输出到文件中 -->
    <appender name="fileAppender" class="ch.qos.logback.core.FileAppender">
        <encoder>
            <pattern>%-4relative [%thread] %level %logger{35} - %msg %n</pattern>
       </encoder>
        <append>true</append>
        <file>mylog.log</file>
   </appender>

    
    <!-- 
        root 是项目通用的 logger,一般情况下都是使用 root 配置的日志输出
        level:按照级别输出日志,日志级别,级别越高,输出的内容越少
    -->
   <root level="info">
        <appender-ref ref="STDOUT" />
    </root>
    //这里表示是不是要把日志显示在文件里 把 STDOUT --> fileAppender
    
    <!-- 自定义的 logger,用于专门输出特定包中打印的日志
    <logger name="cn.wolfcode.crm.mapper" level="trace">
    </logger>
	-->
</configuration>
其他功能(热部署)

好用依赖,实时更新,不用重启项目:

<!-- Spring Boot 热部署插件 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
切换运行环境

???

Spring boot实战

1.当数据发生改变的时候可以使用重定向(delete,update)

2.只有设置了 name 属性的表单元素才能在提交表单时传递它们的值

mybatis_plus

1.lombda表达式优先执行(优先级高()) (i->i.xxx)

2.type类型 自动增长

3.开启逻辑删除 @TableLogic

4.代码示例

@Test
void test6(){
    QueryWrapper<User> u = new QueryWrapper<>();
    u.select("name","age");//查询指定字段
    List<Map<String, Object>> maps = userMapper.selectMaps(u);
    maps.forEach(System.out::println);
}

@Test
void  test7(){
    QueryWrapper<User> u = new QueryWrapper<>();
    u.inSql("age","select age from user where age<=20");//子查询
    userMapper.selectList(u).forEach(System.out::println);
}

5.StringUtils.isNotBlank(变量) //不为null,不为" "

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值