学习总结
1.学习java基础
2.学习spring中的常用简单注解,了解用法。
1)属性注解@Value字段方法 格式字符串 集合属性不可以
2)对象注入注解@Autowried默认安装类型 自动装配消除getset方法
3)@controller作用在web层@service作用在业务层@Reporsitory作用在持久层
开启项目时要配置中开启组件扫描@MapperScan()跟需要运行包路径
3.学习Spring的两大特性IOC控制反转,个人理解是通过项目中各种包的调用创建对象
AOP面向切面编程 spring提供代理类来整合公共模块和业务模块不用自己管
实现流程:创建通知类 创建目标接口和实现类 spring提供的代理类整合目标类与通知类并联接口
4.学习过滤器
嵌入式Servlet容器扫描注解来注册Servlet Filter过滤器属于servlet范畴的API与spring无关 -> 过滤web请求
功能可以对web服务器管理的所有web资源进行拦截,url级别的权限访问控制过滤敏感词汇,具体实现中Filter接口中dofiter方法而且需要配置对哪个web资源进行拦截,每次调用service时会先调用dofilter方法,调用目标资源之前让一段代码执行,之后判断是否调用目标资源,调用目标资源之后让一段代码执行。
使用@WebFilter注解参数为filterName-〉过滤器名称和urlPattern-〉拦截路径。
5.Session监听类的学习
Session监听类HttpSessionLister在listener里取得request对象进一步获取用户ip浏览器等属性,不能用request.getSession(true)方法取request对象,spring中(context jar包)提供了监听类:RequestContextListener,可直接配在web.xml,通过这个监听器,可以直接拿到request上下文。
6.学习拦截器
HandlerInterceptor拦截器 由spring提供
可以提供更精细的控制能力。可以日志记录:记录请求信息的日志进行信息监控。检查权限:登陆检测,进入处理器检测是否登陆。实现首先创建拦截器实现HandlerInterceptor接口,创建类继承WebMvcConfigurerAdapter重写addInterceptors方法,将对象手动添加到addInterceptor方法中。
7.学习拦截器与过滤器区别
拦截器与过滤器的区别
1)拦截器基于反射机制,过滤器基于函数回调。
2)拦截器不依赖与servlet容器,过滤器依赖与servlet容器
3)拦截器只能对action请求起作用,过滤器对所有请求起作用
4)拦截器可以访问action上下文,值栈里的对象,而过滤器不能访问
5)在action的生命周期中,拦截器可以多次被调用,过滤器只能容器初始化时被调用 一次
6)拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
8.访问静态资源,输入网址localhost:8080/路径跟resources下的文件名就可以访问。配置文件中设定静态资源路径spring.resources.static-locations=calsspath:/static/
9.学习日志文件
生成日志文件
配置详情解释:
Appender 为日志输出目的地,Log4j提供的appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台),
org.apache.log4j.FileAppender(文件),
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)

Layout:日志输出格式,Log4j提供的layout有以下几种
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)

#①配置根Logger,其语法为:

#log4j.rootLogger =[level],appenderName,appenderName2,…
#level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL
##Log4j建议只使用四个级别,优先级从低到高分别是DEBUG,INFO,WARN,ERROR
#通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关
#比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来
#appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的
#②配置日志信息输出目的地Appender,其语法为:
#log4j.appender.appenderName =fully.qualified.name.of.appender.class
#log4j.appender.appenderName.optionN =valueN
#Log4j提供的appender有以下几种:
#1)org.apache.log4j.ConsoleAppender(输出到控制台)
#2)org.apache.log4j.FileAppender(输出到文件)
#3)org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
#4)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
#5)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
#1)ConsoleAppender选项属性

-Threshold = DEBUG:指定日志消息的输出最低层次

-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出

-Target = System.err:默认值System.out,输出到控制台(err为红色,out为黑色)

#2)FileAppender选项属性

-Threshold = INFO:指定日志消息的输出最低层次

-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出

-File = C:\log4j.log:指定消息输出到C:\log4j.log文件

-Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容

-Encoding = UTF-8:可以指定文件编码格式

#3)DailyRollingFileAppender选项属性
#-Threshold = WARN:指定日志消息的输出最低层次
#-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出

-File =C:\log4j.log:指定消息输出到C:\log4j.log文件

-Append= FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容

#-DatePattern=’.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。还可以按用以下参数:

'.'yyyy-MM:每月

'.'yyyy-ww:每周

'.'yyyy-MM-dd:每天

'.'yyyy-MM-dd-a:每天两次

'.'yyyy-MM-dd-HH:每小时

'.'yyyy-MM-dd-HH-mm:每分钟

#-Encoding = UTF-8:可以指定文件编码格式

#4)RollingFileAppender选项属性
#-Threshold = ERROR:指定日志消息的输出最低层次
#-ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出

-File =C:/log4j.log:指定消息输出到C:/log4j.log文件

-Append= FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容

