JAVA易忘的零碎知识

目录

spring最常用的7大类注解

spring框架中Bean的生命周期

进行类的初始化

枚举单例可以预防反射

IEDA快捷键

运行jar包

Telnet

关于Windows中的hosts文件

Linux

ab工具指令

docker基础命令

 docker中MySQL应用部署以及宿主容器之间的端口映射

docker中:容器->镜像;镜像->tar包;tar包->镜像 

接口和抽象类的区别

泛型

读取配置文件用哪些流?

关于git

maven阻止导入其他依赖

java8新特性,stream流编程.

3.关于使用redis可能出现的安全问题

生成公钥和私钥->使用openssl工具

使用RestTemplate对象发送带请求体和参数的请求

代理工厂(动态代理)

 对象序列化与反序列化及需进行序列化的类的模板

在当前项目导入其他module


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

        #说明
        #-alias:这对密钥的别名 
        #-keyalg:使用的hash算法 
        #-keypass:这对密钥的访问密码 
        #-keystore:密钥库文件名,xc.keystore保存了生成的证书 
        #-storepass:密钥库(文件)的访问密码 

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.

5.然后build一下,并添加SDK.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

唐吉柯德77

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值