jdk
jdk1.8 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。
编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。是整个java开发的核心。
开发java程序最小的环境为JDK,所以JDK是JAVA语言的核心
运行java程序最小的环境为JRE
JVM(JAVA虚拟机)将JAVA代码转换为对应的操作系统可以理解的指令,不同的操作系统有不同虚拟机与之对应,
同一段代码交给虚拟机之后,虚拟机再转化给操作系统
maven
maven 管理jar包
spring boot(全家桶) maven的延伸 默认端口号:8080(是Tomcat的) 更好的管理项目
(Oracle数据库端口号也是8080 需要把 此电脑-服务 OracleXETNSListener关闭)
Tomcat 配置太多 springboot做的优化(springboot整合了Tomcat) 代码想被浏览器访问必须在Tomcat中发布
服务器中间件 只要在这里发布过的项目 都可以被浏览器访问
restful方式
为了简化get请求的写法
@RequestMapping(insert)
http://localhost:8080/car/insert?id=1&name=张三&age=18
public String add( Integer id,String name,Integer age){
return id+name+age
}
@RequestMapping(insert/{x}/{y}/{z})springmvc提供的
http://localhost:8080/car/insert/1/张三/18
public String add(@PathVariable int x,@PathVariable int y,@PathVariable int z){
}
热部署 应用在运行的时候升级软件 却不需要重新启动应用
不重启服务器的前提下 识别更新的代码
Lombok
Lombok 简化了Model层的代码的编写.
以前pojo类/实体类
提供的 @Data注解 自动提供get set tostring hashCode equals
@NoArgsConstructor 提供无参构造
为什么需要添加无参构造
利用反射机制实例化对象时,默认调用无参构造
@AllArgsConstructor 提供有参构造
@Accessors(chain = true)链式加载 可以连点
public class User implements Serializable {
private Integer id;
private String name;//链式加载的底层原理 返回User对象
/* public User setId(Integer id){
this.id = id;
return this; //代表当前对象!!!!!
}
lombok使用需要提前安装lombok插件!!, 如果项目发布在Linux系统中.问: 系统是否需要提前安装插件?
不要 因为lombok插件在编译期有效!!!
xxx.java文件编译为xxx.class文件.
知识衍生: 写的是java源码, 运行的是编译后的.class
页面提交的日期都是String类型的 需要把自己变成Data类型 否则404
@DataTimeFormat(pattern=“yyyy-MM-dd”)
private Date intime;
单元测试 必须有 @Test public void 没有参数
向下造型 专门用子类的资源
Hello h = (Hello) o;
h.hi();
Di 依赖注入 @Autowired
对象间的依赖关系
创建对象的过程中Spring可以依据对象的关系 自动把其他对象注入
无需创建对象 直接拿来使用
打印所有的启动项
yml文件中 debug: true
classpath*:*.xml yml文件里导入映射文件 根目录情况
注解
spring提供的注解
@Controller 类上注解
MVC
@RestController(常用) = @Controller+@ResponseBody(以前使用的) 接受客户端的请求
@RequestMapping("") 规定浏览器访问类 方法的方式
@PathVariable 获取请求路径中的参数值 通过{???}获取路径中传递来的值
@CrossOrigin 跨域
@Configuration
@Bean 被spring管理的对象就是bean 将方法的返回值对象交给Spring管理
有特殊业务需求 使用@Bean
这两个注解必须一块使用
@Mapper 将该接口交给Spring管理 spring创建对象
一般标识接口中 如果有多个接口 则应该标识多少
可以采用@MapperScan(“包路径”) 加在启动项上
@Value注解
有时需要动态的获取数据,不能直接写死在代码中
为成员变量赋值的时候用
编辑YML文件
语法说明
## 语法1: 数据结构 key-value结构
## 语法2: 写法 key:(空格)value
## 语法3: yml文件 默认字符集是UTF-8编码 中文不乱码
## 语法4: yml文件 有层级效果 注意缩进
server:
port: 8080# SpringBoot启动时 默认加载yml文件
msg:
hello: "今天下雨,记得带伞~~"
编辑HelloController
@RestController //将该类交给Spring管理
public class HelloController {/**
* 规则:
* 1. 当Spring容器启动时,会加载YML配置文件.
* 会将内部的key-value结构 加载到spring维护的内存空间中
* 2. @Value功能,从spring容器中根据key 动态赋值
* 3. springel表达式 简称:spel
*
* 使用场景:
* 如果代码中需要给成员变量赋值时,一般采用动态赋值的方式.
*/
@Value("${msg.hello}")
private String msg;
@RequestMapping("/hello")
public String hello(){return msg;
}
}
关于主启动类说明
任何注解都会被元注解修饰
关于元注解的说明
@Target(ElementType.TYPE) 该注解对类有效
@Retention(RetentionPolicy.RUNTIME) 该注解在运行期有效
@Documented 生成源码时 是否动态生成注释文档
@Inherited 标识注解是否可以被继承
@ComponentScan说明
说明: 当springBoot启动时,会实例化很多的对象,但是需要排除特定的类型
原因: SpringBoot内部兼容了很多的第三方框架
但是其中个别加入之后会影响整个代码流程,所以通过这样的方式将个别的类排除在外
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@SpringBootConfiguration注解说明
配置文件/配置类 作用:整合第三方框架(配置)
@Configuration:
该注解一般标识类文件,告知springBoot程序 这个类是用来整合第三方框架/配置的
@SpringBootConfiguration
修饰主启动类,说明主启动类也是一个配置类
SpringBoot主启动类会扫描用户自己的配置类,并且实例化对象
@EnableAutoConfiguration注解说明
自动化的配置
@AutoConfigurationPackage说明
该注解表示自动配置的包扫描的路径.
工作原理: 该注解会动态的获取主启动类当前的包路径.之后开启包扫描的机制
以后写代码都应该在主启动类的同包及子包中
@Import(AutoConfigurationImportSelector.class)
SpringBoot使用体现了"开箱即用"的思想,用户引入jar包之后 可以直接使用(少量配置).
dependencies代表程序的依赖项,(将其他的包加载到自己的项目中), 只是加载不负责执行
流程
当SpringBoot主启动项执行时,内部会加载@Import(AutoConfigurationImportSelector.class),
该注解的作用就是根据依赖信息,根据SpringBoot内部的配置信息,依次加载执行.
当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容).
如果匹配不到,则继续向下执行.最终SpringBoot程序加载成功
用户暂时不需要数据库的配置. 问:能否先行添加数据源的启动项?? (不添加任何注解!!!)
不可以,因为启动项执行需要完整配置,数据源信息并未添加.导致报错.
SpringBoot项目中的依赖包尤其启动项,添加时慎重. 如果需要添加启动器,则必须保证配置完整.否则程序启动必然失败
报错
304 数据已缓存
400 参数类型不匹配(如 url请求的参数和后端的参数类型不同)
404 访问的资源不存在 找正确的路径
500 内部服务器出错 java代码出异常 访问网址加参数 跟前端没关系 看后端
基本参数类型 当访问url时 没传参 报异常
引用类型 即使没传参 返回null
504 访问超时
端口号
一般使用的端口号 0-65535
Oracle数据库 8080
spring boot 默认端口号:8080(是Tomcat的)
mysql的默认端口是3306
sqlserver默认端口号为:1433;
oracle默认端口号为:1521;
DB2默认端口号为:5000;
PostgreSQL默认端口号为:5432
http协议 默认端口号是80
https协议 默认端口号是443
8000是客户端端口号的
SpringBoot
有时由于业务需要,需要进行单元测试, 单元测试中的对象可能会依赖Spring容器.
定制化属性内容 具体业务功能. 利用配置类实现
//作用: 将自己需要的对象交给Spring容器管理
@Configuration //标识这是一个配置类
public class UserConfig {/**
* 知识点:1.Spring内部维护一个Map集合
* 2. Map集合 key/value 分别是谁???
* 3.IOC管理的对象的方式 1.@Controller等注解 2.@bean
*
* 1.注解组合: @Configuration + @Bean
* 2.什么是bean: 被spring管理的对象就是bean
* 3.@Bean注解的作用
* 将方法的返回值对象交给Spring管理
* 4.Spring如何管理对象?
* 数据结构: Map集合 Map<K,V>
* key: 对象的ID
* value: 实例化之后的对象
* demo1: Spring如何管理对象
* key: 方法的名称
* value: 方法的返回值 Map<user,new User()>
*
* demo2:
* @Controller
* HelloController{}
* key: helloController 首字母小写
* value: spring通过反射创建的HelloController对象
* @return
*/
@Bean
public User user(){return new User(101,"好好学习");
}
}
package com.jt.test;
import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;/**
* 原理说明:
* 1.当测试类执行时,会根据SpringBoot的配置,动态启动Spring容器.
* 2.当spring容器启动时,会加载所有的注解和配置类,最终将所有的对象
* 交给Spring容器管理 Map集合
* 3.@SpringBootTest 通过这个注解,可以动态的从spring容器中
* 获取对象
*
*/
@SpringBootTest
public class TestSpring {/**
* 注入方式:
* 1. 根据类型注入 (默认规则)
* 2. 根据名称注入 @Autowired
* @Qualifier("user")
*/
@Autowired
//@Qualifier(value="user")
private User user;@Test
public void testUser(){
System.out.println(user.toString());
}
}