springBoot
来源:互联网 发布:深圳奥凯软件 编辑:程序博客网 时间:2024/06/14 19:36
1、微服务、微框架
springBoot是的springMVC升级版,两者没有必然的联系,可以直接学springBoot。
微服务:当下比较流行的架构或者说解决方案,很多公司都在用,spring家族为微服务架构提供了一整套组件,统称为SpringCloud。要使用SpringCloud就必须要先学会使用SpringBoot,SpringCloud是建立在SpringBoot的基础之上,学习SpringBoot为微服务打基础。
属性配置(例如下图是数据库的配置):
@Value:实现配置文件(这里是yml文件)的注入,随着配置文件的增加,建议对配置文件做一个分组,那么就要用到(读yml中的属性)
@Component@ConfigurationProperties. – 把配置写到类里面去,最好做一个分组
spring: profiles: active: dev datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/dbgirl username: root password: admin jpa: hibernate: ddl-auto: update show-sql: true
//获取前缀是girl的配置 获取yml配置//把girl下面的那些属性都映射过来@Component //要在controller中注入,需要这个注解。@ConfigurationProperties(prefix = "girl")public class GirlProperties { private String cupSize; private Integer age; public String getCupSize() { return cupSize; } public void setCupSize(String cupSize) { this.cupSize = cupSize; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; }}
controller的使用
@Controller – 如果不加这个注解,浏览器是无法访问到的
(@Controller必须配合模板使用,但是模板不推荐,所以要配合@ResponseBody)
@RestController等同于@Controller和@ResponseBody的组合//写上这个注解,自动返回json格式数据
模板的方式了解下就行,因为
现在开发方式都是前后端分离的,后端只需要提供一些rest接口返回json格式给前端就可以了。而不用模板的方式,用模板的方式会给性能带来很大的损耗,
处理url映射:@RequestMapping(value = {"/hello","/hi"},method = RequestMethod.GET)RequestMethod.GET还是要指定,因为使用的场景不同,为了安全起见还是要指定。
处理url里的参数:@GetMapping(value = "/say")public String say(@PathVariable("id") Integer myId){ return "id: " + myId;// return girlProperties.getCupSize(); }http://127.0.0.1/hello/say/23 @GetMapping(value = "/say") //推荐这个写法,和下面两行等同//@PostMapping(value = "/say")//@RequestMapping(value = {"/hello","/hi"},method = RequestMethod.GET)public String say(@RequestParam(value = "id",required = false,defaultValue = "0") Integer myId){ return "id: " + myId;// return girlProperties.getCupSize(); }http://127.0.0.1/hello/say?id=23不管用get还是post都用@RequestParam来获取请求参数的值
JPA – 就是一个标准,不是组件也不是系统,就是文本上的一个规范
jpa:自动建表,简单的sql不用写
涉及到数据库就少不了事务
事务:做为单个逻辑工作单元执行的一系列操作,要么完全执行要么完全不执行。比如电商中:扣掉库存和扣掉用户的钱必须要一致。
只有查询中不用加事务,增删改都要加
2、SpringBoot进阶
1、表单验证。防止小白乱输入,防止黑客。
@PostMapping(value = "/girls") public Girl girlAdd(@Valid Girl girl, BindingResult bindingResult) { //验证结果返回给bindingResult if(bindingResult.hasErrors()){ System.out.println(bindingResult.getFieldError().getDefaultMessage()); return null; } girl.setCupSize(girl.getCupSize()); girl.setAge(girl.getAge()); return girlRepository.save(girl); //返回的是添加的对象 }
2、AOP统一处理请求日志
spring的两大核心:AOP和IOC。AOP:java .net c#里面都有实现AOP的思想
OOP:面向对象,java,c++,c#都是OOP – 垂直形成独立的类
POP:面向过程,c语言
AOP:面向切面编程。 – 水平切割(利用一种横切的技术将面向对象构建的类的庞大的体系进行水平的切割,并且将那些影响到了多个类的公共行为封装成可重用的模块,这个模块称为切面,所以叫面向切面编程。关键思想:看上图第三点)
举例:
需求:在controller的每个接口前都加日志。//目的:每次发请求要验证是否登陆 //思路1:加个构造方法,不可行,因为spring程序启动的时候已经把这些类实例化了,http请求再来的时候是不会执行构造方法的 //思路2:使用AOP
@Aspect@Component //这个注解:把这个文件引入到spring容器中去public class HttpAspect { private final static Logger logger = LoggerFactory.getLogger(HttpAspect.class); //这里写业务逻辑代码:我们希望http在请求到controller里面的方法之前就把他们记录下来 @Pointcut("execution(public * com.imooc.controller.GirlController.*(..))") //方法里面两个点表示,任何参数都被拦截 public void log(){ } @Before("log()") public void doBefore(JoinPoint joinpoint){// logger.info("11111"); //这里要写的是记录http的请求了。 ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); //url logger.info("url={}",request.getRequestURL()); //后面的变量会填到{}里面去 //method logger.info("method={}",request.getMethod()); //IP logger.info("IP={}",request.getRemoteAddr()); //类方法 logger.info("class_method={}",joinpoint.getSignature().getDeclaringTypeName() + "."+ joinpoint.getSignature().getName()); //参数 logger.info("args={}",joinpoint.getArgs()); } @After("log()") public void doAfter(){ logger.info("2222"); } //这里获取返回的内容 @AfterReturning(returning = "object" , pointcut = "log()") //returning里面的内容就是入参:object public void doAfterReturning(Object object){ //因为不知道传什么,这里写Object logger.info("response={}",object.toString()); //如果返回是null,这里会抛系统异常 }}
import org.slf4j.Logger; 这是spring自带的日志框架,底层实现使用的是logbacks2017-12-02 22:17:53.914 INFO 61352 --- [nio-8080-exec-1] com.imooc.aspect.HttpAspect : 11111才用记日志的方法显示的信息:时间 INFO日志 进程号(61352) 端口(8080) 哪个类打的日志 日志内容
3、异常不只是try catch
总结:
1、返回的格式固定好。才用的是Result对象,也就是http请求返回的最外层对象
2、为了解决逻辑在一个地方处理,另外一个地方不需要接收返回的信息,所以引入了异常。默认的Exception只接收mes字段,我们要有code字段,所以自己定义了个异常GirlException,所以又加了个捕获异常的类ExceptionHandle。捕获后返回的还是Result
3、最后把code和msg定义成一个枚举,方便统一维护异常信息。
4、测试用例写在代码里面去,项目发布的时候把所有的功能测试都跑一遍
开发完立马上线,无论写的多严谨都难保证没有bug
测试API,要用到@AutoConfigureMockMvc
mvn打包的时候会自动执行test用例,如果不想执行的话,可以用:
mvn clean package -Dmaven.test.skip=true
3、另一套视频
- IOC–推荐用注解
- AOP–推荐用配置
- 从Spring3.x开始提供了Java配置方式,使用Java配置方式可以更好的理解你配置的Bean,现在我们就处于这个时代,并且Spring4.x和Spring boot都推荐使用java配置的方式。java配置的方式就是为了取代之前的xml配置的方式
- springBoot并不是spring的一些新功能,只是为spring框架整合了很多第三方的框架技术,使用的时候可以简单的集成其他技术来使用
springBoot一定要设置parent,springboot提供的parent。
运行springboot,首先出来一个spring的banner
/** * xxxApplication这个类都是作为springboot的入口类 */@Controller //没有它无法获得http请求@SpringBootApplication //说明这是springboot的一个应用@Configuration //表示自身就是一个配置。//通过该注解来表明该类是一个Spring的配置,相当于一个xml文件public class HelloApplication { @RequestMapping("hello") //该方法返回的内容添加到ResponseBody里去 //有了@ResponseBody就会使用消息转发器来输出返回的结果 @ResponseBody public String hello(){ return "hhh"; } //入口方法 public static void main(String[] args) { SpringApplication.run(HelloApplication.class,args); }}
一些启动信息TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)Starting Servlet Engine: Apache Tomcat/8.5.11Initializing Spring embedded WebApplicationContext Root WebApplicationContext: initialization completed in 2271 ms Mapping servlet: 'dispatcherServlet' to [/] Mapping filter: 'characterEncodingFilter' to: [/*] Mapping filter: 'hiddenHttpMethodFilter' to: [/*] Mapping filter: 'httpPutFormContentFilter' to: [/*] Mapping filter: 'requestContextFilter' to: [/*]
springboot开发的时候用的是内嵌的tomcat,发布的时候用的是独立的tomcat
4、另一套视频
springboot默认使用的json解析框架是jackson
5、另一套视频
可以用idea创建springboot项目,也可以创建一个普通的maven项目再改pom即可。
- springboot
- SpringBoot
- SpringBoot
- springboot
- SpringBoot
- springboot
- SpringBoot
- springboot
- Springboot
- springboot
- SpringBoot
- SpringBoot
- Springboot
- springboot
- springboot
- Springboot
- springboot
- springBoot
- Python练习题(3)
- 新生代和老年代
- ubuntu 进不去图形界面,如何重新安装驱动
- day17笔记
- mysql与nfs集群
- springBoot
- 3dsmax 效果图 第七课 材质
- BeanHandler 与BeanListHandler总是报错问题
- json字符串、json对象、数组 三者之间的转换
- java三种实现文件上传方法
- WEEK 8 JAVA作业
- java中的集合类详解
- mysql的版本以及字段中所占长度以及字符的关系
- markdown下的数学公式