2019-03面试准备之AOP(面向切面编程)、IOC(控制反转)、DI(依赖注入)

AOP是一种面向切面编程的思想,是对OOP(Object Orient Programming)的一种补充。利用AOP思想,我们可以将很多涉及多业务流程的功能抽取出来单独封装,形成独立的切面。比如我们需要在一些方法执行前后打印日志,我们只需要编写一个切面,通过XML或注解的方式将切面横切到指定的方法或类。其实Spring AOP底层采用的是动态代理,动态代理分为JDK动态代理和CGLIB动态代理,JDK动态代理是利用Proxy为目标对象生成动态代理,但是前提是目标对象必须要实现接口,原因是Proxy为目标对象生成的代理对象要继承Proxy类,而Java是单继承,所以这个时候就要从接口入手。CGLIB代理不强制要求目标对象必须实现接口,CGLIB代理底层采用字节码处理框架ASM,在程序运行时利用Enhancer为目标对象生成子类,并通过生成的子类去真正的调用方法。

动态代理与静态代理的区别:

  1. 静态代理在编译时就已经存在,编译后代理类是一个实际的class文件
  2. 动态代理是在运行时生成的,没有实际的class文件,而是通过字节码的形式加载到JVM中

IOC是控制反转,其实就是将对象的生命周期都交给Spring容器去做,我们需要什么对象向Spring容器要就可以,而不是我们手动去创建我们需要的对象。这样在一定程度上减少了我们的代码量,同时也降低了对象之间的耦合性。Spring通过DI(依赖注入)来实现动态的向某个类提供它所需的对象。依赖注入其实是通过反射技术(反射允许程序在运行时动态生成对象,执行对象的方式,更改对象的属性值)实现的。依赖注入有两种方式:setter方法注入,构造器注入。

@Autowired与@Resource都是用于装配bean的,一般用在属性上或setter方法上,@Autowired是Spring提供的,默认通过ByType的方式注入,如果想要通过ByName来装配,则需要同@Qualifier搭配使用。而@Resource属于javax.annotation包下,默认通过ByName的方式来装配bean,他具有两个属性:name,type。如果想要通过ByType的方式装配bean,那么就把type置为指定的类型。如果同时指定了name与type,Spring会在上下文中匹配type和name都符合的bean,如果匹配不到则抛出异常。

猜你喜欢

转载自blog.csdn.net/Peacock__/article/details/88170208