Java岗大厂面试百日冲刺 - 日积月累,每日三题,尚硅谷Java全套百度云

/前五个都一样/

  1. afterReturning

/*************************************************/




**`有`异常情况下:**



/不同Advice的执行顺序****/

  1. around before advice

  2. before advice

  3. target method (执行代码段)

  4. around after advice

  5. after advice

/前五个都一样/

  1. afterThrowing:异常发生

  2. java.lang.RuntimeException: 异常发生

/*************************************************/




* * *



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629174709174.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MzkwNTQ1,size_16,color_FFFFFF,t_70#pic_center)



被群友一致认为的济南泉城广场🙃🙃。。。坐标:**深圳**



作者:`對你何止一句钟意` (航拍)



* * *



[](https://gitee.com/vip204888/java-p7)面试题2:AspectJ AOP 和 Spring AOP 有什么区别?

===================================================================================================



AOP实现的关键在于`代理模式`,AOP代理主要分为`静态代理`和`动态代理`。



*   静态代理的代表为AspectJ;

*   动态代理则以Spring AOP为代表;



Spring AOP和AspectJ有不同的目标。



*   Spring AOP旨在通过Spring IoC提供一个简单的AOP实现,以解决编码人员面临的最常出现的问题。这并不是完整的AOP解决方案,`它只能用于Spring容器管理的beans`。

    

*   另一方面,AspectJ是最原始的AOP实现技术,提供了玩这个的AOP解决方案。AspectJ更为健壮,相对于Spring AOP也显得更为复杂。值得注意的是,AspectJ能够被应用于所有的领域对象。

    



`从原理上看:`



**Spring AOP**



1.  基于动态代理来实现,默认如果使用接口的,用JDK提供的动态代理实现,如果是方法则使用CGLIB实现

    

2.  Spring AOP需要依赖IOC容器来管理,并且只能作用于Spring容器,使用纯Java代码实现

    

3.  在性能上,由于Spring AOP是基于动态代理来实现的,在容器启动时需要生成代理实例,在方法调用上也会增加栈的深度,使得Spring AOP的性能不如AspectJ的那么好

    



**AspectJ**



AspectJ属于静态代理(织入),通过修改代码来实现,有如下几个织入的时机:



1.  `编译期织入`(Compile-time weaving): 如类 A 使用 AspectJ 添加了一个属性,类 B 引用了它,这个场景就需要编译期的时候就进行织入,否则没法编译类 B。

    

2.  `编译后织入`(Post-compile weaving): 也就是已经生成了 .class 文件,或已经打成 jar 包了,这种情况我们需要增强处理的话,就要用到编译后织入。

    

3.  `类加载后织入`(Load-time weaving): 指的是在加载类的时候进行织入,要实现这个时期的织入,有几种常见的方法。1、自定义类加载器来干这个,这个应该是最容易想到的办法,在被织入类加载到 JVM 前去对它进行加载,这样就可以在加载的时候定义行为了。2、在 JVM 启动的时候指定 AspectJ 提供的 agent:-javaagent:xxx/xxx/aspectjweaver.jar。

    



  AspectJ可以做Spring AOP干不了的事情,它是AOP编程的完全解决方案,Spring AOP则致力于解决企业级开发中最普遍的AOP(方法织入)。而不是成为像AspectJ一样的AOP方案。



  因为AspectJ在实际运行之前就完成了织入,所以说它生成的类是没有额外运行时开销的



| 指标项 | Spring AOP | AspectJ |

| --- | --- | --- |

| 使用语言 | 在纯 Java 中实现 | 使用 Java 编程语言的扩展实现 |

| 是否需要编译 | 不需要单独的编译过程 | 除非设置 LTW,否则需要 AspectJ 编译器 (ajc) |

| 织入方式 | 只能使用运行时织入 | 运行时织入不可用。支持编译时、编译后和加载时织入 |

| 织入能力 | 功能不强-仅支持方法级编织 | 更强大 – 可以编织字段、方法、构造函数、静态初始值设定项、最终类/方法等……。 |

| 适用范围 | 只能在由 Spring 容器管理的 bean 上实现 | 可以在所有域对象上实现 |

| 切入点要求 | 仅支持方法执行切入点 | 支持所有切入点 |

| 代理局限 | 代理是由目标对象创建的, 并且切面应用在这些代理上 | 在执行应用程序之前 (在运行时) 前, 各方面直接在代码中进行织入 |

| 性能 | 比 AspectJ 慢很多 | 更好的性能 |

| 复杂度 | 易于学习和应用 | 相对于 Spring AOP 来说更复杂 |



[](https://gitee.com/vip204888/java-p7)追问1:了解JDK动态代理和CGLIB动态代理的原理么?他俩有哪些区别?

---------------------------------------------------------------------------------------------------



  Spring AOP中的动态代理主要有两种方式,`JDK动态代理`和`CGLIB动态代理`:



> `JDK动态代理`:是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用 InvokeHandler 来处理,他有一个限制,就是`它只能为接口创建代理实例,那么对于没有通过接口定义业务方法的类`,就要用`CGLIB动态代理`了。  

> `CGLIB(Code Generation Library)动态代理`:是一个基于ASM的字节码生成库,它允许我们在运行时对字节码进行修改和动态生成。CGLIB通过继承方式实现代理,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。



`JDK动态代理具体实现原理:`



*   通过实现InvocationHandler接口创建自己的调用处理器;

*   通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理;

*   通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型;

*   通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入;



  JDK动态代理是面向接口的代理模式,如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生产被代理接口的新的匿名实现类,重写了其中AOP的增强方法。



`CGLib动态代理:`



  利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。



> 1.  如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP;

> 2.  如果目标对象实现了接口,可以强制使用CGLIB实现AOP;

> 3.  如果目标对象`没有实现了接口`,`必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换`;



3、两者对比:



*   JDK动态代理是`面向接口的`。

*   CGLib动态代理是通过字节码底层继承要代理类来实现(`对指定的类生成一个子类,覆盖其中的方法`),因此如果被代理类被final关键字所修饰,会失败。



* * *



![在这里插入图片描述](https://img-blog.csdnimg.cn/20210629174829454.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MzkwNTQ1,size_16,color_FFFFFF,t_70#pic_center)



开阔!!坐标:**深圳**。。。



作者:`對你何止一句钟意` (航拍)



* * *



[](https://gitee.com/vip204888/java-p7)面试题3:什么是基于Java的Spring注解配置? 给一些注解的例子

==================================================================================================



  基于Java的配置,允许你在少量的Java注解的帮助下进行大部分Spring配置,而非通过XML文件。当然,也不不建议啥都用注解配置,毕竟如果修改就要动class文件很麻烦。因此建议:`不会修改、极少修改的用注解,会修改的用xml配置,如AOP的配置我就用XML,因为这个需要改的场景比较多。`



  以`@Configuration 注解`为例,它用来标记类可以当做一个bean的定义,被Spring IOC容器使用。另一个是通过`@Bean注解`,它表示此方法将要返回一个对象,作为一个bean注册进Spring应用上下文。



@Configuration

public class StudentConfig {

@Bean

public StudentBean myStudent() {

    return new StudentBean();

} 



`怎样开启注解装配呢?`



  注解装配在默认情况下是不开启的,为了使用注解装配,我们必须在Spring配置文件中配置 `<context:annotation-config/>`元素。



**一些常见的注解:**



`1、@Component`:



  这将 java 类标记为 bean。它是任何 Spring 管理组件的通用构造型。spring 的组件扫描机制现在可以将其拾取并将其拉入应用程序环境中。



`2、@Controller`:



  这将一个类标记为 Spring Web MVC 控制器。标有它的 Bean 会自动导入到 IoC 容器中。



3、`@Service`:



  此注解是组件注解的特化。它不会对 @Component 注解提供任何其他行为。我们可以在服务层类中使用 @Service 而不是 @Component,因为它以更好的方式指定了意图。



`4、@Repository`:



  这个注解是具有类似用途和功能的 @Component 注解的特化。它为 DAO 提供了额外的好处。它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。



`5、@Required` :



  这个注解表明bean的属性必须在配置的时候设置,通过一个bean定义的显式的属性值或通过自动装配,若@Required注解的bean属性未被设置,容器将抛出`BeanInitializationException`。



示例:



public class Employee {

private String name;

@Required

public void setName(String name){

    this.name=name;

}

public string getName(){

    return name;

}

}




`6、@Autowired` :



  @Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。`@Autowired 注解提供了更细粒度的控制,包括在何处以及如何完成自动装配`。它的用法和@Required一样,修饰setter方法、构造器、属性或者具有任意名称和/或多个参数的PN方法。



public class Employee {

private String name;

@Autowired

public void setName(String name) {

    this.name=name;

}

public string getName(){

    return name;

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再免费分享一波我的Java面试真题+视频学习详解+技能进阶书籍

点击这里即可免费获取以上我收集整理的全部学习资料

Autowired

public void setName(String name) {

    this.name=name;

}

public string getName(){

    return name;

最后

对于很多Java工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。

整理的这些资料希望对Java开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。

再免费分享一波我的Java面试真题+视频学习详解+技能进阶书籍

点击这里即可免费获取以上我收集整理的全部学习资料

美团二面惜败,我的凉经复盘(附学习笔记+面试整理+进阶书籍)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值