Spring-AOP学习笔记

本文介绍Spring AOP(面向切面编程)的基本概念,包括切面、连接点、通知、切入点、目标对象及代理等,并展示了如何通过配置文件实现方法的前置、后置拦截以及围绕方法的拦截。

Spring AOP【面向切面编程 】

将分散的功能块集中放到一个地方-切面

声明式的定义在何时何地使用这些功能

  • ==切面(Aspect)==:要实现的交叉的非核心业务功能
  • 连接点(Joinpoint):应用程序执行过程中插入切面的地点,可以是方法调用,异常抛出

  • ==通知(Advice)==:通知切面的实际实现代码(抽出来的切面代码)

  • 切入点(Pointcut):定义通知应用在哪些连接点,就是一组连接点的集合;(控制哪些方法需要被通知,默认情况是每个方法都切入)

  • ==目标对象(Target)==:被通知的对象,代理模式中的真实对象;

  • ==代理(Proxy)==:将通知应用到目标对象之后,创建的对象

  • 织入(Weaving):将切面应用到目标对象,从而创建一个新的代理对象的过程

业务实现类也是对象
在使用时创建业务对象,通过getBean即可
采用切面,拦截业务核心,采用代理模式

代理模式;
代理对象帮真实对象做事,一般代理对象比真实对象专业,但是代理对象没有真实对象所拥有的某种实体(例如租房业务,中介没有房子,只有房东才有房子,但是中介可以找到更多的租客来租房)
代理对象帮真实对象调用方法,然后加上包装上自己的特长来更好的使用,辅助,加工这个方法;
真实的对象方法一般业务逻辑更少,所以交给更专业的代理来做更多的业务
代理对象和真实对象都实现同一个接口

Spring通知(advice)

  • 方法包围拦截(在方法执行前后分别拦截):该拦截器实现了MethodInterceptor接口;注意:==只要有该拦截器存在,此包围器连其他通知的 方法执行前后的拦截器也一起包围了,意思说,先执行该拦截器的前置拦截,再执行单纯的前置拦截, 方法执行后,先执行单纯的后置拦截,再执行本拦截==
  • 方法执行前拦截:实现了MethodBeforeAdvice接口,直接写要做的方法即可:
  • 方法执行后拦截:实现了AfterReturningAdvice,在方法执行完毕并且返回之后 调用本方法

配置如下:

     <!-- 目标对象 -->
     <bean id="petService"  class="com.wang.service.PetServiceImpl">
     </bean>

     <!-- 方法包围拦截器,实现了 MethodInterceptor 接口 -->
     <bean id="exeTimeAdvice" class="com.wang.service.advice.ServiceExecuteTime">
     </bean>


     <!-- 方法前置拦截器 实现了 MethodBeforeAdvice 接口-->
     <bean id="beforeExecute" class="com.wang.service.advice.ExecuteBeforeAdvice">
     </bean>


        <!-- 方法后置拦截器 实现了 AfterReturningAdvice 接口-->
     <bean id="afterExecute" class="com.wang.service.advice.AfterMethodAdvice">
     </bean>

     <!-- 静态切入点 -->
     <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
         <property name="mappedNames">
         <list>
         <value>切入的方法名,可以使用*来通配,例如get*,所有get方法都执行要切入的通知</value>
         </list>
         </property>

     <!--该参数的名 advice是固定的,该参数用于切入时需要运行的通知(拦截器) -->
        <property name="advice" ref="要执行的通知的id">
        </property>
     </bean>


     <!-- 代理对象 -->
     <bean id="serviceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">


        <!-- 目标对象,需要拦截包装的目标对象,一般为普通业务实现类?-->
        <property name="target" ref="petService"></property>
        <!--interceptorNames参数名固定的,是ProxyFactoryBean类固定调用 -->
        <property name="interceptorNames">

            <list><!--列表里面value代表要使用并且已经配置的的拦截器的id (这个其实是一个Object[],list也代表数组)-->

                <value>exeTimeAdvice</value>
                <value>beforeExecute</value>
                <value>afterExecute</value>
                <value>假如要使用切入点,在此添加切入点id即可,但假如切入点有绑定以上通知,那么以上通知就不用再在这里设置,直接设置一个切入点即可</value>
            </list>
        </property>

     </bean>

自动创建代理

<!-- 目标对象 -->
    <bean id="userDao" class="com.wang.dao.impl.UserDaoHibernateImpl">
    </bean>


    <!-- 事务通知 -->
    <bean id="txAdvice" class="com.wang.dao.TransactionAdvice">
    </bean>

    <!-- 自动创建proxy -->

    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>*Dao</value>
            </list>
        </property>

        <property name="interceptorNames">
            <list>
                <value>txAdvice</value>
            </list>
        </property>
    </bean>

    在取的时候

    BeanFactory bf = new ClassPathXmlApplicationContext("springAopCfg.xml");
        IUserDao dao = (IUserDao) bf.getBean("userDao");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值