spring日记(三)
一、使用注解方式完成AOP
1.加入jar文件(aspects不用加)
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>