yingqin678 / learningmaterials Goto Github PK
View Code? Open in Web Editor NEW搜集的学习材料,以供回顾
搜集的学习材料,以供回顾
面试问题:一个10G的日志文件,内存只有1G,需要根据日期进行排序,并按天写入小文件中
算法:归并排序https://www.cnblogs.com/dingyingsi/p/3760447.html
浅谈Java并发编程系列(八)—— LockSupport原理剖析:https://segmentfault.com/a/1190000008420938
从一道简单的“SpringBoot配置文件”相关面试题,我就能知道你的水平:https://juejin.im/post/5c07ce306fb9a049f06a0c62?utm_source=gold_browser_extension
解释:https://baike.baidu.com/item/BOM/2790364
问题来源:intellij idea 2018.2.2 版本在右键菜单增加了remove BOM的操作,小主担心误操作搞出事情来,上网查了一下,只要不是php,即便误点了也没用问题
1.最常见的缓存工具:Redis
2.解决大容量下,Redis性能不佳问题:360开源的pika:https://www.w3cschool.cn/pika/pika-yel222nz.html
1.hashMap哪些场景会导致线程不安全:https://www.cnblogs.com/qiumingcheng/p/5259892.html
JVM 类加载机制详解:http://www.importnew.com/25295.html
JVM(四)—一道面试题搞懂JVM类加载机制:https://blog.csdn.net/noaman_wgs/article/details/74489549
1.hashMap,hashTable,concurrentHashMap,treeMap:hashMap 1.7之前通过数组+链表实现,1.8之后通过数组+(链表/红黑树) hashMap与treeMap对比:https://juejin.im/post/5bf7c6a16fb9a04a0604839c?utm_source=gold_browser_extension
先说说自己的理解,学习设计模式也分三个层次
1.不知设计模式,平时写代码过程中不知不觉使用了
2.初识设计模式,写代码时尽量套用
3.熟练掌握设计模式,写代码时根据需要运用,不需要套用,可以熟练的在不同场景使用,有时可以嵌套使用。
23种设计模式,场景的基本在前面的工厂方法模式,单例模式,建造者模式,适配器,观察者模式这些,其他模式在写逻辑较为复杂的系统时可能会用到。
来源链接文章说明比较详细,建议先阅读几遍,做到这些常用的模式可以根据名字可以知其内容
举例:
1.工厂模式:slf4j中LogFactory使用的就是工厂模式
2.单例模式:需要在其他实例初始化前进行初始化的类,或起到对系统有初始化作用的类,经常使用单例模式进行初始化,例如springbean的init方法中需要调用其他对象进行初始化,可以考虑使用单例模式。
3.建造者模式:elasticsearch客户端使用建造者模式构造查询条件,原因是elasticsearch的查询条件可以灵活拼接,使用建造者模式可以在不同的步骤构造不同的查询条件。
4.适配器模式:使用场景很多,基本开源框架中都有,不再举例(小主平时看的源码不够多,记不得哪个有了)
5.观察者模式:zookeeper客户端可以监听zk节点内容变化;kafka的topic有新的event时,会通知consumer进行消费
小主做的项目架构和系统逻辑比较简单,没有用到太多的设计模式,所以此处只能举出这些了
cat /proc/${PID}/status: https://my.oschina.net/aiguozhe/blog/125477
现象:https://blog.csdn.net/kisssun0608/article/details/48289535
代码走读:https://www.jianshu.com/p/4b0a52f4be5c
1.更优雅地关闭资源 - try-with-resource及其异常抑制:https://www.cnblogs.com/itZhy/p/7636615.html
nginx相关:
gzip配置:https://blog.csdn.net/jessonlv/article/details/8016284
Maven
1.保证maven打包环境的一致性:Maven Wrapper:http://imushan.com/2017/10/18/java/maven/Maven-Wrapper%E4%BB%8B%E7%BB%8D/
部门只使用了spring最基础的controller/bean/mybatis能力,面试时被提问啥是aop,,好吧,刚入职时好像扫了一眼,从来没用过就不记得了
来源:https://www.cnblogs.com/hongwz/p/5764917.html
一.前言
在以前的项目中,很少去关注spring aop的具体实现与理论,只是简单了解了一下什么是aop具体怎么用,看到了一篇博文写得还不错,就转载来学习一下,博文地址:http://www.cnblogs.com/xrq730/p/4919025.html
AOP
AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。
AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段
Spring对AOP的支持
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB
AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1、定义普通业务组件
2、定义切入点,一个切入点可能横切多个业务组件
3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。
下面给出一个Spring AOP的.xml文件模板,名字叫做aop.xml,之后的内容都在aop.xml上进行扩展:
复制代码
复制代码 基于Spring的AOP简单实现注意一下,在讲解之前,说明一点:使用Spring AOP,要成功运行起代码,只用Spring提供给开发者的jar包是不够的,请额外上网下载两个jar包:
1、aopalliance.jar
2、aspectjweaver.jar
开始讲解用Spring AOP的XML实现方式,先定义一个接口:
public interface HelloWorld
{
void printHelloWorld();
void doPrint();
}
定义两个接口实现类:
复制代码
public class HelloWorldImpl1 implements HelloWorld
{
public void printHelloWorld()
{
System.out.println("Enter HelloWorldImpl1.printHelloWorld()");
}
public void doPrint()
{
System.out.println("Enter HelloWorldImpl1.doPrint()");
return ;
}
}
复制代码
复制代码
public class HelloWorldImpl2 implements HelloWorld
{
public void printHelloWorld()
{
System.out.println("Enter HelloWorldImpl2.printHelloWorld()");
}
public void doPrint()
{
System.out.println("Enter HelloWorldImpl2.doPrint()");
return ;
}
}
复制代码
横切关注点,这里是打印时间:
复制代码
public class TimeHandler
{
public void printTime()
{
System.out.println("CurrentTime = " + System.currentTimeMillis());
}
}
复制代码
有这三个类就可以实现一个简单的Spring AOP了,看一下aop.xml的配置:
复制代码
<bean id="helloWorldImpl1" class="com.xrq.aop.HelloWorldImpl1" />
<bean id="helloWorldImpl2" class="com.xrq.aop.HelloWorldImpl2" />
<bean id="timeHandler" class="com.xrq.aop.TimeHandler" />
<aop:config>
<aop:aspect id="time" ref="timeHandler">
<aop:pointcut id="addAllMethod" expression="execution(* com.xrq.aop.HelloWorld.*(..))" />
<aop:before method="printTime" pointcut-ref="addAllMethod" />
<aop:after method="printTime" pointcut-ref="addAllMethod" />
</aop:aspect>
</aop:config>
复制代码
public static void main(String[] args)
{
ApplicationContext ctx =
new ClassPathXmlApplicationContext("aop.xml");
HelloWorld hw1 = (HelloWorld)ctx.getBean("helloWorldImpl1");
HelloWorld hw2 = (HelloWorld)ctx.getBean("helloWorldImpl2");
hw1.printHelloWorld();
System.out.println();
hw1.doPrint();
System.out.println();
hw2.printHelloWorld();
System.out.println();
hw2.doPrint();
}
复制代码
运行结果为:
复制代码
CurrentTime = 1446129611993
Enter HelloWorldImpl1.printHelloWorld()
CurrentTime = 1446129611993
CurrentTime = 1446129611994
Enter HelloWorldImpl1.doPrint()
CurrentTime = 1446129611994
CurrentTime = 1446129611994
Enter HelloWorldImpl2.printHelloWorld()
CurrentTime = 1446129611994
CurrentTime = 1446129611994
Enter HelloWorldImpl2.doPrint()
CurrentTime = 1446129611994
复制代码
看到给HelloWorld接口的两个实现类的所有方法都加上了代理,代理内容就是打印时间
基于Spring的AOP使用其他细节
1、增加一个横切关注点,打印日志,Java类为:
复制代码
public class LogHandler
{
public void LogBefore()
{
System.out.println("Log before method");
}
public void LogAfter()
{
System.out.println("Log after method");
}
}
复制代码
复制代码
<bean id="helloWorldImpl1" class="com.xrq.aop.HelloWorldImpl1" />
<bean id="helloWorldImpl2" class="com.xrq.aop.HelloWorldImpl2" />
<bean id="timeHandler" class="com.xrq.aop.TimeHandler" />
<bean id="logHandler" class="com.xrq.aop.LogHandler" />
<aop:config>
<aop:aspect id="time" ref="timeHandler" order="1">
<aop:pointcut id="addTime" expression="execution(* com.xrq.aop.HelloWorld.*(..))" />
<aop:before method="printTime" pointcut-ref="addTime" />
<aop:after method="printTime" pointcut-ref="addTime" />
</aop:aspect>
<aop:aspect id="log" ref="logHandler" order="2">
<aop:pointcut id="printLog" expression="execution(* com.xrq.aop.HelloWorld.*(..))" />
<aop:before method="LogBefore" pointcut-ref="printLog" />
<aop:after method="LogAfter" pointcut-ref="printLog" />
</aop:aspect>
</aop:config>
复制代码
CurrentTime = 1446130273734
Log before method
Enter HelloWorldImpl1.printHelloWorld()
Log after method
CurrentTime = 1446130273735
CurrentTime = 1446130273736
Log before method
Enter HelloWorldImpl1.doPrint()
Log after method
CurrentTime = 1446130273736
CurrentTime = 1446130273736
Log before method
Enter HelloWorldImpl2.printHelloWorld()
Log after method
CurrentTime = 1446130273736
CurrentTime = 1446130273737
Log before method
Enter HelloWorldImpl2.doPrint()
Log after method
CurrentTime = 1446130273737
复制代码
要想让logHandler在timeHandler前使用有两个办法:
(1)aspect里面有一个order属性,order属性的数字就是横切关注点的顺序
(2)把logHandler定义在timeHandler前面,Spring默认以aspect的定义顺序作为织入顺序
2、我只想织入接口中的某些方法
修改一下pointcut的expression就好了:
复制代码
<bean id="helloWorldImpl1" class="com.xrq.aop.HelloWorldImpl1" />
<bean id="helloWorldImpl2" class="com.xrq.aop.HelloWorldImpl2" />
<bean id="timeHandler" class="com.xrq.aop.TimeHandler" />
<bean id="logHandler" class="com.xrq.aop.LogHandler" />
<aop:config>
<aop:aspect id="time" ref="timeHandler" order="1">
<aop:pointcut id="addTime" expression="execution(* com.xrq.aop.HelloWorld.print*(..))" />
<aop:before method="printTime" pointcut-ref="addTime" />
<aop:after method="printTime" pointcut-ref="addTime" />
</aop:aspect>
<aop:aspect id="log" ref="logHandler" order="2">
<aop:pointcut id="printLog" expression="execution(* com.xrq.aop.HelloWorld.do*(..))" />
<aop:before method="LogBefore" pointcut-ref="printLog" />
<aop:after method="LogAfter" pointcut-ref="printLog" />
</aop:aspect>
</aop:config>
3、强制使用CGLIB生成代理
前面说过Spring使用动态代理或是CGLIB生成代理是有规则的,高版本的Spring会自动选择是使用动态代理还是CGLIB生成代理内容,当然我们也可以强制使用CGLIB生成代理,那就是aop:config里面有一个"proxy-target-class"属性,这个属性值如果被设置为true,那么基于类的代理将起作用,如果proxy-target-class被设置为false或者这个属性被省略,那么基于接口的代理将起作用
1.比较老的一个工具:greys https://www.cnblogs.com/zhaoxinshanwei/p/9139827.html
2.刚开源的一个工具:arthas https://github.com/alibaba/arthas
1.#! /usr/bin/env:https://blog.csdn.net/iamzhangzhuping/article/details/50425754
1.导入多个项目,并标记为java工程 ,使用module进行导入:https://blog.csdn.net/huweijian5/article/details/78260692
2.自动清除无效import:https://blog.csdn.net/saywhat_sayhello/article/details/80236638
1.8大happen-before原则:https://www.jianshu.com/p/1508eedba54d
2.《java并发编程实战》之java内存模型:https://www.jianshu.com/p/47f999a7c280
RASP相关的技术实现和产品介绍:https://www.freebuf.com/column/160567.html
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.