spring日记(三)

一、使用注解方式完成AOP

  1.加入jar文件(aspects不用加)

spring日记(三)

   2.创建一个切面类

@Aspect
@Component
public class LogAspect {
    /*。第一个*匹配的是通用访问修饰符
    。第二个 * 匹配的是所有方法
    。  .. 匹配所有参数
    也可执行实现类中的方法  * com.zhiyou100.cyf.aspect.PeopleInt.*(..)
    */
    @Before(value="execution(* com.zhiyou100.cyf.aspect.People.*(..))")
    public void before(JoinPoint joinPoint) {
        String name=joinPoint.getSignature().getName();
        System.out.println("执行"+name+"方法");
    }
    @After(value="execution(* com.zhiyou100.cyf.aspect.LogAspect.*(..))")
    public void after(JoinPoint joinPoint) {
        String name=joinPoint.getSignature().getName();
        System.out.println("方法"+name+"结束");
    }
}

  3.在配置文件中开启注解

<context:component-scan base-package="com.zhiyou100.cyf.aspect"></context:component-scan>
    <!-- 开启切面注解 -->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

  4.测试。(需要加入切面的类必须拥有接口,这里只能用接口声明?)

public class Test {
    public static void main(String[] args) {
        ApplicationContext app=new ClassPathXmlApplicationContext("app.xml");
        //。这里只能用接口声明
        PeopleInt p=(PeopleInt) app.getBean("people");
        p.show();
    }
}

before和after注解分别表示方法调用前调用此方法,方法调用结束,但尚未返回时调用此方法。

AfterReturning注解可获得返回值

AfterThrowing注解捕获异常

@AfterReturning(value="execution(* com.zhiyou100.cyf.aspect.LogAspect.*(..))",returning="result")//returning必须与参数名相同
    public void returning(Object result) {
        System.out.println("返回值为"+result);
    }
    @AfterThrowing(value="execution(* com.zhiyou100.cyf.aspect.LogAspect.*(..))",throwing="e")
    public void exception(Exception e) {
        System.out.println("发生异常"+e.getMessage());
    }

二、使用xml方式完成AOP

<!-- 。定义被通知的程序类 -->
    <bean id="peopleImp" class="com.zhiyou100.cyf.aop.PeopleImp"></bean>
    <!-- 。定义切面类 -->
    <bean id="logAspect" class="com.zhiyou100.cyf.aop.LogAspect"></bean>
    <!--。 配置切面 -->
    <aop:config>
        <!-- 。定义表达式切点 -->
        <aop:pointcut expression="execution(* com.zhiyou100.cyf.aop.PeopleImp.*(..))" id="pointcut"/>
        <!-- 。定义切面 -->
        <aop:aspect ref="logAspect">
         <!--。 定义前置通知 -->
            <aop:before method="before" pointcut-ref="pointcut"/>
            <aop:after method="after" pointcut-ref="pointcut"/>
            <aop:after-returning method="returning" pointcut-ref="pointcut" returning="result"/>
            <aop:after-throwing method="exception" pointcut-ref="pointcut" throwing="e"/>
        </aop:aspect>
    </aop:config>