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,不为" "