0%

文章字数:131,阅读全文大约需要1分钟

面向切面的编程,底层是动态代理

分类

  • 前置通知@Before("execution(public int com.xx.yy.*(...))")
  • 后置通知@After
  • 返回后通知@AfterReturning
  • 出现异常后运行@AfterThrowing
  • 环绕通知(动态代理)@Around手动joinPoint.procced()手动执行业务方法

pointcut

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 原生Spring需要开启EnableAspectJAutoProxy, SpringBoot默认开了
// 需要注入到Spring
@Aspect
public class xxx

/** 指定切面,这样就不用每个方法都指定作用于那个地方 */
@Pointcut("execution(public int com.xx.yy.*(...))")
public void pointCut(){};

@Before("pointCut()")
public void logStart(){
sout("xxx");
}

@Around("pointCut()")
public Object Around(ProceedingJoinPoint joinPoint) throws Throwable{
sout("前置");// 比Before还早
// 执行业务方法,类似反射调用方法
Object res = joinPoint.proceed();
sout("后置");
return res;
}

文章字数:78,阅读全文大约需要1分钟

利用单片机伪装成U盘,插上U盘后单片机伪装成键盘设备,并且输入恶意代码

常见的BadUSB

  • TEENSY:一种在USB设备中植入攻击芯片的系统。
  • USB RUBBER DUCKY:USB橡皮鸭较为完整成熟的按键攻击平台

文章字数:316,阅读全文大约需要1分钟

创建–》初始化(赋值)–》销毁

设置初始化和销毁调用函数

1
@Bean(initMethod="init", destroyMethod="destroy")

继承接口也可以实现初始化和销毁

1
2
3
public class Train implements InitializingBean, DisposableBean{
//...
}

JSR250规范方式

  • 提供了两个注解,可以指定初始化和销毁调用的方法
1
2
3
4
5
6
7
@PostConstruct
public void init() {
}

@PreDestroy
public void destory(){
}

BeanPostProcessorsr

  • 后处理器
    1
    2
    3
    public class MyBeanPostProcessor  implements BeanPostProcessor{
    // override...
    }
  • 把bean封装成wrappedBean
  • 首先创建并初始化容器相关的processor(大部分Spring的注解都对应一个BeanPostProcessor),遍历Spring所有的处理器,调用processor的初始化方法
  • bean赋值,注入其他组件,生命周期等功能都是这样实现的

容器启动过程

启动加载配置类-》refresh()->finishBeanFactoryInitialization()->getBean()->doCreateBean()->beanWrapper(对象创建)-》populated(属性赋值)->inializate()->processors


文章字数:213,阅读全文大约需要1分钟

c10k本质

c10k就是大并发下所产生的问题。传统的同步阻塞io导致大并发量下效率低下,甚至是系统崩溃。

解决

主要解决方式是io多路复用

  1. select方式:使用fd_set结构体告诉内核同时监控那些文件句柄,逐个排查文件句柄是否就绪或超时。缺点(句柄数量有限,逐个检查效率低,每次都要初始化fd_set)
  2. poll该方式采用链表存储句柄,解决句柄上线问题。采用关注事件和发生的事件解决重复初始化问题。但是逐个检查的问题没解决
  3. epoll该方式基于内核(linux)发出就绪之后的通知,效率很高但是一来操作系统。

文章字数:117,阅读全文大约需要1分钟

jpa持久层抛出的异常

原因

查了一下,问题主要是持久层加载了过多对象导致的,主要是多对多关系加载了太多相同的对象。

解决

  1. 设置懒加载
  2. 如果不用懒加载可以将存储的容器设置成set
  3. 如果使用的是Hibernate,可以在字段上声明@IndexColumn。 此注解可以建立唯一索引,保证唯一性。

文章字数:416,阅读全文大约需要1分钟

CI持续集成,CD持续交付

On-Premise和Hosted

  1. On-Premise需要用户自己搭建服务器
  • TeamCity
  • Jenkins
  1. Hosted类型的则是一个SaaS服务,不需要自己搭建服务器
  • Travis CI
  1. 两种类型都可以的
  • AppVeyor
  • Azure Pipelines
  1. 对比
  • On-Premise是自己搭建服务器,所以可以方便的访问不同的内网服务器,部署内网等
  • Hosted维护成本地,自带环境,预装工具,节约时间

价格

  • On-Premise类型的都是免费的,但是需要自费服务器
  • Hosted CI/CD Service类型对于私有项目收费,开源项目免费。Azure Pipelines有一个月 1800 分钟的免费额度

插件

  • Jenkins插件最多,超过1600个
  • Azure Pipelines970以上
  • TeamCity366以上

