1.请解释IOC和AOP是什么。
答:①IOC:IOC,另外一种说法叫DI(Dependency Injection,依赖注入)。它并不是一种技术实现,而是一种设计思想。在任何一个有实际开发意义的项目中,我们会使用很多类来描述它们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变得异常难以维护和极度的高耦合。而IOC的出现正是用来解决这个问题的,我们通过IOC将这些相互依赖对象的创建、协调工作交给Spring容器去处理,每个对象只需要关注其自身的业务逻辑关系就可以了。在这样的角度上看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象的和文件资料)。
②AOP:面向切面编程,往往被定义为促使软件系统实现关注点的分离的技术。系统是由许多不同的组件所组成,每一个组件各负责一块特定功能。处理实现自身核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的核心服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为他们会跨越系统的多个组件。
③AOP相关术语:
a:通知:通知定义了切面是什么以及何时使用的概念,Spring切面可以应用5种类型的通知:
-a1:前置通知(Before):在目标方法被调用之前调用通知功能。
-a2:后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
-a3:返回通知(After-returning):在目标方法成功执行之后调用通知。
-a4:异常通知(After-throwing):在目标方法抛出异常后调用通知。
-a5:环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
b:连接点:是在应用执行过程中能够插入切面的一个点。
c:切点: 切点定义了切面在何处要织入的一个或者多个连接点。
d:切面:是通知和切点的结合。通知和切点共同定义了切面的全部内容。
e:引入:引入允许我们向现有类添加新方法或属性。
f:织入:是把切面应用到目标对象,并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期中有多个点可以进行织入:
-f1:编译期: 在目标类编译时,切面被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
-f2:类加载期:切面在目标加载到JVM时被织入。这种方式需要特殊的类加载器(class loader)它可以在目标类被引入应用之前增强该目标类的字节码。
-f3:运行期: 切面在应用运行到某个时刻时被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。SpringAOP就是以这种方式织入切面的。
2.请解释Spring支持的事务管理类型有哪些。
答:①Spring支持编程式事务管理和声明式事务管理。大多选择声明式事务管理,因为这种方式和应用程序的关联较少,因此更加符合轻量级容器的概念。声明式事务管理要优于编程式事务管理,尽管在灵活性方面它弱于编程式事务管理,因为编程式事务管理允许你听过代码控制业务。
②事务分为全局事务和局部事务。全局事务由应用服务器管理,需要底层服务器JTA支持(如WebLogic、WildFly等)。局部事务和底层采用的持久化方案有关,例如使用JDBC进行持久化时,需要使用Connection对象来操作事务;而采用Hibernate进行持久化时,需要使用Session对象来操作事务。
3.请解释AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、植入(Weaving)、切面(Aspect)这些概念。
答:①连接点(Joinpoint):程序执行的某个特定位置(如:某个方法调用前、调用后、方法抛出异常后)。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就连接点。Spring仅支持方法的连接点。
②切点(Pointcut):如果连接点相当于数据中的记录,那么切点相当于查询条件,一个切点可以匹配多个连接点。Spring AOP的规则解析引擎负责解析切点所设定的查询条件,找出对应的连接点。
③增强(Advice):增强是织入到目标类连接点上的一段程序代码。Spring提供的增强接口都是带方位名的,如:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。
④引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。这样,即使一个业务类原本没有实现某个接口,通过引介功能,可以动态地为该业务添加接口的实现逻辑。让业务类成为这个接口的实现类。
⑤织入(Weaving):织入是将增强添加到目标类具体连接点上的过程,AOP有三种织入方式:a编译期织入:需要特殊的Java编译期(例如AspectJ的ajc);b装载期织入:要求使用特殊的类加载器,在装载类的时候随类进行增强;c运行时织入:在运行时为目标类生成代理实现增强。Spring采用了动态代理的方式实现了运行时织入,而AspectJ采用了编辑期织入和装载期织入的方式。
⑥切面(Aspect):切面是由切点和增强(引介)组成的,它包括了对横切关注功能的定义,也包括了对连接点的定义。
4.请解释AOP的原理。
答:①AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。通常使用AspectJ的编译时增强实现AOP,AspectJ是静态代理的增强,所谓的静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。
②Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
③如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。