Spring中的AOP配置

Spring中的AOP配置

  • 步骤

    1. 导包4+2+2

      • 4个核心包+2个日志包
      • 在其他的依赖包spring-framework-3.0.2.RELEASE-dependencies中找到
      • 路径:spring-framework-3.0.2.RELEASE-dependencies\org.aopalliance\com.springsource.org.aopalliance\1.0.0\com.springsource.org.aopalliance-1.0.0.jarcom.springsource.org.aopalliance-1.0.0.jar
      • 路径:spring-framework-3.0.2.RELEASE-dependencies\org.aspectj\com.springsource.org.aspectj.weaver\1.6.8.RELEASE\com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jarcom.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
    2. 导入约束

      • spring-aop-4.3.xsd
    3. 书写通知类
    4. 书写配置文件

通知类

/**
 * 通知类
 */
public class MyAdvice {
    /**
     * 前置通知
     */
    public void before(){
        System.out.println("前置通知");
    }

    /**
     * 后置对象(如果出现异常不会调用)
     */
    public void afterReturning(){
        System.out.println("后置对象(如果出现异常不会调用)");
    }

    /**
     * 环绕通知
     * @return 
     * @throws Throwable 
     */
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("环绕通知前");
        Object proceed = pjp.proceed();
        System.out.println("环绕通知后");
        return proceed;
    }

    /**
     * 异常通知
     */
    public void afterException(){
        System.out.println("异常通知");
    }

    /**
     * 后置通知(出现异常也会调用)
     * 也可以叫始终通知 或者最终通知
     */
    public void after(){
        System.out.println("后置通知(出现异常也会调用)");
    }
}

配置文件

  • 步骤
    1. 把配置类放进容器
    2. 使用 aop:config 声明aop配置
    3. 使用 aop:pointcut 配置切入点表达式
    4. 使用 aop:aspect 配置切面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd ">


    <!-- 配置真实对象 -->
    <bean id="userServiceImpl" class="com.service.impl.UserServiceImpl"></bean>

    <!-- 配置通知对象 -->
    <bean id="MyDivce" class="com.aop.MyAdvice"></bean>

    <!-- 配置对象 -->
    <aop:config>
        <!-- 描述通知 -->
        <aop:pointcut expression="execution(* com.service.impl.UserServiceImpl.*(..))" id="pc"/>
        <aop:aspect ref="MyDivce">
            <!-- 前置通知 -->
            <aop:before method="before" pointcut-ref="pc"/>
            <!-- 后置通知(如果出现异常不调用) -->
            <aop:after-returning method="afterReturning" pointcut-ref="pc"/>
            <!-- 环绕通知 -->
            <aop:around method="around" pointcut-ref="pc"/>
            <!-- 异常通知 -->
            <aop:after-throwing method="afterException" pointcut-ref="pc"/>
            <!-- (始终)后置通知(出现异常也会调用) -->
            <aop:after method="after" pointcut-ref="pc"/>
        </aop:aspect>
    </aop:config>

</beans>

真实对象

public class UserServiceImpl implements IUserService{

    @Override
    public void save() {
        System.out.println("保存客户");
    }

    @Override
    public void delete() {
        System.out.println("删除客户");
    }

    @Override
    public void update() {
        System.out.println("更新客户");
    }

    @Override
    public void find() {
        System.out.println("查找客户");
    }
}

测试

/**
* 使用Spring结合的Junit
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class TestDemo {

    /**
    * 注入值给接口,是接口!! 因为是动态代理原理
    */
    @Resource(name="userServiceImpl")
    private IUserService userService;

    /**
    * 测试
    */
    @Test
    public void test1(){
        userService.save();
    }
}

猜你喜欢

转载自blog.csdn.net/kato_op/article/details/80247403