(-)注解方式实现AOP拦截
1. 定义业务接口以及具体实现
a. 接口省略
b. 业务实现
package cn.itcast.service.Impl;
import cn.itcast.service.PersonService;
/**
* spring 通过注解方式完成 aop 编程
* @author Administrator
*
*/
public class PersonServiceBean implements PersonService{
public String getPersonName(Integer personid) {
System.out.println("我是getPersonName()方法");
return "xxxx";
}
public void save(String name) {
throw new RuntimeException("我爱例外通知");
// System.out.println("我是save()方法");
}
public void update(String name, String id) {
System.out.println("我是update()方法");
}
}
2.定义一个切面类实现切面编程:
package cn.itcast.service;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.After;
//声明切面这样MyInterceptor就会被容器检测到 那么如何将一个类交给容器管理有2种方式
//一种在 xml 里定义bean MyInterceptor 另一种是 自动扫描注解的方式 在类前加 @Component 同时在配置文件中设置自动哦扫表的配置
@Aspect
public class MyInterceptor {
//声明切入点 定义要拦截的方法 自左向右 第一个*表示返回值的类型 + 要拦截的类所在的包绝对路径 + .*<表示对此类中所有的方法进行拦截> +(..)<表示参数>
//整句话的意识当要执行到PersonServiceBean类中的所有方法将被拦截到
@Pointcut("execution (* cn.itcast.service.Impl.PersonServiceBean.*(..))")
//声明一个切入点anyMethod()表示切入点的名称,
private void anyMethod(){ }
//表示先执行doAccessCheck完此方法此啊可以执行anyMethod()方法
@Before("anyMethod()") // 前置通知表示在拦截业务PersonServiceBean中方法之前执行的如下 ,意思先打印出前置通知,然后在执行业务bean中的方法
public void doAccessCheck(){
System.out.println("前置通知");
}
@AfterReturning("anyMethod()")
public void doAfterReturning(){
System.out.println("后置通知");
}
@After("anyMethod()")
public void doafter(){
System.out.println("最终通知");
}
@AfterThrowing("anyMethod()")
public void afterThrowing(){
System.out.println("例外通知");
}
@Around("anyMethod()") //环绕通知
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
//if(){用户是否有权限
System.out.println("进入方法");
Object resulet = pjp.proceed();
System.out.println("退出方法");
// }
return resulet;
}
}
3 . 将切面通过spring 容器加载具体配置如下
xmlns:xsi=""
xmlns:context=""
xmlns:aop=""
xsi:schemaLocation="
">
4. 写一个junit4 类
public class AOPTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@Test public void proxyTest(){
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
PersonService service = (PersonService)ctx.getBean("personService");
service.save("hehe");
}
}
5.说明
如上述:
在beans.xml配置文件中打如下,这样就支持注解,支持aop编程啦:
( 注解本身不能干活,需要处理器去处理;)启动对Aspect注解的支持(蓝色部分);
1.切入点?什么是切入点就,我们要对业务bean中的那些方法进行拦截;
2.通知?对拦截到的方法,我们要做的工作。
(2) 基于XML完成aop拦截
业务方法及实现不变;
a. 但是切面类有所改变,如:
package cn.itcast.service;
import org.aspectj.lang.ProceedingJoinPoint;
/**
* 基于XML方式实现AOP切面编程
* @author Administrator
*/
public class MyInterceptorofXML {
// private void anyMethod(){ };
public void doAccessCheck(){
System.out.println("前置通知");
}
public void doAfterReturning(){
System.out.println("后置通知");
}
public void doafter(){
System.out.println("最终通知");
}
public void afterThrowing(){
System.out.println("例外通知");
}
public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable{
//if(){用户是否有权限
System.out.println("进入方法");
Object resulet = pjp.proceed();
System.out.println("退出方法");
// }
return resulet;
}
}
b.spring 容器 beans1.xml
xmlns:xsi=""
xmlns:context=""
xmlns:aop=""
xsi:schemaLocation="
">
:说明
如果
expression="execution(* cn.itcast.service.Impl.PersonServiceBean.*(..))" />
这里 第一 * 代表返回值,如果拦截的方法返回是String 那么侧 将 * 改为 java.lang.String
那么拦截的业务方法只能拦截到 getName方法;
如果(..)表示2个参数,可以用 类似在 .. 之前加上传入参数的类型比如 Java.lang.String
想要彻底学习可以参看 spring2.5 视频20课
阅读(3649) | 评论(0) | 转发(0) |