使用注解创建通知
前面讲了创建通知,现在用注解来创建通知
具体案例分析
public interface Service {
/**去公司*/
public void goCompany();
/**签到*/
public void signIn();
/**请假*/
public void leave(Exception ex);
/**回家*/
public void goHome();
}
@Aspect//@Aspect是声明切面
public class ServiceImpl implements Service{
/**
* 第一个* 代表方法的返回值
* 第二个work()代表的是方法的名称
* */
//前置通知
@Before("execution(* work())")
public void goCompany() {System.out.println("去公司。。。");}
//前置通知
@Before("execution(* EmpServiceImpl.*(..))")
public void signIn() {
System.out.println("签到");
}
/**
* 第一个*代表的是方法的返回值
* 第二个cn.csdn.service.Emp* 位于cn.csdn.service包中前缀是Emp的所有类
* 第三个Emp*.后的*代表的是这个类中的所有方法
* 第四个(..)代表的是方法的参数可以是可变的参数
* */
//后置通知
@After("execution(* cn.csdn.service.Emp*.*(..))")
public void goHome() {
System.out.println("回家。。。");
}
//异常通知
@AfterThrowing(pointcut="execution(* *..EmpService*.*(..))",throwing="ex")
public void leave(Exception ex) {
System.out.println("请假"+ex.getMessage());
}
}
public interface EmpService {
void work();
}
public class EmpServiceImpl implements EmpService{
@Override
public void work() {
System.out.println("员工正在工作。。。。");
}
}
public interface AroundService {
public Object eat(ProceedingJoinPoint pj);
}
//环绕通知切面的具体实现
@Aspect
public class AroundServiceImpl implements AroundService{
@Around("execution(* EmpService.*(..))")
public Object eat(ProceedingJoinPoint pj) {
System.out.println("吃完饭就去上班。。。");
try {
Object ob=pj.proceed();
// 注:proceed()方法会调用目标方法
System.out.println("工作后要签到的。。。");
return ob;
} catch (Throwable e) {
System.out.println("下班回家喽。。。");
e.printStackTrace();
}
return null;
}
}
public class App {
@Test
public void test(){
/*解析xml文件创建容器对象*/
ApplicationContext ac=new ClassPathXmlApplicationContext("app*.xml");
/*接口代理*/
EmpService empService=(EmpService)ac.getBean("empServiceImpl");
empService.work();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ">
<!—注意一定要配xmlns:aop="http://www.springframework.org/schema/aop"-->
<!-- aspectj的bean -->
<bean id="serviceImpl" class="cn.csdn.service.ServiceImpl"/>
<!-- 环绕通知的切面的具体实现的bean -->
<bean id="aroundServiceImpl" class="cn.csdn.service.AroundServiceImpl"/>
<!-- 业务操作的bean -->
<bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl"/>
<!—注意:一定要启用Spring对@AspectJ的支持 -->
<aop:aspectj-autoproxy/>
</beans>