Spring的IOC和AOP

原创
2019/04/11 16:18
阅读数 71

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

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

 

 

面向切面编程(AOP)

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

 

 

动态代理和静态代理

 

静态代理:

一个实现类要被调用时,可以先通过代理类管理委托类,客户端直接调用代理类就行了。

优点:

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

 

缺点:

  1. 委托类若是增加了方法,代理类同样要增加相应的方法,增加了大量的重复代码
  2. 若是为多个类实现代理,则需要创建多个代理类,增加了冗余

 

 

动态代理:

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

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

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

 

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

 

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

 

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

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部