sprint boot学习笔记
不成文的共识:对于业务类使用注解,例如对于MVC的开发,
控制器使用@Controller
业务层使用@Service,
持久层使用@Repository
而对于一些公用的Bean,例如对于数据库(Redis)、第三方资源等使用XML配置
sprint boot的一些注解
@RequestMapping(“/test”)
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
@GetMapping(“/test”)
是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写, @PostMapping同理
@Controller
表示该类代表控制器类(控制层/表现层), 这里控制层里面的每个方法,都可以去调用@Service标识的类(业务逻辑层),@Service标识的类中的方法可以继续调用@Resposity标识的接口实现类(Dao层/持久层)。
@ResponseBody
将java对象转为json格式的数据,注意:在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据
@RestController
是@ResponseBody和@Controller的组合注解
@Component(“bean_id”)
相当于配置文件中的 ,括号内也可不写,默认驼峰命名,当我们的类不属于各种归类的时候(不属于@Controller、@Services等的时候),我们就可以使用@Component来标注这个类
@PropertySource(“classpath:/cookie.properties”)
用于引入外部属性配置(resources下的cookie.properties)其中ignoreResourceNotFound 表示没有找到文件是否会报错,默认为false,就是会报错,一般开发情况应该使用默认值
@ConfigurationProperties(prefix = “cookie.tb”)
获取前缀为cookie.tb这些属性
对于 Spring Boot,创建一个 CookieProperties 类型的 bean,我们可以通过下面几种方式将其添加到应用上下文中,首先,我们可以通过添加 @Component 注解让 Component Scan 扫描到,
当我们为属性配置错误的值时,而又不希望 Spring Boot 应用启动失败,我们可以设置ignoreInvalidFields 属性为 true (默认为 false),样,Spring Boot 将会设置默认值
@Configuration
用于定义配置类,@Bean标注在方法上(返回某个实例的方法),等价于spring的xml配置文件中的
@NoArgsConstructor和@AllArgsConstructor
用于为类自动生成无参数构造函数和所有参数构造函数,简化代码编写
@ControllerAdvice
这是一个Spring MVC的注解,用于对Controller层全局异常处理和全局数据绑定进行统一管理。使用@ControllerAdvice注解的类可以被看作是对多个Controller类的通知(Advice),可以定义全局的异常处理器和数据绑定规则
springboot
核心原理:自动装配
核心思想:约定大于配置
约定的配置就是默认的配置,有了约定的配置,于是springBoot就说,大家开发新功能的时候,不要一上来就去自己动手配置,先看看我们约定的配置满不满足需求。如果不满足,你再去配置适合自己业务场景。但大部分你就按照约定的来,就可以了
回顾spring
容器Spring是为 了解决企业级应用开发的复杂性而创建的,简化开发
Spring是如何简化Java开发的
为了降低Java开发的复杂性,Spring采用了 以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程;
2、通过I0C,依赖注入(DI) 和面向接口实现松耦合;
3、基于切面(AOP)和惯例进行声明式编程;
4、通过切面和模版减少样式代码;
如何学习新东西,如何持续学习,如何关注这个行业
微服务了解
它要求我们在开发一个应用的时候,这个应用必须构建成一系列小模块的组合;可以通过http的方式进行互通
微服务架构就是将应用按功能来分为许多小块
一个大型系统的微服务架构,就像一个复杂交织的神经网络,每-个神经元就是-一个功能元素,他们各自完成自己的功能,然后通过http相互请求调用。比如一个电商系统,查缓存、连数据库、浏览。如果修改其中的一个功能,只需要更新升级其中一个功能服务单元即可。
●构建一个个功能独立的微服务应用单元,可以使用springboot, 可以帮我们快速构建一个 应用;
●大型分布式网络服务的调用,这部分由spring cloud来完成,实现分布式;
●在分布式中间,进行流式数据计算、批处理,我们有spring cloud data flow。
●spring 为我们想清楚了整个从开始构建应用到大型分布式应用全流程方案。
新建第一个springboot程序
Artifact:项目名字
packages:尽量与Group一样
删掉多余的文件
打包成jar文件
双击点击package
在生成的jar文件目录打开cmd
java -jar 名称.jar
自定义启动标志
在resources下新建banner.txt
banner.txt
// _ooOoo_ //
// o8888888o //
// 88" . "88 //
// (| ^_^ |) //
// O\ = /O //
// ____/`---'\____ //
// .' \\| |// `. //
// / \\||| : |||// \ //
// / _||||| -:- |||||- \ //
// | | \\\ - /// | | //
// | \_| ''\---/'' | | //
// \ .-\__ `-` ___/-. / //
// ___`. .' /--.--\ `. . ___ //
// ."" '< `.___\_<|>_/___.' >'"". //
// | | : `- \`.;`\ _ /`;.`/ - ` : | | //
// \ \ `-. \_ __\ /__ _/ .-` / / //
// ========`-.____`-.___\_____/___.-`____.-'======== //
// `=---=' //
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //
// 佛祖保佑 永不宕机 永无BUG //
启动类
:
结论:springboot所有的自动配置都在启动类中被扫描并加载:spring.factories所有的自动配置类都在这里面,但不一定生效
要判断条件是否成立,只要导入了对应的start,或pom文件映入就有对应的启动器了,有了启动器,自动装配就会生效,然后就配置成功
1.springboot在启动的时候,从类路径下/META-INF/ spring. factories获取指定的值;
2.将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置
3.以前我们需要自动配置的东西,现在springboot帮我们做了!
4.自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下
5.它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
6.容器中也会存在非常多的xxAutoConfiguration的文件(@Bean), 就是这些类给容器中导入了这个场景需要的所有组件;并自动配置,@Configuration,JavaConfig!
7.有了自动配置类,兔去了我们手动编写配置文件的工作
SpringApplication.run(MyApplication.class, args);
不仅仅启动方法,更是启动了服务,以进程方式启动
SpringApplication主要做了四件事情
1.推断应用的类型是普通的项目还是Web项目
2.查找并加载所有可用初始化器,设 置到initializers属性中
3.找出所有的应用程序监听器,设置到listeners属性中
4.推断并设置main方法的定义类,找到运行的主类
关于SpringBoot,谈谈你的理解:
“约定大于配置”
1.自动装配
2.run() {有一些全局存在的监听器,它会去获取上下文bean}
关于spring boot模糊查询
mapper错误sql语句:
@Select("select * from om_hour where data_time like '#{t_hours}%'")
@Results({
@Result(column = "company_id",property = "mn")
})
List<OmHour> OM_hour_select(@Param("t_hours") String t_hours );
错误提示:
Caused by: java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)
解决方法:
将%加在控制层的参数里
mapper文件
@Select("select * from om_hour where data_time like #{t_hours}")
controller文件:
List<OmHour> water_data=sfes_yueyangMapper.OM_hour_select(t_hours+"%");
关于java的自定义异常
Java的自定义异常指的是程序员在开发过程中需要自定义的一些异常类,用于处理程序出现不可预知的异常情况。通过自定义异常可以更加灵活地抛出和捕获异常,并且可以为异常提供更加清晰的错误信息,方便程序员进行调试。常见的自定义异常有继承RuntimeException或Exception两种方式实现
实例:
import lombok.Getter;
@Getter
public class ServiceException extends RuntimeException{
private String code;
public ServiceException(String code,String msg){
super(msg);
this.code=code;
}
}
springboot集成JWT权限验证
JWT:json web token 它将用户信息加密到token里,服务区通过使用保存的密钥验证token的正确性,正确及通过验证
优点:
1.简洁,数据量小,速度快
2.token包含了用户信息,避免了多次查询数据库
3.不需要在服务端保存会话信息,适合分布式微服务
缺点:
1.对数据过期不好处理
2.无法作废,不太安全