#-MaxFileSize = 100KB:后缀可以是KB,MB,GB.在日志文件到达该大小时,将会自动滚动.如:log4j.log.1
#-MaxBackupIndex = 2:指定可以产生的滚动文件的最大数
#-Encoding = UTF-8:可以指定文件编码格式 、、//好像不支持这个功能
#③配置日志信息的格式(布局),其语法为:
#log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
#log4j.appender.appenderName.layout.optionN= valueN
#Log4j提供的layout有以下几种:
#5)org.apache.log4j.HTMLLayout(以HTML表格形式布局)
#6)org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
#7)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
#8)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
#9)org.apache.log4j.xml.XMLLayout(以XML形式布局)
#5)HTMLLayout选项属性
#-LocationInfo = TRUE:默认值false,输出java文件名称和行号
#-Title=Struts Log Message:默认值 Log4JLog Messages
#6)PatternLayout选项属性
#-ConversionPattern = %m%n:格式化指定的消息(参数意思下面有)
#9)XMLLayout选项属性
#-LocationInfo = TRUE:默认值false,输出java文件名称和行号
10.学习Mysql数据库
基本数据库操作实现对表数据的增删改查,创建删除数据库创建表修改表结构重命名表
若经常对表进行更新,可执行优化表语句 optimize table tablename
检查表语句 check table table_name -> 仅检测不会修复
修复表语句 repair table table_name -> 返回表是否已被修复
查看存储引擎show engines
查看表使用的存储引擎show create table table_name
提高查询速度 —〉 创建索引create index indexname on mytable(username(length));
修改表结构 alter table tablename add index indexname(columnname);
删除索引 drop index [indexname] on mytable(username(length));
显示索引信息show index from table_name
添加主键 alter table table_name add primary key;
索引:帮助mysql高效获取数据的数据结构。
使用索引查询数据节省大量时间
常用到B-Tree索引 -〉 myisam引擎 InnoDB引擎
HASH索引 —〉memory引擎
有普通索引全文索引(full text)唯一索引(unique key)
11.spring boot 整合mybaits使用xml方式连接mysql数据库实现对数据的增删改查
首先添加mybaits,mysql jar包依赖创建与数据库与操作的表同名的类
数据源配置 全局配置文件添加mysql驱动 以及进行mybaits的配置
编写接口dao包含需要的方法在mapper中实现数据库中的操作
编写service接口当中包含controller中的方法并用在serviceimpl类中实现
Xml文件主要将sql语句映射到类中对数据库执行操作。
12.学习spring下的文件上传
@CrossOrigin注解可以处理跨域请求,让你能访问不是一个域的文件。
13.学习@Data注解
可以让代码更加简洁,这个注解来自于 lombok,lombok 能够减少大量的模板代码,减少了在使用@Data 注解时, 需要导入lombok.Data,下面列举下 lombok提供的注解:
@NonNull : 注解在参数上, 如果该类参数为 null , 就会报出异常, throw new NullPointException(参数名)
@Cleanup : 注释在引用变量前, 自动回收资源 默认调用 close() 方法
@Getter/@Setter : 注解在类上, 为类提供读写属性
@Getter(lazy=true) :
@ToString : 注解在类上, 为类提供 toString() 方法
@EqualsAndHashCode : 注解在类上, 为类提供 equals() 和 hashCode() 方法
@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor : 注解在类上, 为类提供无参,有指定必须参数, 全参构造函数
@Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法
@Value :
@Builder : 注解在类上, 为类提供一个内部的 Builder
@SneakThrows :
@Synchronized : 注解在方法上, 为方法提供同步锁
@Log :
@Log4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
@Slf4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象
14.Unix时间戳
从GMT时间(格林威治时间)1970年1月1日0时0分0秒计时转换时间格式
例:1970-01-01 00:00:05 〉5(时区不同时间也不同)。
15.UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。
16.mysql

17.Redis
redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型,类似于Java中的map)。Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。

RedisTemplate方法
Class RedisTemplate<K,V>
k模板中的Redis key的类型(通常为String)如:RedisTemplate<String, Object>
v模板中的Redis value的类型
命令:
append key value 追加值到key上
auth password 为服务器设置密码
sadd key value 添加多个元素到集合中 若集合key中存在则忽略
scard 返回集合中key的个数
sidff key1 key3 输出key1中key3没有的元素获得队列不存在的元素
sidffstore key key1 key2 将key1中key3没有的元素放入key中
sinter key1 key2 key3.统计所有集合的交集
sinterstore key key1 key2 key3 将所有集合的交集放入key中
sisemember key1 value 返回value是否在key1中
smembers key显示集合key所有的元素
smove key2 key3 value 将key2中的value放入key3中
spop key3 随机取出key3中的值并删除
spop key3 3随机取出key3中的3个值并删除
srandmember key3 3随机获取key3中的3个值
srem key3 value删除key3中值为value的元素
sunion key2 key3 返回key2和key3的并集
sunionstore key key2 key3返回key2 key3并集key的个数(不包含相同的元素)

hsetnx myhash filed1 ok 设置myhash中filed1字段的值为ok再次设置字段filed1时无效
hset myhash key1 ioi设置key指定哈西集中指定字段key1的值为ioi如果存在会重写原key的值
hmset myhash key1 ioiio key2 klkj 指定myhash中key1 和key2的值若key1和key2都存在则重写key1和key2的值
hdel myhash key1删除myhash中的key1若不存在key1则返回0
HEXISTS myhash field1返回myhash中的key1是否存在
HGET myhash field1 获取myhash中field1的值
HGETALL myhash 获取myhash中所有key和key对应的值
hincrby myhash增加 key 指定的哈希集中指定字段的数值 增加数字
hgetall myhashkey 获取所有myhashkey的键和值