SCM Support

支持那些源代码管理工具

  • Jenkins TeamCity Azure Pipelines支持多种不同种类的代码管理工具
    1
    GitHub, GitHub Enterprise, Bitbucket, GitLab, Azure Repos, Kiln 以及custom repos 等等
  • Travis CI只支持GitHub

UI配置和YAML

  • TeamCity Jenkins Travis CI AppVeyor Azure Pipelines都支持YAML定义配置
  • TeamCity Jenkins Azure Pipelines同时支持UI界面方便的定义持续集成的配置

Cron job

定时任务上AppVeyor支持最好,它支持标准的Crontab语法


文章字数:17,阅读全文大约需要1分钟

1
2
3
4
5
6
7
8
9
10
11
12
p::selection {
background:#ccc;
color:#ff645d;
}
p::-moz-selection {
background:#ccc;
color:#ff645d;
}
p::-webkit-selection {
background:#ccc;
color:#ff645d;
}

文章字数:34,阅读全文大约需要1分钟

一张的时候居中,多张自动排列开

1
2
3
4
5
6
7
<div style="width: 100%;height: 200px;overflow: auto;text-align:center">
<div style="display: inline-block">
img1
img2
...
</div>
</div>

上下垂直居中

1
display:flex;justify-content: center;align-items: center

文章字数:36,阅读全文大约需要1分钟

多行文字+多余省略

1
2
3
4
overflow: hidden;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;

单行+文字省略

1
2
3
4
display: inherit; /** 行级元素 */
overflow: hidden;
white-space: nowrap; /** 不换行 */
text-overflow: ellipsis; /** 超出省略 */

文章字数:770,阅读全文大约需要3分钟

css选择

  1. 基本选择器
选择器 含义
* 通用元素选择器,匹配任何元素
E 标签选择器,匹配所有使用e的标签
.myClass class选择器
#myId id选择器
  1. 选择器组合
选择器 含义
E,F 多元素选择器,匹配所有E元素或F
E F 后代元素选择器,匹配所有E的后代元素F
E > F 子元素选择器,匹配所有E的子元素F
E + F 毗邻元素选择器,匹配所有紧随E的同级元素F
E ~ F 同级元素选择器,匹配所有E元素之后的同级F
  1. 属性选择器
选择器 含义
[att] 匹配所有具有att属性的元素,以下所有选择器都能省略具体元素,代表任意元素
E[att] 匹配所有具有att属性的E元素
E[att=’val’] 匹配所有att属性等于’val’的E元素
E[att~=’val’] 匹配att有多个空格分割的值,其中一个是’val’的E元素
E[att =’val’]
  1. 伪元素选择器
选择器 含义
E:first-line 匹配E元素的第一行
E:first-letter 匹配E元素的第一个字母
E:before 在E元素之前插入内容
E:after 在E元素之后插入内容
  1. 模糊搜索元素
选择器 含义
a[att^=’val’] 属性att的值以’val’开头
a[att$=’val’] 属性att的值以’val’结尾
a[att*=’val’] 属性att的值包含’val’
  1. 用户界面关系相关的伪类
选择器 含义
E:enabled 表单中激活的元素
E:disabled 表单中禁用的元素
E:checked 表单中被选中的单选和复选框
E::selection 用户当前选中的元素
  1. 结构性伪类
选择器 含义
E:root 文档的根元素,对于html文档来说,就是html元素
E:nth-child(n) 匹配E的第n个子元素,从1开始
E:nth-last-child(n) 匹配父元素倒数第n个子元素,从1开始
E:nth-of-type(n) 匹配父元素第n个E元素,从1开始
E:last-child 匹配父元素最后一个子元素,相当于nth-last-child(1)
E:first-of-type 相当于nth-of-type(1)
E:only:child 匹配父元素下仅有的一个子元素,相当于first-child:last-child
E:only-of-type 匹配父元素下使用唯一一个使用相同标签的子元素,相当于E:first-of-type:last-of-type
E:empty 匹配不包含任何子元素的元素

target伪类

选择器 含义
E:target 匹配文档中特定跳转id的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 点击之后页面会跳转到制定id的位置 -->
<a href="#text1">示例文字1</a>
<a href="#text2">示例文字2</a>
<a href="#text3">示例文字3</a>

<!-- div:target 就是指向跳转的那个div -->
<div id="text1">
<h2>示例文字1</h2>
</div>
<div id="text2">
<h2>示例文字2</h2>
</div>
<div id="text3">
<h2>示例文字3</h2>
</div>
<!-- 也可以使用window.location.hash='#text1',相当于点击了a标签 -->