注解开发应用
注解在Java基础中我们都学习过简单的注解开发,但并不没有意识到重要性,直到使用了SpringBoot后,我们看到了注解相比原先配置文件的大量定义的简洁与优雅。在测试中我们也常用注解:@Test ,在方法定义时加上该注解,我们便可以执行这个方法,这到底怎么做的呢? 本文将回顾注解基础,并衍生到具有应用:
基础知识@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
上面的代码大家都很熟悉,当我们子类重新父类的方法时,会带有该注解。而我们在声明一个注解时,
首先需要使用 @Interface 来定义,这和我们定义 class,Interface 一样,最终编译时也会生成一个 class 文件
其次需要 @Target 和 @Retention 来定义该注解的作用域,这也被称为元注解,下面我们看看它们常用的范围
public enum ElementType {
/** 类, 接口 (包含注解), 枚举
...
SpringBoot自动装配原理
SpringBoot 自动装配原理@SpringBootApplication 启动注解@SpringBootApplication
public class SpringBootBasicLearnApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootBasicLearnApplication.class, args);
}
}
/**
* to store the base package from the importing configuration
* 也就是获取到我们启动类的包路径
*/
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitio ...
ABAC权限设计
这里我使用ABAC理论来设计:
数据库表设计
用户属性:
```sqlCREATE TABLE User(userId int,userName varchar(100),roleId int);
- 环境属性
- ```sql
CREATE TABLE Role
(
roleId int,
roleName varchar(100) # 比如:普通用户,付费用户,积分等级
);
操作属性:
```sqlCREATE TABLE action(actionId int,actionName varchar(100) # 比如:read读,write评论);
- 试读
- 付费读
- 免费读
- 评论
- Resources属性:
- ```sql
CREATE TABLE module # 我们最终操作的资源,例如查看的文章,数据
(
moduleId int,
moduleName varcha ...
opencv环境搭建
opencv 入门环境下载与搭建Windows用户直接在官网下载 Windows 文件:https://opencv.org/releases/ 。然后参考这篇文章:https://blog.csdn.net/qianlixiaomage/article/details/108416400。说实话Windows上操作太方便了。我用Mac捣鼓了半天,气死。
Mac用户直接在官网下载 Sources 文件:https://opencv.org/releases/ 。并进行解压。
下载cmake:brew install cmake
下载Ant:https://www.jianshu.com/p/bdca5215e9ca 这里是必须的,如果没有,最后无法生成jar包
cd opencv-4.7.0 # 这里是opencv源码包解压的文件地址
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local .. # 这俩点表示OpenCV的源码位置,不能省略
...
多线程事务
多线程事务 在Spring开发时,遇到一个从Excel表导入数据到数据库的需求,当然最简单的方法就是先使用EasyExcel把数据读出到集合中,然后依次插入到数据库中。但如何保证效率,原子性呢?我们一步步优化方案。这里会涉及到分布式事务的知识,如果感兴趣可以看我之前的文章:玲辰书斋,这里不会引入不必要的组件,而是我们自己模拟类似的思想。
方法1:依次顺序插入
void test() {
List<User> users = getAllUsers();
users.forEach(user -> userService.save(user));
}
方法2:使用批处理,一次操作中执行多条SQL
void test() {
List<User> users = getAllUsers();
userService.saveBatch(users);
}
方法3:使用多线程+批处理,每个线程插入多条数据
需要注意的一点,Spring容器不允许线程注入,也就是没办 ...
手写非公平锁(ReentrantLock)
手写非公平锁(ReentrantLock) ReentrantLock很多教程都在讲解,虽然很细致,但内容太多了,过段时间就很容易忘,我们知道ReentrantLock的核心是AQS(抽象队列同步器),我们这里试着使用AQS,自己写一个非公平锁使用,看看AQS承载了哪部分的职责,ReentrantLock承载了哪部分的职责
第一步:定义接口,面向接口编程嘛
public interface myLock {
// 很简单的加锁和释放锁
public void lock();
public void unlock();
}
第二步:看看ReentrantLock与AQS的关系
public class myUnFairLock implements myLock {
private final Sync sync = new Sync();
// 锁的核心由AQS管理,ReentrantLock只负责重写 tryAcquire 和 tryRelease方法的逻辑
private stat ...
Rails基础
Ruby On Rails基础介绍 Rails可以理解为一个快速构建Web应用的框架,本身基于Ruby开发,拥有很强的灵活性。
如何下载与使用Rails? 这里的前提是你已经下载好了Ruby
gem install rails # 通过ruby工具(当成功下载并使用Ruby时,该工具会一同配置好的) 下载 rails
rails -v # 如果正常下载则显示Rails版本
这里我在Mac上下载好rails并使用时,遇到了报错显示,显示rails还没有立刻被下载成功,需要再执行上面下载命令(但是并没什么用,至少我是这样,有的人说是有一个延迟时间):
Rails is not currently installed on this system. To get the latest version, simply type:
$ sudo gem install rails
You can then rerun your "rails" command.
这里我的解决方式为:
gem env # 显 ...
Shell的常规使用
shell的分类
/bin/bash 是我们在linux或者Mac下常用的shell
zsh 是一种增强shell,在Mac和Linux中可使用,Mac基本自带
日常文件操作
ls :显示文件
cd :进入文件夹
cp :拷贝文件
mv :重命名或迁移文件
cat :查看文件内容,并在控制台打印
head:查看文件头部信息,可指定多少行
tail :查看文件尾部信息,可指定行数,并且可跟踪日志文件
grep:查找过滤,一般用在 操作 | grep , | 表示管道符,将操作的返回的数据,通过grep进行过滤
fgrep : 无正则查询,普通查询快
egrep :有正则查看
shell的快捷键
↑ ↓ 会回显之前执行的代码。默认记录500条
ctrl + R , 快速查看之前执行的命令
ctrl + W,将已输入的命令,以空格划分,每次向前删除一部分
ctrl + U,删除已输入命令所有部分
ctrl + A,将光标移动到最前(已输入内容)
ctrl + E, 将光标移动到最后
ctrl + K,向右删除所有
ctrl + D,向右删除一位
ctrl + L ...
Ruby元编程
本文需要在了解Ruby基本语法的前提下,进行学习
元编程是什么? 元编程是编写能在运行时操作语言构件的代码
在我们使用编辑器编写代码后,代码按照我们所写的内容进行编译,运行。在启动后我们无权再对代码进行干涉,而在一些业务场景中,我们想在不修改源代码的前提下,对一个类进行增强,这在Java中也是一个成熟的技术,例如反射,动态代理。但是Java所能给予的操作相比Ruby,就显得格外的严格且复杂。
Ruby是一门可以在运行时操作语言构建的工具。语言构建就是我们代码中的各个成员(对象,类,模块儿,实例变量等)。通俗来说可以使用Ruby在运行时对已有的类进行灵活的修改,例如修改一个方法的定义。实例变量的定义,甚至我们可以在运行时创建一个没有的类。下面我们使用一些伪代码来进行演示。
我们想对数据库进行操作,最初我们的想法就是写一个Entity基类,然后由子类继承
class Entity
# 提供访问器
attr_accessor :table,:id
def initialize table,id
@table = table
@id = ...
查找算法的演化过程
查找算法的演化过程顺序查找 字面意思,一个个节点查找判断,对数据条件没什么要求,最简单,也最慢。
/**
* 顺序查找
* @param arr 数组
* @param target 目标值
* @return 下标
*/
public static int getIndex(int[] arr, int target) {
// 记录比较多少次找到目标值
int index = 0;
for (int i = 0; i < arr.length; i++) {
index++;
if (arr[i] == target) {
System.out.println("顺序查找次数:" + index);
return i;
}
}
return -1;
}
二分查找 如果我们能让数据有序,我们先找中间数,如果目标值大于中间数,则从中位数往 ...

