厚土伯尼

导航

Spring 基础知识(一)基本概念 DI、IOC、AOP

  • DI(依赖注入) 和IOC(控制反转)都是一种设计思想,要理解他们,让我们从coding中的一些痛点入手。
    • 依赖注入 Dependency Injection :

如果A类要使用B类的一个方法,首先必须拥有B类的实例的引用,其次,在调用B类方法时,引用必须被B类的实例赋值,否则空指针。对于面对对象的java语言来说,这一场景,是极具备普遍性,的重复劳动。

所以Spring根据配置(或注解)帮我们把对象A、B、C....构造好,放到容器中,并基于配置的reference关系,帮我们完成大量的赋值操作。

早起版本采用xml配置,后面为了简化配置工作以及进一步解耦合,采用注解来定义关系。

    • 控制反转 Inversion of control:

有了依赖注入,控制反转就更好理解了。对A类中引用的其他类资源的初始化以及选择,由Spring框架帮助控制。

 

  • AOP(切面编程) 则是Spring框架服务端应用架构的一种设计和实现方案

要理解这个概念,还是要从设计的实际需求出发。当我们需要在某一些类型(某一层)的处理操作前做一些操作,又不破坏当前的代码调用链路(通常说业务代码无感知),那么就需要AOP了。例如,我们在service层常见的统一开启事务、权限过滤、加性能日志,比较经典的 ehcache 基于注解实现缓存也是一种切面。

  • AOP 开发和一些基本概念:
    • 切面(Aspect): 

       @Aspect //将spring的Component  (ComponentDemoAA)声明成一个切面

      @Component // 切面本身是个Sping bean

      public class ThisisAAspect(){...}

    • 切入点(Pointcut):在ComponentDemoAA中定义一个方法作为接入点

@Pointcut(value="execution(* com.AspectTest.service.personServerImpl.*(..))")

private void thisIsaPointCut(){}

    • 通知(Advice): 有多种类型

在ComponentDemoAA中定义若干个方法作为通知对象执行

 

@Around(value="thisIsaPointCut()")  // 环绕

private void doSomeThing1(){}

还可以是:

@Before(value="thisIsaPointCut()")  // 前置

@AfterThrowing(value="thisIsaPointCut()",throwing="ex")//异常处理

@After(value="thisIsaPointCut()")  // 后置

@AfterReturning(value="thisIsaPointCut()")  最终

    • @Order 标识切面的优先级,越小优先级越高
    • 织入(Weaving) 运行时,会通过动态代理将 切面织入调用链路
    • 动态代理  Spring 中可以配置使用 JDK动态代理 还是 CGLIB 动态代理
  •     xml中增加配置 <aop:aspectj-autoproxy></aop:aspectj-autoproxy

 

posted on 2017-12-21 20:11  厚土伯尼  阅读(139)  评论(0编辑  收藏  举报