Spring的AOP面向切面编程(2)

@Component //加入IOC容器 @Aspect // 指定当前类为切面类 public class Aop { // 指定切入点表达式: 拦截哪些方法; 即为哪些类生成代理对象
  //解释
@Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))")   //@Pointcut("execution(* 切入点表达式固定写法, cn.itcast.e_aop_anno表示包.类名(可以用*表示包下所有的类).方法名(可以用*表示类下所有的方法)(..)表示参数可以用.. @Pointcut("execution(* cn.itcast.e_aop_anno.*.*(..))") public void pointCut_(){ }
  //@Before("execution(* cn.itcast.e_aop_anno.*.*(..))")每个方法需要写相同的引用,所以将相同的部分抽取到一个空的方法中pointCut_(),
// 前置通知 : 在执行目标方法之前执行 @Before("pointCut_()") public void begin(){ System.out.println("开始事务/异常"); } // 后置/最终通知:在执行目标方法之后执行 【无论是否出现异常最终都会执行】 @After("pointCut_()") public void after(){ System.out.println("提交事务/关闭"); } // 返回后通知: 在调用目标方法结束后执行 【出现异常不执行】 @AfterReturning("pointCut_()") public void afterReturning() { System.out.println("afterReturning()"); } // 异常通知: 当目标方法执行异常时候执行此关注点代码 @AfterThrowing("pointCut_()") public void afterThrowing(){ System.out.println("afterThrowing()"); } // 环绕通知:环绕目标方式执行 @Around("pointCut_()") public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println("环绕前...."); pjp.proceed(); // 执行目标方法 System.out.println("环绕后...."); } }

接口

// 接口 public interface IUserDao { void save(); }

4、目标对象类一:实现接口

/** * 目标对象 */ @Component // 加入容器 public class UserDao implements IUserDao{ @Override public void save() { System.out.println("-----核心业务:保存!!!------"); } }

目标对象类二:没有实现接口

/** * 目标对象*/ @Component // 加入容器 @Scope("prototype") public class OrderDao{ public void save() { System.out.println("-----核心业务:保存!!!------"); } }

测试类

public class App { ApplicationContext ac = new ClassPathXmlApplicationContext("cn/itcast/e_aop_anno/bean.xml"); // 目标对象有实现接口,spring会自动选择“JDK代理” @Test public void testApp() { IUserDao userDao = (IUserDao) ac.getBean("userDao"); System.out.println(userDao.getClass());//$Proxy001 userDao.save(); } // 目标对象没有实现接口, spring会用“cglib代理” @Test public void testCglib() { OrderDao orderDao = (OrderDao) ac.getBean("orderDao"); System.out.println(orderDao.getClass()); orderDao.save(); }

输出结果:

    开始事务/异常

    -----核心业务:保存!!!------

    提交事务/关闭

XML方式实现AOP编程 

Xml实现aop编程:

1) 引入jar文件  【aop 相关jar, 4个】

2) 引入aop名称空间

3)aop 配置

* 配置切面类 (重复执行代码形成的类)

* aop配置

拦截哪些方法 / 拦截到方法后应用通知代码

代码示例:

bean.xml配置

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/374f235a6753448e67ce60869bfc0137.html