2024/03/16----面试中遇到的一些面试题

时间:2024-03-19 15:38:05

1.请简单的说一下IOC,AOP

1.1 IOC

  • 控制反转(IOC)是一种设计思想,就是将原本在程序中需要手动创建对象,现在交由Spring管理创建,从而降低代码之间的耦合度。

IoC 最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,简称 DI)。

DI(Dependecy Inject,依赖注入)是实现控制反转的一种设计模式,依赖注入就是将实例变量传入到一个对象中去。

1.2 AOP

  • AOP:Aspect oriented programming 面向切面编程,AOP 是 OOP(面向对象编程)的一种延续。

比如业务A和业务B现在需要一个相同的操作,传统方法我们可能需要在A、B中都加入相关操作代码,而应用AOP就可以只写一遍代码,A、B共用这段代码。并且,当A、B需要增加新的操作时,可以在不改动原代码的情况下,灵活添加新的业务逻辑实现。

这样便于减少系统的重复代码,降低模块间的耦合度。

常用到AOP的就是安全校验、日志操作、事务操作等,给你先定义好,然后在想用的地方用。

1.3 静态代理和动态代理

代理的三要素
a、有共同的行为(结婚) - 接口

b、目标角色(新人) - 实现行为----委托类

c、代理角色(婚庆公司) - 实现行为 增强目标对象行为----代理类
  • 静态代理:由程序员创建或工具生成代理类的源码,再编译代理类。
    所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

  • 动态代理:动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件。代理类和委托类的关系是在程序运行时确定。

静态代理的特点

1、目标角色固定

2、在应用程序执行前就得到目标角色

3、代理对象会增强目标对象的行为

动态代理的特点

  • 目标对象不固定
  • 在应用程序执行时动态创建目标对象
  • 代理对象会增强目标对象的行为

1.5动态代理的两种实现方式:

  1. JDK 动态代理

  2. CGLIB动态代理

JDK代理与CGLIB代理的区别

1、JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理。

2、cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。

JDK动态代理实现接口,Cglib动态代理继承思想
JDK动态代理(目标对象存在接口时)执行效率高于Ciglib
如果目标对象有接口实现,选择JDK代理,如果没有接口实现选择Cglib代理

1.6 反射

反射(Reflection)是Java程序在运行时,可以获取任何一个已知名称的类的内部信息,包括其修饰符、构造方法、属性、父类、接口、方法等信息,并能动态调用类的任意方法和操作类的任意属性这种动态获取类的信息以及动态调用对象方法的功能称为Java语言的反射机制。

本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。
通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

2.Spring中用到了哪些设计模式?

  • 工厂设计模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
  • 代理设计模式 : Spring AOP 功能的实现。
  • 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  • 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  • 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  • 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  • 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
    原文链接