zoukankan      html  css  js  c++  java
  • Sping IOC

    这2天学习了Spring的AOP  其中包括注解式和非注解式的配置  个人感觉注解式的配置非常好用。具体内容如下:

    1.    AOP 面向切面编程

      个人理解就是在一个写好的方法上增加一些新的功能  主要有权限管理,缓存,日志,错误处理,性能优化,事务处理

    其中有几个基本概念:

    1.切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。       ------  相当于一个类

    2.连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。----客户端调用的方法

    3.通知(Advice):在切面的某个特定的连接点上执行的动作。  ----切面中的方法

     

    3.切入点(Pointcut):匹配连接点的断言。

    就是一种判断规则,如果满足了判断则会执行切面中的通知。

    如果没有满足规则,程序不能执行通知方法

    4.目标对象(Target Object): 被一个或者多个切面所通知的对象。--------被代理者

    配置切面的主要如下

    <!-- 切面的对象 -->
    <bean id="txAspect" class="aspect.TxAspect"></bean>

    <!-- 配置切面 -->
    <aop:config>
    <!-- within(包名,类名)    execution可以具体到方法上 -->
    <!-- <aop:pointcut expression="within(Service.Impl.UserServiceImpl)" id="pc"/> -->
    <aop:pointcut expression="execution(* Service..*.*(..))" id="pc"/>
    <!--  几个主要的通知-->
    <aop:aspect ref="txAspect">
    <!-- <aop:around method="around" pointcut-ref="pc"/>
    <aop:after method="after" pointcut-ref="pc"/> -->
    <aop:after-returning method="afterReturn" pointcut-ref="pc" returning="msg"/>
    <!-- 配置通知 -->
    <!-- <aop:before method="before" pointcut-ref="pc"/> -->
    <!-- 异常通知 参数必须和接收参数一致 joinPoint必须放在前面-->
    <!-- <aop:after-throwing method="afterThrow" pointcut-ref="pc" throwing="throwable"/> -->
    </aop:aspect>

    </aop:config>

    通知的类型

    1.环绕通知

    在目标方法执行之前,执行之后都要执行

     

    2.前置通知(Before advice)

    在目标方法执行之前执行

     

    3.后置通知(After returning advice)

    在目标方法执行之后执行

     

    4.异常通知(After throwing advice)

    目标方法执行后抛出异常才执行

     

    5.最终通知(After (finally) advice)

    在目标方法执行之后 都会执行的通知

    说明:

    5大通知类型中,环绕通知功能最为强大,因为环绕通知,可以控制目标方法是否执行。

    以后可以使用环绕通知做 权限控制,事务控制,日志收集和处理,

    检测程序的执行性能(时间)

    切入点表达式的写法

    粒度:按类匹配   粗粒度

    1.within表达式

    Within(包名.类名)     within(service.UserServiceImpl)  匹配UserServiceImpl的全部操作

    within(service.*) 

    匹配service包下一级子类

    within(service..*)

    匹配service包下的所有的子孙类

    2.

    Execution(返回值类型 包名.类名.方法名(参数列表))

    AOP的调用原理

    1.当spring容器解析到AOP标签时,开启启动AOP的相关配置

    2.当解析到切入点表达式时,该表达式会进入spring内存中保留

    3.当解析到切面类时,首先会为切面创建对象。并且根据切入点表达式,和通知的匹配关系进行绑定。

     

    4.如果从容器中获取对象时,如果该对象与切入点表达式中的规则匹配。

    则会为其创建代理对象,如果该类实现了接口,则会为其创建JDK的代理,如果该类没有实现接口,则会采用cglib进行代理。代理对象创建完成后,交给用户使用。

     

    5.当代理对象执行方法时,则会执行与切入点表达式绑定的通知方法。

     

    在程序中做异常的收集,可以实时监控那些java代码报错,方便后期维护。

    /能够接收异常信息 获取当前方法
    //如果添加JoinPoint参数,则必须位于第一位
    public void afterThrow(JoinPoint joinPoint,Throwable throwable){
    System.out.println("获取异常信息:"+throwable.getMessage());
    System.out.println("获取异常类型:"+throwable.getClass());

    System.out.println("当前执行的方法为:"+joinPoint.getSignature().getName());
    System.out.println("我是一个异常通知");
    }

    配置切面如下:

    <!--切面的对象 -->
    <bean id="myAspect" class="aspect.MyAspect"></bean>

    <!--配置切面 -->
    <aop:config>
    <aop:pointcut expression="execution(* service..*.*(..))" id="pc"/>

    <aop:aspect ref="myAspect">

    <aop:after-throwing method="afterThrow"
    pointcut-ref="pc" throwing="throwable"/>

    </aop:aspect>
    </aop:config>

    后置通知介绍:

    作用:

    获取目标方法执行后的返回值结果,并且进行记录时需要使用后置通知。

     

    环绕通知的规范

    环绕通知中必须添加返回值,否则程序执行获取不到结果。

    如果有多个环绕通知,则或先执行下一个通知,如果没有下一个通知,则会执行目标方法

    其结构是一种嵌套关系

    AOP的注解形式

    切面配置的要素:

    1.切入点表达式

    2.切面对象

    3.通知

     

    1.开启前面注解

    注解的使用

    注解中切入点的写法

    1.将切入点写入通知内部

    @Before(value="execution(* service..*.*(..))")

    缺点:如果该切入点需要重复使用,则必须重复写多次

     

    2.自定义方法编辑切入点

    @Pointcut(value="execution(* service..*.*(..))")

    public void pointcut(){}

     

    优点:

    1.可以实现切入点表达式的复用

    2.方便表达式管理

     注解中通知的用法:

    如何获取方法的注解:

    案例:

    权限控制,如果该方法上添加了@privilege注解,则需要进行权限控制.

    思路:

    1.通过反射调用获取方法注解

    2.通过切入点表达式获取

    方法:

    1.自定义注解

    2.注解的获取


     

    权限控制例题

    1.用户应该有自己的权限列表,内部保存用户的全部权限

    2.当方法执行时需要权限时会与用户列表进行匹配如果满足权限。

    方法才能执行如果不满足权限,方法则不能执行

  • 相关阅读:
    CnSharp代码生成器。
    C#后台调用前台javascript的五种方法
    winfrom如何做一个语法着色控件
    Delphi AdvStringGrid表格保存和TClientDataSet发生关系的构想。
    Oracle 修改数据库字段的类型的语句
    structs 标签库(html)(转帖)
    Android Unable to resolve target 'android8'
    Android SDL_app: emulatorarm.exe 应用程序错误
    如何MyEclipse中显示WEBINF文件夹下的classes目录以及目录中的class文件
    Android conversion to dalvik format failed with error 1的解决办法
  • 原文地址:https://www.cnblogs.com/zcg1051980588/p/7564994.html
Copyright © 2011-2022 走看看