目录
docker中:容器->镜像;镜像->tar包;tar包->镜像
spring最常用的7大类注解
spring框架中Bean的生命周期
进行类的初始化
类什么时候才被初始化: 1.创建类的实例,2.访问类或接口的静态变量,调用类的静态方法 3.反射,4.初始化一个类的子类(会首先初始化子类的父类)
类初始化顺序:父类(静态变量、静态代码块)–>子类(静态变量、静态代码块)–>父类(变量、代码块)–> 父类构造器–>子类(变量、初始化块)–>子类构造器。注意:静态代码和静态变量同级,变量和代码块同级。谁在前先执行谁。类只会初始化一次。
初始化顺序:构造方法Constructor->@Autowired->@PostConstruct
方法一
使用@PostConstruct注解完成初始化
@Component
public class UserController {
@Autowired
private UserService userService;
public UserController() {
}
// 初始化方法
@PostConstruct
public void init(){
userService.userServiceInit();
}
}
方法二
实现InitializingBean接口
@Component
public class UserController implements InitializingBean {
@Autowired
private UserService userService;
public UserController() {
}
// 初始化方法
@Override
public void afterPropertiesSet() throws Exception {
userService.userServiceInit();
}
}
枚举单例可以预防反射
println()方法里边如果传入的是一个char类型的数组,则会对该数组进行遍历输出.
IEDA快捷键
ctrl+o ->指定重写某个方法 ctrl+d ->复制光标所在行 或 复制选择内容,并把复制内容插入光标位置下面 ctrl+p ->查看方法需要传入哪些参数 ctrl+f ->当前类查找关键词 ctrl+r ->当前类查找关键词并替换掉 ctrl+e ->显示最近打开的类 ctrl+u ->前往当前光标所在的方法的父类的方法 ctrl+alt+l ->格式化代码 ctrl+shift+u ->对选中的代码进行大 / 小写轮流转换 ctrl+alt+m ->抽离选中的代码到新方法中 ctrl+shift+enter ->自动结束代码,行末自动添加分号 F2 ->跳转到下一个高亮错误 或 警告位置 ctrl+alt+b ->光标放在接口名上,使用快捷键可以跳转到该接口的实现类上. ctrl+i ->重写方法. |
运行jar包
java -jar aa.jar
Telnet
作用:使用本机命令窗口查看虚拟机的某个应用对应的端口号是否能ping通. 步骤:找到电脑的程序和功能->启动或关闭Windows功能->找到Telnet,然后一直下一步下一步. 怎么使用:进入cmd命令行输入-> telnet linux的ip地址 目标应用对应的端口号 输入以上命令后回车,如果能发生页面跳转说明目标端口畅通. |
关于Windows中的hosts文件
hosts文件中,我们定义了一个减值对(127.0.0.1 api.gmall.com),它有什么用? 答:相当于本地DNS域名解析,当我们使用浏览器访问api.gmall.com的时候,浏览器会检查本计算机中是否有地 址域名的映射,如果有则相当于我们在访问127.0.0.1这个ip地址,那我们访问www.baidu.com的时候是由谁来 帮我们进行解析的?当我们使用浏览器对www.baidu.com进行访问的时候,我们首先会去访问 114.114.114.114或者8.8.8.8,把我们访问的地址www.baidu.com发给这两个服务器其中一个,服务器拿到该 地址后会进行本地hosts文件检查,查阅该地址对应的ip地址是哪一个,找到之后返给我们,然后我们拿着服务 器返给我们的ip地址就行访问. |
Linux
rpm -qa | grep 软件名 ->查看是否安装了某个软件 /关键字 ->在linux的文本中进行快速查找 cp 源文件 目标目录 ->文件拷贝到指定目录 ps -ef ->显示进程 ps -ef | grep redis ->查看是否有redis进程 :set nu ->在Linux里边阅读文件时,使用该命令可以显示行号 |
ab工具指令
使用之前在Linux安装软件包: yum install httpd-tools
ab -c 100 -n 5000 http://192.168.200.1:8206/redis | 使用100个线程给指定url发送5000次请求 |
docker基础命令
docker中MySQL应用部署以及宿主容器之间的端口映射
docker中:容器->镜像;镜像->tar包;tar包->镜像
接口和抽象类的区别
1.相同点: a.都是抽象类型 b.都可以有实现方法(接口支持默认方法和静态方法,抽象类支持所有方法) c.多可以不需要实现类或继承者去实现所有方法. 2.不同点: a.抽象类不支持多继承,接口支持多继承 b.接口中的变量默认是public static final型,且必须给定初值,所以实现类中不能重新定义,也不能改变其值; 抽象类中的变量默认是default型,其值可以在子类中重新定义,也可以重新赋值. |
雪花算法->用于大数据下作分表(表分区)
1.我们把雪花算法生成的id换算成二进制的话是一串由好几部分组成的0101 第一部分(1位bit):符号位,代表正负号; 第二部分(41位):时间戳的二进制; 第三部分(10位):生成这个id所使用的进程号(与机器相关,所以也叫机器id); 第四部分(12位):序列号,也叫生成这条数据所用的流水号; 分表演化:主键自增->hash(id与表的张数取余)->雪花算法. |
关于最大值
1.MySQL-> a.MySQL本身没有对最大记录数进行限制,阿里巴巴的java开发手册中提出单表行数超过500万行或者单表容量超过2GB,则推荐进行分库分表; b.单个索引最多支持16个字段; c. |
泛型
public class 类名<E>{} ->含有泛型的类 public interface 接口名<E>{} ->含有泛型的接口 public <E> void method(E e){} ->含有泛型的非静态接口 public void method(E e){} ->含有泛型的非静态接口,此方法的第一个是应为定义类时已写泛型 public static void method(List<?> list){} ->此处?为泛型通配符,因为集合有很多种,当我们不知道要传入哪一类 集合时可以这样写 public static void getElement(Collection<? extexds Number> collection){} ->泛型接收Number的本类或子类 public static void getElement(Collection<? super Number> collection){} ->泛型接收Number的本类或父类 public static <E> getInstance(Class<E> cla){} ->传参时传入Class对象 |
读取配置文件用哪些流?
byte[] bytes = new byte[in.available()] ->此处in为输入流对象,创建一个数组,可以起到输入流对象in拿到多大字节数据就开辟多大的空间
InputStream User.class.getClassLoader().getResourceAsStream("db.properties") | 使用类加载器获取输入流 |
Inputstream Resources.getResourceAsStream("SqlMapConfig.xml") | 和上边一样,也是获取输入流 |
ResourceBundle ResourceBundle.getBundle("db") | 专门用来读取properties配置文件的,然后使用ResourceBundle对象的方法getString(传入properties文件里对应的key即可拿到对应的value) |
ServletOutputStream outputStream = response.getOutputStream(); List<ExcelDictDTO> list = dictService.exportData(); EasyExcel.write(outputStream, ExcelDictDTO.class).sheet("数据字典表").doWrite(list); | 导出Excel文件时使用HttpServletResponse获取了输出流 |
关于git
1.如果代码交给了git管理,我们想要删除文件的时候应该使用git的命令去删除,如果直接在idea中去删除,只是删除了本地文件夹里边的文件,而git上边的文件(代码)并没有删除. |
maven阻止导入其他依赖
java8新特性,stream流编程.
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9);
// 获取对应的平方数
numbers.stream().distinct().filter(p -> p > 2).limit(5).skip(2).map( (i) -> {
return i*i;
}).sorted().collect(Collectors.toList()).forEach(p -> System.out.println(p));
System.out.println("=================================================================================");
List<Integer> numbers1 = Arrays.asList(1,2,3,4,5,6,7,8,9);
// 获取对应的平方数
numbers1.parallelStream().distinct().filter(p -> p > 2).limit(5).skip(2).map( (i) -> {
return i*i;
}).sorted().collect(Collectors.toList()).forEach(p -> System.out.println(p));
}
//结果打印
25
36
49
=================================================================================
25
36
49
3.关于使用redis可能出现的安全问题
1 缓存击穿 指缓存中的热点key,在高并发时,热点失效,导致一瞬间db的压力增大 通过对热点key的过期时间设置,预防key的过期 可以在redis中设置一些备份key. 2 缓存雪崩 和java服务器雪崩有区别 缓存redis雪崩,指在高并发时,缓存中的key集体过期 可以通过设置不同key过期时间,防止集体”罢工”,防止缓存崩溃. 3 缓存穿透 故意利用数据库中不存在的特殊key,绕过redis直接打击db行为 设置一个带有过期时间的假key,在一段时间内,禁止再次访问db. |
生成公钥和私钥->使用openssl工具
1.安装openssl并配置环境变量; 2.在装了jdk和配了环境变量的情况下,在任何不包含中文空格下划线的路径下执行以下命令-> keytool -genkeypair -alias atguigu -keyalg RSA -keypass atguigu -keystore atguigu.jks -storepass atguigu #说明 3.导出公钥-> 在刚刚生成的atguigu.jks文件所在目录下执行cmd命令: keytool -list -rfc --keystore atguigu.jks | openssl x509 -inform pem -pubkey即可拿到公钥 |
关于单元测试
Junit
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> |
Jupiter->自带启动器插件
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> |
使用RestTemplate对象发送带请求体和参数的请求
//service是实现类方法
@Override
public AuthToken login(String username, String password) {
//通过应用名动态获取ip和端口号
ServiceInstance instance = loadBalancerClient.choose("service-oauth");
String ipAndPort = instance.getUri().toString();
//像固定地址发送post请求,传递5个参数
String url = ipAndPort + "/oauth/token";
//请求头初始化!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
MultiValueMap<String,String> headers = new HttpHeaders();
headers.set("Authorization", getHeadParam());
//请求体初始化!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
HttpHeaders body = new HttpHeaders();
body.set("grant_type", "password");
body.set("username", username);
body.set("password", password);
//对象用于存储请求参数
HttpEntity httpEntity = new HttpEntity(body, headers);
/**
* 第一参数:请求的url地址
* 第二参数:请求的方式(枚举)
* 第三参数:请求参数
* 第四参数:返回值类型(即我们请求的地址会给我们返回数据,我们使用什么类型去接收)
*/
ResponseEntity<Map> responseEntity =
restTemplate.exchange(url, HttpMethod.POST, httpEntity, Map.class);
}
/**
* 拼接请求头中需要的信息
* @return
*/
private String getHeadParam() {
String clientIdAndPwd = "weibo:" + "atguigu";
return "Basic" + " " + new String(Base64.getEncoder().encode(clientIdAndPwd.getBytes()));
}
代理工厂(动态代理)
对象序列化与反序列化及需进行序列化的类的模板
在当前项目导入其他module
1. 2. 3. 4 5.然后build一下,并添加SDK. |