spring.split(“”)将字符串分割为字符;
18.grpc流程
建proto
syntax= “proto3”
service name(服务){
rpc= wayname(a) return (b){}
}
string a(){
return name=1;}
string b(){
return massage=1;}
建service
grpc请求消息接入
grpc消息头和消息体处理
内部的服务路由和调用
响应消息发送
19.grpc服务端的主要工作:
实现定义的服务接口函数
开启服务端,监听来自客户端的请求
grpc客户端只要工作:
创建Client实例并连接server
调用服务端方法并获取服务端回应
instanceof 判断左边对象是否为其右边类的实例
Thread.sleep(1000)使程序睡眠1000MS
20.final下的参数必须有构造器;
final类型不能改变
21.private类创建者和类的内部方法都可以访问其他地方不可以
protect继承的类可以访问
对成员变量使用@Autowired注解可以删除setter方法
Spring默认为单例模式@scope可以更改
22. 接口中的成员变量默认都是public、static、final类型的,必须被显式初始化
接口中的方法默认都是public、abstract类型的。
接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。
接口没有构造方法,不能被实例化,在接口中定义构造方法是非法的。
一个接口不能实现另一个接口,但它可以继承多个其他接口。
interface C extends A, B{} // A和B都是接口
当类实现某个接口时,它必须实现接口中所有的抽象方法,否则这个类必须被定义为抽象类。
接口中没有方法体
访问控制修饰符
四种访问级别:public、protected、默认、private
private只能在同一个类中访问
默认,只能在同一个类,同一个包中访问
protected,可以在统一各类,同一个包,子类(子类可以不在同一个包中)访问
public,不限制访问
类可用修饰符: abstract、public、final
构造方法:public、protected、private
局部变量:仅仅final
接口可以定义默认方法default修饰方法
23.熟悉简单的configuretion注解
24.RabbitMQ是实现AMQP高级消息队列协议,生产者生产大量数据消费者无法快速消费,那么需要一个中间层保存这个数据。
一个接口可以继承多个类。
k8s的全生命周期基本步骤
创建集群,部署应用,发布应用,扩展应用,更新应用。
25.@Component在类路径扫描期间找到装饰的java类,并在上下文中将其作为Spring bean注册@ConponentScan确保@Component找到装饰的类并将其注册为spring bean。@ComponentScan自动包含在@SpringBootApplivation内。
26.C写的分布式版本控制系统 〉- Git。
集中式版本控制系统和分布式版本控制系统的区别
git特点:快 简单 流行。
Unix哲学:没有消息就是好消息。
git add +文件名 把文件添加到仓库
git commit -m “”把文件提交到仓库“”内为提交说明可以任意定义。
git status 时刻掌握仓库当前的状态
git diff 查看difference文件修改之后和以前不同的地方。
git log 查看历史记录。
git log --pretty=oneline更加简洁
git的上一个版本就是head^ 上上个版本head^^前100个可写为head~100
git reset –hard head^返回到以前版本。
只要命令行窗口没有关掉可以通过git reset –hard commitid 前几位git自动扫描来找到以后的版本。
git 用git reflog 来记录每一次的命令。
工作区有一个隐藏目录.git 是git的版本库。
将文件添加到git版本库时分两步
1 git add 添加文件 修改添加到暂存区
2 git commit 提交更改,把暂存区的所有内容提交到当前分支。
需要提交的文件修改全放到暂存区,然后一次性提交所有的修改。
每次修改,如果不用git add到暂存区,那就不会加入到commit中。
撤销修改:git checkout – 文件名
1 文件自修改后还没有被放到暂存区,撤销后和版本哭一模一样。
2 文件已经添加到暂存区,又做了修改,撤销后回到暂存区状态。
git reset HEAD 文件名可以把暂存区的修改撤销掉,重新放回工作区。
删除文件
rm 文件名
1 直接从版本库删除文件用命令git rm 删除掉并且git commit –m“”
2 删错了git checkout –文件名把误删的文件恢复到最新版本
git checkout 用版本库的版本替换工作区的版本
git rm 用于删除一个文件,已经被提交到版本库可恢复文件到最新版本会丢失最近一次提交后修改的内容。
创建分支dev
git checkout –b dev命令上加-b表示创建并切换
git branch dev
git checkout dev
用git branch命令查看当前分支命令会列出所有分支
查看分支:git branch
创建分支:git branch 《name》
切换分支:git checkout 《name》
创建加切换分支:git checkout –b 《name》
合并某分支到当前分支:git nerge 《name》
删除分支:git branch –d
当git无法自动合并分支时,就必须首先解决冲突(把git合并失败的文件手动编辑为我们希望的内容),解决后提交。
git stash 可以把当前工作现场保存,等以后恢复后继续工作。
git stash list 查看工作现场,git stash pop恢复现场删除stash内容。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug修复后,在git stash pop回到工作现场。
开发一个新的feature,最好新建一个分支;如果要丢弃一个没有被合并过的分支,可以通过git branch –D 强力删除。
git remote –v 显示详细信息可以抓取和推送的orgin地址,查看远程库信息
git push origin master 把该分支上的所有本地提交推送到远程仓库,如果推送失败,先用git pull抓取远程的新提交。
从远程抓取分支,使用git pull
在本地创建和远程分支对应的分支,git checkout –b branch –name orgin/branch-name
建立本地分支和远程分支的并联,git branch –set-upstream branch-name origin/branch-name
rebase操作可以把本地未push的分叉提交历史整理成直线。
git tag 打一个新标签git tag 查看所有标签
git tag commit id
git show 查看标签信息
创建带有说明的标签-a表示标签名-m表示说明文字
git tag –a -m “说明文字” commitid
git tag查看所有标签
删除标签git tag –d
推送某个标签到远程git push origin
一次性推送全部尚未推送到远程的本地标签
git push origin –tags
git pushorigin :refs/tags/
27.@Responsebody把控制视图方法返回的内容返回到请求页面上
@ExceptionHandler(Exception.class)注解声明异常处理方法
CREATE DATABASE
ALTER DATABASE
CREATE TABLE
ALTER TABLE
DROP TABLE
CERATE INDEX
DROP INDEX
SELECT DISTINCT 列名称 FROM 表名称 :列出不重复的列。
order by 语句用于根据指定的列进行排序 默认按照升序排序。
select …from …order by …… desc
反序排序后面跟desc
insert into 表名称 values(val1,val2,………)
insert into table_name(列1,列2,….) values(val1,val2,……)
delete from table_name
update 表名称 set 列名称=新值 where 列名称=某值
select top 2from persons从persons表中选取头两条记录。
select top 50 percent from persons从persons表中选取50%的记录。
select
from persons where city like’N%’从”persons”表中选取居住在以“N”开始的城市里的人
select
from persons where city like ‘%g%’选取city name以“g”结尾的人
selectfrom persons where city like ‘%lon%’选取城市名包含lon的人。
select
from persons where city not like ‘%lo’;选取居住城市不包含lo的城市的人
selectfrom persons where firstname like ‘_eorge’选取第一个字符之后是“eorge”的人
select
from persons where lastname like ‘c_r_er’
selectfrom persons where city like ‘[aln]’选取居住城市以a或l或n开头的人反之[!aln]
select
from persons where lastname in (‘adams’,’carter’)选取表中姓氏为adams和carter的人
selectfrom persons where lastname between ‘adams’and’carter’
以字母顺序显示介于“adams”(包括)和“carter”(不包括)之间的人
范围之外 not between
从两张表获取数据
select persons.lastname,persons.firstname,orders.orderno
from persons,orders where persons.id_p=orders.id_p
inner join 内连接
left join right join full join
select column_name from table_name1 inner join table_name2
on table_name1.column_name=table_name2.coulmn_name;内连join
select column_name from table_name1 left join table_name2
on table_name1.column_name=table_name2.column_name;关键字left join从左表table_name1中返回所有的行,即使在右表没有匹配的行;
select column_name from table_name1 right join table_name2
on table_name1.column_name=table_name2_name;关键字会从右表返回所有的行即使左表没有匹配的行;
select column_name from table_name1 full join table_name2
on table_name1.column_name=table_name2.column_name;关键字会从左表和右表返回所有的行,即使没有匹配也会同样列出;
select column_name from table_name1
union
select column_name from table_name2
select语句必须拥有相同数量的列,列必须拥有相似的数据类型,列的顺序必须相同。
union all会列出所有的值。
select * into new table from old tablename把所有的列插入新表后可跟where 字段=//
NOT NULL约束强制列不接受Null值
alter table persons drop index union_name撤销唯一索引。
alter table persons add constraint unionname unique(字段1,字段2,,)
check约束 会在特定的列中对值进行限制
ID int not null,
check (ID>0)
在以存在的表添加check约束
alter table persons add check (id_p>0)
命名给多个列添加 alter table persons add constraint chk_person check(id_p>0 and city=’beijing’)
如果没有规定其他的值,会将默认值添加到新记录default
city varchar(255) DEFAULT ‘sandess’
若已存在向表中添加
alter table persons alter column city set default ‘sandess’
撤销
alter table persons alter city drop default
创建索引
create index indexname on tablename(column_name1,column_name2)
删除索引
alter table tablename drop index indexname
在表中添加列
alter table tablename add columnname datatype
删除 alter table tablename drop columnname
更改表列的数据类型
alter table tablename alter column columnname datatype
auto_increment关键字执行每条新记录递增1.
例:p_id int not null auto_increment
查找列是否为空值select columnname from tablename where
columnname is null.
查找不带空值的记录select columnname from tablename where columnname is
not null.
Date() YYYY-MM-DD 1000-01-01-9999-12-31
Datetime() YYYY-MM-DD HH:MM:SS 1000-01-01 00:00:00-9999-12-31 23:59:59
TIME() HH:MM:SS -838:59:59-838:59:59
YEAR() 二位 70-69 1970-2069 四位 1901-2155
avg函数返回数值列的平均值select avg(column name) from tablename
select count(columnname)from tablename
select count(
)tablename
返回指定列的值得数目或返回表中的记录数
select count(distinct columnname) from tablename返回不同columnname数目。
select first(columnname) from tablename 返回指定字段第一个值。
最后一个记录的值last(columnname)
返回这一列的最大值max(columnname)最小值min(columnname)
返回这一列columnname的相加值sum(columnname)
broup by 语句用于组合合计函数,根据进行分组。
select columnname1,sum(columnname2)from tablename group by columnname1
查找订单总金额少于2000的客户。
select customer,sum(orderprice)from orders group by customer having sum(orderprtce)<2000;
把字段的值转为大写
select ucase(columnname) from tablename.
把字段的值转为小写
select lcase(columnname) from tablename.
提取字段位置的字符
select mid(columnname,1,3) from tablename;
查看字段的长度
select length(columnname) from tablename;
select round(columnname,decimals)把数值字段舍入为指定的小数位数decimals 规定返回的小数位数。
select now() from tablename;查看当前时间;
select format(columnname,format) from tablename;对字段的显示进行格式化
format 规定的格式;
Spring框架关注于通过DI,AOP和消除样板代码来简化企业级Java开发

