0%

​ 使用git进行合并分支说难也不难,因为就使用一下那几个命令而已!但是不小心操作总会有一些难以预料的问题出现、但是coder们总是会做出奇怪的举动。

​ 合并分支的时候O(∩_∩)O

合并分支

快速了解下分支流程。

​ 分支类似科幻电影里面经常出现的平行宇宙,只是分支之间还能合并。

​ git默认的是master分支,如果所有的开发都在master分支,这其实非常操蛋。这么吊的工具怎么可能没有好的分支策略。

  • 正常分支

    • origin/master:主分支
    • origin/develop:开发分支

      em 首先代码库默认有一个,且只有一个主分支Master,这个分支是仓库初始化的时候默认创建的。但实际上还有另一主分支 develop(开发主分支)、只是很多开发并不会启用develop分支。当develop分支上代码达到一定稳定的时候,所有的改动就会被合并到master中。并用一个发行版来标记它。所以每当被合并到master中就意味着一次release版本发布。这个时候才会使用(hook script)钩子去自动构建我们的项目、并部署正式服务器。

  • 临时分支

    • feature:功能分支(特征分支)
    • release:预发布分支(发行分支)
    • fixbug:修补bug分支(热补丁分支)

      为什么会有临时分支这种东西,上面说到主分支是用来管理重大版本发布的。日常的开发应该是在另外一条分支上进行develop,而临时分支是在develop分离出来做迭代以及bug修复的。达到阶段目标在合并到develop分支当中。


阅读全文 »

  • 本章内容为早期笔记迁移。
  • 阅读提醒,权限root.操作流程并位遵循安全规则;线上环境请勿模仿。

文件存放位置。

  • opt
    • backup
    • javahome
    • mavenhome
    • gradlehome
1
mkdir -p /opt/{backup,javahome,mavenhome,gradlehome}

相关基础程序安装

阅读全文 »

本章是整理知识内容,为强化知识长期更新。

Linked List

  • 链表即是由节点(Node)组成的线性集合,每个节点可以利用指针指向其他节点。它是一种包含了多个节点的、能够用于表示序列的数据结构。
  • 单向链表: 链表中的节点仅指向下一个节点,并且最后一个节点指向空。
  • 双向链表: 其中每个节点具有两个指针 p、n,使得 p 指向先前节点并且 n 指向下一个节点;最后一个节点的 n 指针指向 null。
  • 循环链表:每个节点指向下一个节点并且最后一个节点指向第一个节点的链表。
  • 时间复杂度:
    • 索引: O(n)
    • 搜索: O(n)
    • 插入: O(1)
    • 移除: O(1)

LinkedList 是是一个有序的集合,是Collection的实现类之一。

概述

  • 双链表 LinkedList 是 Java Collecion Framework成员之一。
  • 双链表 是List和Deque的接口的实现。
  • 在内部,它是使用双链表数据结构实现的。
  • 它支持重复的元素。它没有实现RandomAccess接口。所以我们只能按顺序访问元素。它不支持随机访问元素。
  • 相对与ArrayList它 删除 和添加 速度会快很多。但是遍历就要慢一些。
  • 它以插入顺序存储或维护它的元素。

链表

阅读全文 »

本章是整理知识内容,为强化知识长期更新。

List 是是一个有序的集合,是Collection的实现类之一。

概述

  • list接口是Java Collection Framework的成员。
  • 列队允许添加重复的元素。
  • 列队允许null存在。
  • 列队是从0开始,也就是列队头元素的下标是0。
  • 列队支持泛型,这样可以避免ClassCastException异常。

数组与数组列表

阅读全文 »

刚才学习SpringAop的时候觉得好强大

演示代码

演示效果

  • 启动代码
1
2
3
  docker-run curl http://localhost:9003/aop/

{"code":"200"}%
  • Console
1
2
[XNIO-1 task-1] [LogsAspect.java : 50]   annotationAop value index 
[XNIO-1 task-1] [LogsAspect.java : 50] annotationAop value index

Spring Aop

AOP(Aspect-Oriented Programming:⾯向切⾯编程)能够将那些与业务⽆关,却为业务模块所共同调⽤的逻辑或责任(例如事务处理、⽇志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

  • Spring Aop是运行时增强。
  • Cglib Aop是编译器增强。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {

/**
* 是否要创建基于子类 (CGLIB) 的代理,而不是创建标准的基于 Java 接口的代理。 默认值为false 。
*/
boolean proxyTargetClass() default false;

/**
* org.springframework.aop.framework.AopContext类进行检索。 默认关闭
*/
boolean exposeProxy() default false;

}

Spring注解

1
2
3
4
5
6
7
@Aspect //定义切面:切面由切点和增强(引介)组成(可以包含多个切点和多个增强),它既包括了横切逻辑的定义,也包括了连接点的定义,SpringAOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的链接点中。
@Pointcut //定义切点:切点是一组连接点的集合。AOP通过“切点”定位特定的连接点。通过数据库查询的概念来理解切点和连接点的关系再适合不过了:连接点相当于数据库中的记录,而切点相当于查询条件。
@Before // 在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可。
@AfterReturning //在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值。
@Afterthrowing //主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象。
@After //在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式。
@Around //环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint。

pom依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121

package cn.z201.aop;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* @author z201.coding@gmail.com
**/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationAop {

String value();

}


package cn.z201.aop;

import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

/**
* @author z201.coding@gmail.com
**/
@Component
@Aspect
@Slf4j
public class LogsAspect {

@Pointcut("@annotation(cn.z201.aop.AnnotationAop)")
private void cutMethod() {

}

/**
* 异常通知:目标方法抛出异常时执行
*/
@AfterThrowing("cutMethod()")
public void afterThrowing(JoinPoint joinPoint) {
log.info("after throwing");
}

/**
* 环绕通知:灵活自由的在目标方法中切入代码
*/
@Before("cutMethod()")
public void before(JoinPoint joinPoint) throws Throwable {
// 获取目标方法的名称
String methodName = joinPoint.getSignature().getName();
// 获取方法传入参数
Object[] params = joinPoint.getArgs();
if (null != params && params.length != 0) {
log.info(" method name {} args {}", methodName, params[0]);
}
// 执行源方法
AnnotationAop annotationAop = getDeclaredAnnotation(joinPoint);
if (null != annotationAop) {
log.info(" annotationAop value {} ", annotationAop.value());
}
}

/**
* 获取方法中声明的注解
*
* @param joinPoint
* @return
* @throws NoSuchMethodException
*/
public AnnotationAop getDeclaredAnnotation(JoinPoint joinPoint) throws NoSuchMethodException {
// 获取方法名
String methodName = joinPoint.getSignature().getName();
// 反射获取目标类
Class<?> targetClass = joinPoint.getTarget().getClass();
// 拿到方法对应的参数类型
Class<?>[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getParameterTypes();
// 根据类、方法、参数类型(重载)获取到方法的具体信息
Method objMethod = targetClass.getMethod(methodName, parameterTypes);
// 拿到方法定义的注解信息
AnnotationAop annotation = objMethod.getDeclaredAnnotation(AnnotationAop.class);
// 返回
return annotation;
}

}


package cn.z201.aop;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
* @author z201.coding@gmail.com
**/
@RestController
public class AppApplicationController {

@RequestMapping(value = "")
@AnnotationAop(value = "index")
public Object index() {
Map<String, Object> data = new HashMap<>();
data.put("code", "200");
return data;
}
}

END