SpringBoot的自动配置原理
1.@SpringBootApplication
标注这个注解的类是一个springBoot应用
1.2.@SpringBootConfiguration
springBoot的配置注释
1.2.1.@Configuration
代表SpringBootConfiguration是spring的配置类,本质还是spring的注解
2.@EnableAutoConfiguration
自动配置
2.1.@AutoConfigurationPackage
自动配置包
2.2@Import({AutoConfigurationImportSelector.class})
导入AutoConfigurationImportSelector.class
2.2.1 AutoConfigurationImportSelector.class
1)public String[] selectImports
(AnnotationMetadata annotationMetadata) {}
选择组件
1)getAutoConfigurationEntry
获取所有的自动配置
2)getCandidateConfigurations
获取到候选配置,需要的时候才导入
3) loadFactoryNames
获取 META-INF/spring.factories 中的资源
3.@ComponentScan
扫描所在包及其子包的的类是否有贴Cmpnent注解,并将其对象交给spring容器
@ConfigurationProperties 绑定对象属性
作用:省去了使用@value进行值的注入,使用该注解可以自动进行值的注入,读取配置文件的内容
这个注解贴在类上,必须保证类的属性名和绑定的参数名相同,默认的绑定的配置文件"application.properties"
@Component
@ToString
@Setter
@ConfigurationProperties(prefix="jdbc")
public class MyDataSource {
private String driverClassName;
private String url;
private String username;
private String password;
}
SpringBoot项目的实战
注意事项
application.prperties
1.数据库的配置需要设置时区
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql:///rbac?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=admin
2.配置mapper接口的代理类
在主程序类上贴注解@MapperScan,需要标明扫描mapper文件的位置
@SpringBootApplication
@MapperScan("cn.wolfcode.mapper")
public class SsmApplication {
public static void main(String[] args) {
SpringApplication.run(SsmApplication.class, args);
}
}
事务管理
注解的方式实现
在业务层的实现类上或者其他 方法上直接贴@Transactional注解
配置代理的方式
springBoot默认使用的是CGLIB动态代理,在配置文件中进行修改代理类为JDK代理
spring.aop.proxy-target-class=false
静态资源的处理
- 默认情况下,Spring Boot 会从 classpath 下的 /static,/public,/resources,/META-INF/resources 下加载静态资源。
- 可以在 application.properties 中修改静态资源加载地址。
# 告诉 Spring Boot 什么访问的路径是找静态资源
spring.mvc.static-path-pattern=/static/**
统一异常处理
将出现的错误视图导向到静态文件中,状态码就是视图的名称,classpath:/static/error/
出现 404 错误 -> classpath:/static/error/404.html
出现 5xx 错误 -> classpath:/static/error/5xx.html
统一异常处理
自定义一个控制器增强,用于处理异常,一般用于5xx错误,使注解
@ControllerAdvice:对controller增强,使用的动态代理
@ExceptionHandler:指定对哪一种异常进行处理
//在这个方法统一处理异常,一般用于处理5xx异常
@ControllerAdvice //对Controller的增强,使用的是动态代理
public class ExceptionControllerAdvice {
//指定对那种异常处理
@ExceptionHandler(RuntimeException.class)
public String handleException(RuntimeException e, Model model) {
System.out.println("异常信息");
return "xxxx";
}
}
添加拦截器
编写拦截器
@Component
public class LoginIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("登录检查");
return true; //放行
}
}
配置拦截器
定义一个配置类(单独建包),实现WebMvConfig接口,需要在addInterceptors方法中注册拦截器
@Configuration
public class MyMvcConfigure implements WebMvcConfigurer {
@Autowired
private LoginIntercepter loginIntercepter;
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginIntercepter)
.addPathPatterns("/**")//对哪些资源做拦截
//不对哪些资源做拦截,
// 访问时的路径:http://localhost:8080/static/index.html
//在配置文件中还必须添加:spring.mvc.static-path-pattern=/static/**
.excludePathPatterns("/static/**");
}
}
系统日志
使用日志的作用
1.日志框架更为灵活,可以将输出和代码进行分离,
2.日志框架可以定义日志的输出环境,控制台,文件,数据库
3.方便定义日志的输出格式和级别
输出日志的方式
方式一:
在需要输出日志的地方进行创建对象
Logger logger = LoggerFactory.getLogger(CourseController.class);
logger.info("查询可成功");
logger.debug("查询可成功");
logger.error("查询可成功");
logger.trace("查询可成功")
方式二:
使用注解**@Slf4j**贴在类上,不用重新new对象,直接使用log.xxx进行输出
log.info("插入成功");
log.debug("插入成功");
log.warn("插入成功");
日志的级别
级别越高,输出的内容就少
trace<debug<info<warn<error