@Bean多数据源时可以使用@Qualifier(“指定需要装配Bean的名称”)指定使用哪个bean
在spring中,创建被调用者实例的工作不在由调用者来完成。因此成为控制反转(ioc)。
创建被调用者实例的工作由spring容器来完成,然后注入调用者,因此依赖注入。
@Autowired相当于setter,在注入之前对象已经实例化,而new只是实例化一个对象,new的对象不能调用注入的其他类。
28.事务是一系列动作,综合在一起是一个完整的工作单元,必须全部完成,如果一个失败,事务会回滚到最开始的状态,事务管理用来确保数据的完整性和一致性。
原子性:事务是原子操作,要么完全完成要么完全不起作用
一致性:一旦完成,建模业务处于一致状态,数据不应该被破坏
隔离性:可能许多事务同时处理相同的数据,因此每个事务应该与其他事务隔离开来
持久性:一旦事务完成,无论发生什么系统错误,它的结果不应该受到影响,可以从任何系统崩溃中恢复过来。
29.所有类都是在对其第一次使用时,动态加载到jvm中的,当程序创建一个对类的静态成员引用时,就会加载这个类。
使用功能.class来创建Class对象的引用时不会自动初始化该Class对象。使用forname()会自动初始化该class对象。
getName()获得类的完整名字
getFields()获得类的public类型属性
getDeclaredFields()获得类的所有属性。包括private声明的和继承类
getMethods()获得类的public类型的方法
getDeclaredMethod()获得类的所有方法,包括private声明的和继承类
getConstructors();获得类的public类型的构造方法
30.注解
@Target和@Retention是元注解(用于给其他注解,一般定义都要用)
@Target({ElementType.--------})
ElementType的方法有
CONSTRUCTOR描述构造器
FIFLD描述域
LOCAL_VARLABLE描述局部变量
METHOD描述方法
PACKAGE描述包
PARAMETER描述参数
TYPE描述类借口或者enum声明
@Retention(RetentionPolicy.-----)
SOURCE在源文件有效 源文件保留被编译器丢弃
CLASS在class文件中有效 class保留。虚拟机忽略
RUNTIME在运行时有效,
31.Class:问题所在类的类名
Method:问题所在的哪个方法
Priority:错误优先级
Problem classification:问题分类
Notes:标注,笔记
使用安装findbugs setting plugins findbugs install
Bad practice:主要是命名问题,类名以大写开头,字符串不要使用等号不等号进行比较,出现异常用try catch包裹。
Malicious code vulnerability恶意代码漏洞 一些属性直接使用public让别的类来获取,建议改为private并提供get和set方法。
Dodgy code 比如一个double/float被强制转换成int/long可能会导致精度损失,一些接近零的浮点数会被直接截断,在类型转换时我们应该提供一个安全的转换方法。
switch时没有提供default
多余的空检查,就是不可能为空的值增加了不为空的判断,这是没有必要的属于代码沉余
Performance性能
主要是一些无用的代码,比如声明了没有用到的属性等等。
correctness代码的正确性(重要)
主要是没有对变量进行不为空的判定,在特殊情况下可能发生空指针异常。
32.好的代码规范:
1.有意义的命名,能在字面上表达其含义,代码要在字面上表达其含义
2.力求集中,每个函数,类,模块都专注于做一件事,且函数类方法尽可能少
3.消除重复
4.有单元测试并通过测试。
有意义的命名:
1.命名对象明确
2.不要以数字命名
3.相似类要加以区分
4.方法名最好是动词或动词短语
5.添加有意义的语境
6.为每一个抽象概念选一词作为一贯使用的命名方式
函数:
1.短小
2.只做一件事
3.依序带到下一个函数,调用的方法在前面,被调用的方法在后面
函数参数:
1.参数数量最好为0,其次1再次2
2.如果一个函数需要三个或三个以上的参数,可考虑其中一些参数是否可以封装成类
注释:
警示,警告其他程序员会出现某种后果
提供一些基本信息,如解释某个抽象方法的返回值
版权著作声明
弥补代码表法意图时遭遇的失败
todo放置要做的工作列表
格式:
代码宽度:120字符之内
错误处理:
先写try catch finally语句
使用不可控的异常
给出异常发生的环境说明
别返回null值
边界:
优雅的使用第三方库
33.java分三类se me ee
通常core java 更偏重se
j2se就是java2的标准版,主要用于桌面应用软件的编程
j2me主要应用于嵌入式系统开发,用于手机和pda的编程
j2ee是java2的企业版,主要用于分布式网络程序的开发图电子商务和erp系统
34.equals方法实现了等价关系,重载时要遵守约定:
自反性:对任何非null的引用值x,x.equals(x)必须返回true。
对称性:对任何非null的引用当x.equals(y)为true时,y.equals(x)也必须为true.
一致性:x.equal(y)true,y.equals(z)true那么x.equals(z)true.
35.序列化
为了保存在内存中各种对象的状态,并且可以把保存的对象状态再读出来,java提供的保存对象状态的机制。
把内存中的对象状态保存到一个文件中或数据库时,用套接字在网络传送对象时,通过rmi传输对象时。实现Serializable接口,简单标识一个类的对象可以被序列化。
36.throwable对象:它是异常类型的根类,通常异常对象仅有的信息就是异常类型
e.printStackTrace(System.out);
当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。
printStackTrace()方法的意思是:在命令行打印异常信息在程序中出错的位置及原因。
e.printStackTrace();e.printStackTrace();
super关键字明确调用基类构造器。接收一个字符串作为参数。
finally是不管有没有异常都会执行。
System.exit(0)直接结束程序强制程序退出,不会执行以后的代码。
final用于声明属性,方法,和类,分别表示属性不可变,方法不可覆盖,类不可继承。
37.java.lang.String类是final类型的,因此不可以继承这个类,不能修改这个类。
38.类中域为基本类型时能够自动被初始化为零。但队象引用会被初始化为NULL,如果试图为特们调用任何方法,都会得到一个异常,运行时错误。再不抛出异常的情况下,仍旧可以打印一个null引用。可以通过this访问静态成员变量。
39.netstat –ano查看端口号
taskkill –pid 端口号 –f
使用netstat -ano | findstr “8080”,在“|”前面的命令执行结果作为后一个命令执行的输入
使用tasklist | findstr “java”,查找进程名包含“java”的所有进程
40.当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用 @Autowired(required = false),这等于告诉 Spring:在找不到匹配 Bean 时也不报错。
41.@Lazy注解的使用
用于指定该Bean是否取消预初始化。主要用于修饰Spring Bean类,用于指定该Bean的预初始化行为,使用该Annotation时可以指定一个boolean型的value属性,该属性决定是否要预初始化该Bean。也就是说该属性默认是true,也就是说懒加载,只有在被引用的时候才会加载,为false会在容器初始化的时候急切的加载。
git查看之前对代码进行的更改,可show history ,local change ,show diff
42.HTTP/2将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码
帧(Frame):HTTP/2通信的最小单位,每个帧包含帧首部,至少也会标识出当前帧所属的流。
消息(Message):由一个或多个帧组合而成,例如请求和响应。
连接(Connection):与 HTTP/1 相同,都是指对应的 TCP 连接;
流(Stream):已建立的连接上的双向字节流。
在HTTP/2中,数据流以消息的形式发送,而消息由一个或多个帧组成,帧可以在数据流上乱序发送,然后再根据每个帧首部的流标识符重新组装。二进制分帧是HTTP/2的基石,其他优化都是在这一基础上来实现的。在 HTTP/2 中,有了二进制分帧之后,HTTP 2.0不再依赖TCP链接去实现多流并行了,在HTTP/2:同域名下所有通信都在单个连接上完成。单个连接可以承载任意数量的双向数据流。数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装。这一特性,性能会有极大的提升,因为:同个域名只需要占用一个TCP连接,消除了因多个TCP连接而带来的延时和内存消耗。单个连接上可以并行交错的请求和响应,之间互不干扰。
43.在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。
44.Server push是HTTP/2中一个很强大的功能:服务器除了响应客户端的请求外,还可以向客户端额外推送资源。服务器推送的资源有自己独立的URL, 可以被浏览器缓存,可以达到多页面共享。资源推送遵守同源策略,服务器不可随便推送第三方资源给客户端。客户端可以拒绝推送过来的资源。有了这一特性,我们可以做什么?应用可以通过额外的http头部,列出需要服务器推送哪些资源。服务器可以解析请求的html,推测出客户端接下来需要请求的资源,然后提前向客户端推送。
45.在HTTP1.1的协议中,我们传输的request和response都是基本于文本的,这样就会引发一个问题:所有的数据必须按顺序传输,比如需要传输:hello world,只能从h到d一个一个的传输,不能并行传输,因为接收端并不知道这些字符的顺序,所以并行传输在HTTP1.1是不能实现的。HTTP/2引入二进制数据帧和流的概念,其中帧对数据进行顺序标识,如下图所示,这样浏览器收到数据之后,就可以按照序列对数据进行合并,而不会出现合并后数据错乱的情况。同样是因为有了序列,服务器就可以并行的传输数据,这就是流所做的事情。HTTP/2对同一域名下所有请求都是基于流,也就是说同一域名不管访问多少文件,也只建立一路连接。同样Apache的最大连接数为300,因为有了这个新特性,最大的并发就可以提升到300,比原来提升了6倍!
46. JS文件的合并。我们现在优化的一个主要方向就是尽量的减少HTTP的请求数, 对我们工程中的代码,研发时分模块开发,上线时我们会把所有的代码进行压缩合并,合并成一个文件,这样不管多少模块,都请求一个文件,减少了HTTP的请求数。但是这样做有一个非常严重的问题:文件的缓存。当我们有100个模块时,有一个模块改了东西,按照之前的方式,整个文件浏览器都需要重新下载,不能被缓存。现在我们有了HTTP/2了,模块就可以单独的压缩上线,而不影响其他没有修改的模块。
多域名提高浏览器的下载速度。之前我们有一个优化就是把css文件和js文件放到2个 域名下面,这样浏览器就可以对这两个类型的文件进行同时下载,避免了浏览器6个通 道的限制,这样做的缺点也是明显的,1.DNS的解析时间会变长。2.增加了服务器的压 力。有了HTTP/2之后,根据上面讲的原理,我们就不用这么搞了,成本会更低。
47.多路复用的好处减少服务端连接压力,减少占用内存,提升连接吞吐量;
连接数的减少改善了网络拥塞状况,慢启动时间减少,拥塞和丢包恢复速度更快;
避免连接频繁创建和关闭(三次连接、四次挥手);
逻辑上,各个流之间是相互独立的,没有影响.
48.gRPC基于HTTP/2标准设计,所以相对于其他RPC框架,gRPC带来了更多强大功能,如双向流、头部压缩、多复用请求等。这些功能给移动设备带来重大益处,如节省带宽、降低TCP链接次数、节省CPU使用和延长电池寿命等。同时,gRPC还能够提高了云端服务和Web应用的性能。gRPC既能够在客户端应用,也能够在服务器端应用,从而以透明的方式实现客户端和服务器端的通信和简化通信系统的构建。
49. 看表FOOD MASTER PAY看业务点单 接单 结账
50.Ridis缓存出现的一些问题
缓存雪崩
由于原有缓存失效(或者数据未加载到缓存中),新缓存未到期间(缓存正常从Redis中获取,如下图)所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机,造成系统的崩溃。
简单处理机制
给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,
更新数据缓存
缓存标记:记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key的缓存;缓存数据:它的过期时间比缓存标记的时间延长1倍,例:标记缓存时间30分钟,数据缓存设置为60分钟。 这样,当缓存标记key过期后,实际缓存还能把旧数据返回给调用端,直到另外的线程在后台更新完成后,才会返回新缓存。
缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库中查询。
简单处理机制
如果查询数据库也为空,直接设置一个默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库,这种办法最简单粗暴。
根据缓存数据Key的规则。例如我们公司是做机顶盒的,缓存数据以Mac为Key,Mac是有规则,如果不符合规则就过滤掉,这样可以过滤一部分查询。在做缓存规划的时候,Key有一定规则的话,可以采取这种办法。这种办法只能缓解一部分的压力,过滤和系统无关的查询,但是无法根治。
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的BitSet中,不存在的数据将会被拦截掉,从而避免了对底层存储系统的查询压力。
缓存预热
缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据。
简单处理机制
直接写个缓存刷新页面,上线时手工操作下;
数据量不大,可以在项目启动的时候自动进行加载;
定时刷新缓存;
缓存更新
除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种:(1)定时去清理过期的缓存;(2)当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂
缓存降级
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。
51.POJO全称是Plain Ordinary Java Object / Pure Old Java Object,中文可以翻译成:普通Java类,具有一部分getter/setter方法的那种类就可以称作POJO,但是JavaBean则比 POJO复杂很多。
52.Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean 。但通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat) 的,所以 Java Bean 应具有一个无参的构造器,另外,通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。 Java Bean 是不能被跨进程访问的。JavaBean是一种组件技术。
53. @ApiModelProperty()用于方法,字段,表示对model属性的说明,或者数据操作的更改。value–字段说明 name–重写属性名字 dataType–重写属性类型 required–是否必填 example–举例说明 hidden–隐藏。
54.git remote add upstream http://git.hualala.com/mendian/mendianbao-service.git 添加远程分支,可以将本地分支提交到远程分支上,git remote -v 查看当前所有远程分支,git remote add 自定义名称 git路径---->git remote add upstream http://git.hualala.com/mendian/mendianbao-service.git. git push会默认提交到自己的origin分支上,
55.lamdba表达式的组成:参数列表,箭头,以及一个语句块或者是表达式. 如下
()->{} .()为参数列表,参数的类型可以省略,Java编译器可以自动推断. 如果只有一个参数 且可以被Java推断出类型,那么参数列表的括号也可以省略.
Lambda表达式的类型叫做”目标类型”,他是一个”函数接口”(定义:一个接口,如果只 有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标 注出来(也可以不标)。
56.一个对象的创建大概需要经过以下几步:
检查对应的类是否已经被加载、解析和初始化
类加载后,为新生对象分配内存
将分配到的内存空间初始为 0
对对象进行关键信息的设置,比如对象的哈希码等
然后执行 init 方法初始化对象
创建一个对象的开销需要经过这么多步,也是需要时间.
57.@Service中@Service(“kkk”)括号中代表实现同一接口的不同类的名称,在具体使用时,系统不知道需要调用哪一个实现接口的类,因此加@Qualifier(“@service注解括号中的引号的内容”)。可以实现,系统不会报错。
58.@Pre注解用于SQL语句查询
59.Npm是Node js的包管理工具
1、npm install moduleNames:安装Node包(moduleNames包名称)
(1)npm install moduleNames -g 为全局安装 
(2)npm install moduleNames@5.1.1  安装特定版本插件
(3)npm install moduleNames --save 会在package.json的dependencies属性下添加moduleNames  即发布依赖时候任依赖的插件
(4)npm install moduleNames --save-dev  会在package.json的devDependencies属性下添加moduleNames依赖 即开发依赖插件
总结:npm install 在安装 npm 包时,有两种命令参数可以把它们的信息写入 package.json 文件,一个是npm install --save另一个是 npm install --save-dev,他们表面上的区别是–save 会把依赖包名称添加到 package.json 文件 dependencies 键下,–save-dev 则添加到 package.json 文件 devDependencies 键下。
真正跑在用户浏览器中的代码,比如jquery,react这些,是需要安装到dependencies中的。
–save是对生产环境所需依赖的声明(开发应用中使用的框架,库),–save-dev是对开发环境所需依赖的声明(构建工具,测试工具).正常使用npm install时,会下载dependencies和devDependencies中的模块,当使用npm install --production或者注明NODE_ENV变量值为production时,只会下载dependencies中的模块。
2、npm config set registry https://registry.npm.taobao.org  修改包下载源,此例修改为了淘宝镜像
3、npm config get prefix  查看全局安装路径
4、npm config set prefix G:/node_modules_global  修改全局安装路径
5、npm init  初始化目录
6、npm install -g gulp  全局安装(如gulp)
7、npm uninstall -g gulp    全局包卸载(如gulp)
8、npm uninstall gulp --save-dev  项目本地卸载(如gulp)
9、npm ls --global    会查看到安装包所包含的所有依赖文件   npm ls --global -depth 0  只查看顶级安装包
10、npm ls  查看本地安装包
11、npm cache clean  删除安装包缓存
12、npm  update xxx  更新安装包
13、npm search xxx  查找验证某个包是否已经存在
14、npm root 查看当前包安装路径  npm root -g  查看全局包安装路径
15、npm outdated:检查包是否已经过时,此命令会列出所有已经过时的包,可以及时进行包的更新
16、npm view xxx engines:查看包所依赖的Node的版本
17、npm view xxx repository.url:查看包的源文件地址
18、npm view xxxpendencies:查看包的依赖关系
60. 更改mysql数据库密码
Set password for root@localhost = password(‘95279527’);
60. 查看saas日志 D盘下的home目录中,同时可以查看error类型日志
61.打包命令 mvn clean install -DskipTests 打好的jar包会放在target目录下,放到
traceID=1a6744d3-f41f-4997-ab71-175a1ce03081&accessToken=MDB_EMPLOYEE_SESSION6e32941332124d5fb0781ae5651e210d
traceID=1ef0c63d-af12-423a-b64f-d34d130e9402&accessToken=MDB_EMPLOYEE_SESSION6e32941332124d5fb0781ae5651e210d
traceID=f91f7eeb-a8e8-49de-b629-9429e7b6c7f5&accessToken=MDB_EMPLOYEE_SESSION6e32941332124d5fb0781ae5651e210d

最初学习阶段有用没用的杂七杂八相关推荐

  1. 学习阶段怎么模拟_掌握学习方法,早日取得执业药师证

    关于执业药师如何备考我建议是按照时间轴进行备考. 下面的内容有点长,可能需要花费你一定的时间,但是看完肯定对你有所帮助! 好的学习方法很重要,能提高80%学习效率! 为什么说学习方法很重要? 先跟大家 ...

  2. Shell脚本学习-阶段四-mysqladmin

    文章目录-Shell学习-阶段四mysqladmin 前言 20条mysql的mysqladmin 1.设置mysql的root密码 2.更改mysql的root密码 3.确保mysql Server ...

  3. web前端开发培训有哪些学习阶段

    ​ web前端技术主要针对于移动互联网是比较多的,对于零基础的同学来说前期主要学习基本的静态布局,HTML + CSS,下面是web前端开发培训有哪些学习阶段的具体内容. ​ web前端开发培训有哪些 ...

  4. 参加java培训都有哪些学习阶段

    最近有很多在参加java培训学习的同学都会遇到一些学习上的困难,尤其是一些没有基础的同学,java培训学习是有阶段性的,只要了解每个学习阶段都是什么,做好学习规划就可以,下面小编就为大家详细的介绍一下 ...

  5. 最初学习ASP.net的时候常会遇到的问题

     最初学习ASP.net的时候常会遇到的问题       1,关于ref与out的区别 ref 参数传入时需要初始化:out 参数传入时不需要初始化,但是出来的时候需要保证会产生一个有效地引用. 2, ...

  6. java工具类应该抛异常吗,java学习阶段一 工具类(异常)

    java学习阶段一 工具类(异常) 介绍 异常:运行期间出现的错误 背离程序本身意图的表现 基本知识 异常的分类 根类 Throwable Error 程序无法处理的错误 表示运行应用程序中教严重的问 ...

  7. Shell脚本学习-阶段三

    文章目录-Shell学习阶段三 前言 1.用shell脚本批量建立Linux用户 2. 编写shell脚本,将/usr/local/test目录下大于100k的文件转移到/tmp目录下: 3.通过ap ...

  8. Shell脚本学习-阶段二

    文章目录-Shell脚本学习阶段二 前言 shell脚本实操2 1.获取随机字符串或数字 2.定义一个颜色输出字符串函数 3.批量创建用户 4.检查软件包是否安装 5.检查服务状态 6.检查主机存活状 ...

  9. 乐高JAVA编程_编程和乐高机器人,是一样的吗?学习这些有用吗?

    原标题:编程和乐高机器人,是一样的吗?学习这些有用吗? 现在育儿养儿成本不断增加,街上各种少儿兴趣班应接不暇,各位家长都不想让自己的孩子输在起跑线上,都争着去给孩子填满假期时间,近年,儿童教育领域冒出 ...

最新文章

  1. 开发日记-20190503 关键词 汇编语言(二)
  2. webapi 获取请求参数
  3. local sandbox html里的script tag是如何load到memory里的
  4. java web程序 上机考试做一个登陆注册程序
  5. Android开发笔记(五十)定时器AlarmManager
  6. [Android Pro] Test win
  7. spring cloud gateway 网关_33、Spring Cloud网关Gateway
  8. linux efi分区安装grub2,编译UEFI版本Grub2引导多系统文件efi
  9. 安卓怎么打开html游戏,安卓手机如何打开.xapk文件
  10. 我的Unity3d学习总结
  11. 安卓android记单词软件
  12. vela和鸿蒙,小米Vela系统发布,将对标华为鸿蒙OS
  13. [PPPOE]RP-PPPOE脚本分析
  14. 调岗调薪带来的法律风险
  15. 运用matlab求解梁的变形例题,matlab与结构力学
  16. LINUX Ubuntu 平台上安装PGI的pgf90编译器
  17. 二叉树:后序遍历非递归算法
  18. win7如何进入计算机配置,教您win7怎么进入设置bios
  19. (CVPR-2020)GaitPart:基于时间部分的步态识别模型(一)
  20. vue路由跳转清空数据

热门文章

  1. Android SDK下载和环境变量配置
  2. 中国芯,华为海思中文官网上线,速速围观
  3. 解决-Dmaven.multiModuleProjectDirectory system property is not set.
  4. 2022年学习与反思
  5. 微型计算机接口及基础,微型计算机技术与接口应用基础
  6. 西门子S7-200创建和下载程序
  7. 短视频营销的模式和流程
  8. c#和数据库技术基础之程序设计集散地-数据库
  9. mysql怎么对列求和
  10. vue2 mixins混入