spring aop增强类型

  1. Spring按照通知advice在目标类方法的连接点位置,可以分为5类:

    • 前置通知 MethodBeforeAdvice
    • 后置通知 AfterReturnAdvice
    • 环绕通知 MethodInterceptor
    • 异常抛出通知 ThrowAdvice 在方法抛出异常后实施增强
    • 引介通知: 在目标类中添加一些新的方法和属性(不用了解)

      spring aop切面类型

      图片说明

      Advisor切面案例

  2. 编写StudentDao类和StudentDaoImpl的实现类

  3. 编写studentDao的增强类,继承MethodBeforeAdvice :

    public class MyBeforeAdvice implements MethodBeforeAdvice {
      @Override
      public void before(Method method, Object[] args, Object target) throws Throwable {
          System.out.println("前置增强=====================");
      }
    }
  4. 编写applicationContext.xml

    <!--配置目标类-->
      <bean id="studentDao" class="com.imooc.aop.demo2.StudentDaoImpl"/>
    
      <!--前置通知类型-->
      <bean id="myBeforeAdvice" class="com.imooc.aop.demo2.MyBeforeAdvice"/>
      <!--Spring的AOP 产生代理对象-->
      <bean id="studentDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
          <!--配置目标类-->
          <property name="target" ref="studentDao"/>
          <!--实现的接口类-->
          <property name="proxyInterfaces" value="com.imooc.aop.demo2.StudentDao"/>
          <!--采用拦截的名称-->
          <property name="interceptorNames" value="myBeforeAdvice"/>
      </bean>
  5. 编写测试类,spring整合Junit开发测试

  • spring整合Junit开发测试,免去了classpathxmlApplicationContext和getBean

  • 主要是在类上添加Runwith和ContextConfiguration标签

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class SpringDemo2 {
    
      @Resource(name = "studentDaoProxy")
      private StudentDao studentDao;
    
      @Test
      public void demo1() {
          studentDao.delete();
          studentDao.find();
          studentDao.save();
          studentDao.update();
      }
    }

  • 切面常用的标签
    图片说明
    图片说明

PointcutAdvisor切点切面

  • 使用普通advice作为切面,将对目标类所有方法进行拦截,不够灵活,在实际开发中常采用带有切点切面

  • 常用PointcutAdvisor实现类

    • DefaultPointcutAdvisor 最常用的切面类型,他可以通过任意Pointcut和Advice组合定义切面

    • JdkRegexpMethodPointcut 构造正则表达式切点 (重点)

 <!--目标类-->
    <bean id="customDao" class="com.imooc.aop.demo3.CustomDao"/>
    <!--通知-->
    <bean id="myAroundAdvice" class="com.imooc.aop.demo3.MyAroundAdvice"/>
    <!--一般的切面试使用通知作为切面的,因为要对目标类的摸个方法进行增强就需要配置一个带有切入点的切面-->
    <bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
        <!--pattern 中配置正则表达式:.任意字符 *任意次数-->
        <property name="pattern" value=".*"/>
        <property name="advice" ref="myAroundAdvice"/>
    </bean>
    <!--配置产生代理-->
    <bean id="customDaoProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="target" ref="customDao"/>
        <property name="proxyTargetClass" value="true"/>
        <property name="interceptorNames" value="myAdvisor"/>
    </bean>

自动创建代理

图片说明
图片说明

图片说明