🏠个人主页:阿空12138
🧑个人简介:大家好,我是阿空,一个想要与大家共同进步的男人😉
😉目前状况🎉:目前大三,在找工作👏👏
💕欢迎大家:这里是优快云,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘
前言
2023年6月29日,我来到了江西农业大学在北京与企业(传习教育)合作开办的实训基地并开始了长达三个月的坐牢生活,在奋起反抗和默默忍受之间苦苦挣扎,为了让自己平静下来,现立下flag,每天写日常总结,梳理每天学到的东西。
文章目录
6月29日 天气晴 28~37℃
1.每日一道算法题
解题思路 层次遍历 每次while循环遍历第i层元素
public int findBottomLeftValue(TreeNode root) {
// todo 层序遍历 用一个map 储存 k,v (key= 高度 , value= 第几个)
Queue<TreeNode> queue=new ArrayDeque<>();
queue.add(root);
int b=0;
while (!queue.isEmpty()){
int size = queue.size();
Integer a=null;
for (int i = 0; i < size; i++) {
TreeNode currentNode = queue.poll();
//todo
if (a==null) a=currentNode.val;
if (currentNode.left!=null){
queue.add(currentNode.left);
}
if (currentNode.right!=null){
queue.add(currentNode.right);
}
}
b=a;
}
return b;
}
2.每日一道面试题
今天学习到的面试题是
Q:Aop的实现原理?
A:Spring AOP(Aspect-Oriented Programming)实现原理主要是基于动态代理技术。
Spring AOP基于代理模式和反射机制实现了AOP功能。它使用了JDK动态代理和CGLIB动态代理两种方式来生成代理对象。
当目标对象实现了接口时,Spring AOP会使用JDK动态代理来生成代理对象。JDK动态代理是Java提供的一种基于接口的代理技术。它通过在运行时创建一个实现目标对象接口的代理对象,并将目标对象的方法调用转发到代理对象进行处理。通过动态代理,Spring AOP能够在目标对象的方法执行前、执行后或异常抛出时插入横切逻辑。
示例代码
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 定义接口
interface Hello {
void sayHello();
}
// 实现InvocationHandler接口
class MyInvocationHandler implements InvocationHandler {
private Object target;
public MyInvocationHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before Hello");
Object result = method.invoke(target, args);
System.out.println("After Hello");
return result;
}
}
// 创建目标对象
class HelloImpl implements Hello {
@Override
public void sayHello() {
System.out.println("Hello, World!");
}
}
public class Main {
public static void main(String[] args) {
// 创建目标对象
Hello hello = new HelloImpl();
// 创建 InvocationHandler 对象
InvocationHandler handler = new MyInvocationHandler(hello);
// 创建代理对象
Hello proxy = (Hello) Proxy.newProxyInstance(
hello.getClass().getClassLoader(),
hello.getClass().getInterfaces(),
handler);
// 调用代理对象的方法
proxy.sayHello();
}
}
当目标对象没有实现接口时,Spring AOP会使用CGLIB动态代理来生成代理对象。CGLIB(Code Generation Library)是一个功能强大的字节码生成库,它通过生成目标对象的子类来实现代理。CGLIB动态代理可以直接代理目标对象的类而不需要接口,通过继承父类的方式来实现方法重写以插入横切逻辑。
总结
提示:这里对文章进行总结:
以上就是今天要讲的内容,今天是第一天到基地,用老师的话来说就是条件很艰难,八人寝好兄弟轮流洗澡 满头大汗,坐了一天车了有点累,抽空学了一会,今天就到这了