https://segmentfault.com/n/1330000009887617
技术发展的历史和脉络
微服务就是更小力度的SOA
REST: json,xml,http
热点:负载均衡解决热点问题
配置:可以是分布式的也可以是本地的,关键就是监控配置文件的内容变化,然后做出反应
安全:前端安全xss,认证、授权、单点登录
spring boot内容
spring framwework设计模式
gof23
被动回收
如何读源码:
一般接口就是入口
查看接口的行为的实现方法
找关键代码,互忽略细节
idea全文搜索:
CTRL + H
jsp 资源加载方式:
SpEL
Serverlet调用链
答疑:
内存回收,java gc是被动回收
停顿
动静分离
请求
资源定位(URI)
请求协议(Protocol)
请求方法(Method)
请求参数(Parameter)
请求主体(Body)
请求头(Header)
Cookie
响应
响应头(Header)
响应主体(Body)
标准优化技术
资源变化
相应头:Last-Modified(初次访问没有缓存得到的响应数据)(第一次响应)服务器告诉浏览器资源最近的修改时间
请求头:If-Modified-Since(第二次请求带上,如果服务器返回304表示资源没有变化,浏览器就会使用本地缓存数据)
资源缓存
相应头:ETag(初次访问没有缓存得到的响应数据,用ETag标记)
请求头:If-None-Match(第二次请求带上该资源ETag标记,如果服务器返回304表示资源没有变化,浏览器就会使用本地缓存数据)
spring解析servlet jsp
文档:
通过配置参数找到对应的java类
配置类的注解:
spring周边
调用过程:
request incoming ->
javax.servlet.http.HttpServlet#service-->
org.springframework.web.servlet.DispatcherServlet#doDispatch-->
ik.starriver.log.controller.EventController#getPage
spring rest
Spring Boot REST
核心接口
定义相关
@Controller
@RestController
映射相关
@RequestMapping
@PathVariable
请求相关
@RequestParam
@RequestHeader
@CookieValue
RequestEntity
响应相关
@ResponseBody
ResponseEntity
consumes = MediaType.APPLICATION_XML_VALUE, //精确匹配request header的Accept内容
produces = MediaType.APPLICATION_XML_VALUE) //相应数据解析成相应类型
@RestController
public class XMLRestController {
@GetMapping(path = "/xml/user",
consumes = MediaType.APPLICATION_XML_VALUE, //精确匹配request header的Accept内容
produces = MediaType.APPLICATION_XML_VALUE) //相应数据解析成相应类型
public User user() {
User user = new User();
user.setName("XML");
user.setAge(30);
return user;
}
}
rest文档生成
HATEOAS
提供模型的服务接口api信息:
HttpServlet.service根据method处理不同请求:
Servlet on Spring Boot
组件: 扫描 \ 注册 HttpServlet
filter: 扫描 \ 注册 Filter
listener: 扫描 \ 注册 XXXXListener
通过context获取bean(以dataSource为例):
@SpringBootApplication
@EnableTransactionManagement
@EnableAsync
@EnableJpaRepositories(basePackages = {"ik.starriver.msgcenter"})
//@MapperScan("ik.starriver.msgcenter.mappers")
//@ComponentScan(basePackages = {"ik.starriver.msgcenter"})
public class MsgCenterApplication {
private static final Logger logger = LoggerFactory.getLogger(MsgCenterApplication.class);
public static void main(String[] args) throws NamingException, SQLException {
SpringApplication application = new SpringApplication();
ConfigurableApplicationContext applicationContext = application.run(MsgCenterApplication.class, args);
BasicDataSource dataSource = (BasicDataSource) applicationContext.getBean("dataSource");
Statement statement = dataSource.getConnection().createStatement();
ResultSet resultSet = statement.executeQuery("SHOW DATABASES;");
while(resultSet.next()){
String result = resultSet.getString(1);
logger.debug(result);
}
logger.debug("started");
}
spring boot 嵌入式web容器Tomcat
查看端口所属进程:
lsof -i:8000
源码:
ServletWebServerFactoryCustomizer.customize读取配置文件的Servlet、server、Tomcat相关属性设置,配置文件内容例如:
server:
servlet:
contextPath: /shen
port: 9000
有默认值用原生型int,有null的值用对象型Integer
开发技巧
查询autoConfiguration的属性
1 find in path (ctrl+h) open in find window
2
3
4
BodyMap
FailedBodyMap
postman:
http://localhost:8080/jdbc/user/1/
http://localhost:8080/jdbc/users/
http://localhost:8080/jdbc/user/
https://search.maven.org/classic/
按类名搜索:
html
json
xml
HATEOAS
RestClient
导入库的正确芝士:
org.apache.commons.dbcp2.BasicDataSource
参考视频41分钟
如何在application.properties中添加相关的dbcp的配置项
参考视频43分钟
单连接方式
dbcp方式
在不知道返回对象的column情况下,解析数据
mvc的写法:
service\UserService.java:
domain\UserServiceImpl.java:
controller\JDBCController.java:
用单词的方式记忆api
书籍推荐:
Spring Cloud微服务实战 翟永超 著
如何研究源码(以mybatis为例,分析api接口org.apache.ibatis.session.Configuration如何获取xml配置信息):
xml设置
代码读取配置的属性并进行设置
如果忘记了设置方面的细节,可以查看视频和相应课件。
将varchar转换成json类型
invocation.proceed决定是否执行Signature的反射
MyBatis Generator
资源地址:http://www.mybatis.org/generator/index.html
mybatis-config.xml
使用mybatis时配置xml文件几种方式:
1 手写生成映射文件UserMapper2.xml
2 MBG生成映射文件UserCopy1Mapper.xml
3 annotation
4 starter的方式:
mybatis-spring-boot-starter ----> MybatisAutoConfiguration
/jdbc/mybatis/user/{id}/
/jdbc/mybatis/generator/user/{id}/
/jdbc/mybatis/annotation/mapper/user/{id}/
/jdbc/mybatis/starter/mapper/user/{id}/
mapper实现的方式:
xml:常用的,可以通过MBG自动生成sql和结果集映射
annotation:手动编码定义,会在jar包的classpath中,不方便查询
domain和Entity的区别:
domain有2种,富domian包含状态和操作(如update),贫domain一般是pojo,JavaBeans
Entity = ID + JavaBeans
domain更关注逻辑描述,Entity更关注持久
JPA的问题:
可以操作开关二级缓存,但不能操作一级缓存
消极锁:数据库的锁
乐观锁:加个版本
查看所有bean属性配置信息,可以通过该信息找到需要配置的bean的class