Spring的IOC和AOP

控制反转和依赖注入(IOC)spring

Spring的IOC就是当调用者要使用被调用者时,spring容器会建立被调用者实例,无需调用者自行建立,而后进行依赖注入(@Autowired)编程

 

 

面向切面编程(AOP)spa

面向切面老是和面向对象编程(OOP)作比较的。面向切面(AOP)拦截是到方法级别的,面向对象编程拦截是到对象级别的。当咱们须要给分散的对象引入公共行为时候,通常采用切面思想,例如日志、例如统一异常返回。能够用@Aspect注解定义为类切面。@Pointcut注解定义切面须要切入的切点。写起来格式就是("execution(com.hikvision.product.controller)”)代理

 

 

动态代理和静态代理日志

 

静态代理:对象

一个实现类要被调用时,能够先经过代理类管理委托类,客户端直接调用代理类就好了。接口

优势:get

  1. 客户端调用是只须要调用代理类便可,无需调用委托类。这样的话,能够进行解耦
  2. 代理类是在编译期就加载进容器,调用效率高

 

缺点:it

  1. 委托类如果增长了方法,代理类一样要增长相应的方法,增长了大量的重复代码
  2. 如果为多个类实现代理,则须要建立多个代理类,增长了冗余

 

 

动态代理:io

动态代理是经过反射机制实现,最核心的接口是InvocationHandlerProxy

invocationHasndler接口的核心入参主要是Object proxy(被代理对象)、Method(被调用方法)、Object[] arg(调用方法入参)

Proxy类的核心入参主要是ClassLoader(类加载器)、interface(获得所有接口)、invocationHandler接口的子类实例

 

JDK动态代理只能必须代理接口(不支持抽象类),代理类都须要实现InvocationHandler接口,而且实现invoke方法

 

客户端调用时直接经过代理类logHandler.newProxyInstancenew targetObject

 

JDK动态代理的代理对象在建立时,须要使用业务实现类所实现的接口做为参数(由于在后面代理方法时须要根据接口内的方法名进行调用)。若是业务实现类是没有实现接口而是直接定义业务方法的话,就没法使用JDK动态代理了。而且,若是业务实现类中新增了接口中没有的方法,这些方法是没法被代理的(由于没法被调用)

相关文章
相关标签/搜索