Spring aop注解方式和xml配置方式

本文内容纲要:Spring aop注解方式和xml配置方式

  1. 需要加入jar包

cglib.jar aspectjweaver.jar aspectjrt.jar aopalliance-1.0.jar

2.aop理解

  1. 注解方式

(1). 接口BusinessService

package com.cn.service;

public interface BusinessService {

public void save(String name);

public void update(String name, Integer id);

public String getName(Integer id);

}

(2).类BusinessServiceImpl实现BusinessService接口

package com.cn.service;

public class BusinessServiceImpl implements BusinessService{

public String getName(Integer id) {

// TODO Auto-generated method stub

System.out.println("我是save()方法");

return "myname";

}

public void save(String name) {

// TODO Auto-generated method stub

System.out.println("我是save()方法");

}

public void update(String name, Integer id) {

// TODO Auto-generated method stub

System.out.println("我是update()方法");

}

}

(3).定义面向切面的类MyInterceptor

package com.cn.service;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

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;

@Aspect

public class MyInterceptor {

@Pointcut("execution(* com.cn.service.*.save*(..))")

         //第一个* 说明方法的类型

         //第二个* 说明包下的所有的类 如果是包下类和自包中的类* com.cn..*.save*(..))

         //(..)方法中的参数

private void anyMethod() {

}// 定义一个切入点

@Pointcut("execution(* com.cn.service.*.update*(..))")

private void doMethod() {

}// 定义一个切入点

@Before("anyMethod()&&args(name)")

public void doAccessCheck(String name) {

System.out.println(name);

System.out.println("前置通知");

}

/* @AfterReturning("anyMethod()") */

@AfterReturning("anyMethod()")

public void doAfter() {

System.out.println("后置通知");

}

@After("anyMethod()")

public void after() {

System.out.println("最终通知");

}

@AfterThrowing("anyMethod()")

public void doAfterThrow() {

System.out.println("例外通知");

}

@Around("anyMethod()")

public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {

System.out.println("进入环绕通知");

Object object = pjp.proceed();// 执行该方法

System.out.println("退出方法");

return object;

}

@Around("doMethod()")

public Object doBasic(ProceedingJoinPoint pjp) throws Throwable {

System.out.println("进入环绕通知...");

Object object = pjp.proceed();// 执行该方法

System.out.println("退出方法...");

return object;

}

}

(4).测试类

package com.cn.service;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AopTest {

public static void main(String args[]) {

ApplicationContext ctx = new ClassPathXmlApplicationContext(

"applicationContext.xml");

BusinessService service = (BusinessService) ctx.getBean("service");

service.save("555");

service.update("123", 589);

}

}

运行结果:

555

前置通知

进入环绕通知

我是save()方法

后置通知

退出方法

最终通知

进入环绕通知...

我是update()方法

退出方法...

3.xml方式

<?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:p="http://www.springframework.org/schema/p"

xmlns:aop="http://www.springframework.org/schema/aop"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop.xsd">

<aop:config>

<aop:aspect id="TestAspect" ref="myInterceptor">

<aop:pointcut id="servicem" expression="execution(* com.cn.service.BusinessService.*(..))" />

<aop:before pointcut-ref="servicem" method="doAccessCheck"/>

<aop:after pointcut-ref="servicem" method="after"/>

<aop:around pointcut-ref="servicem" method="doBasicProfiling"/>

<aop:after-throwing pointcut-ref="servicem" method="doAfterThrow" throwing="ex"/>

</aop:aspect>

</aop:config>

<bean id="myInterceptor" class="com.cn.service.MyInterceptor"/>

<bean id="service"    class="com.cn.service.BusinessServiceImpl"></bean>

</beans>

package com.cn.service;

import org.aspectj.lang.JoinPoint;

import org.aspectj.lang.ProceedingJoinPoint;

import org.aspectj.lang.annotation.After;

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;

public class MyInterceptor {

public void doAccessCheck(JoinPoint jp) {

//System.out.println(jp.getTarget().getClass().getName());

System.out.println("前置通知");

}

/* @AfterReturning("anyMethod()") */

public void doAfter(JoinPoint jp) {

System.out.println("后置通知");

}

public void after(JoinPoint jp) {

System.out.println("最终通知");

}

public void doAfterThrow(JoinPoint jp,Throwable ex) {

System.out.println("例外通知");

}

public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {

System.out.println("进入环绕通知");

Object object = pjp.proceed();// 执行该方法

System.out.println("退出方法");

return object;

}

public Object doBasic(ProceedingJoinPoint pjp) throws Throwable {

System.out.println("进入环绕通知...");

Object object = pjp.proceed();// 执行该方法

System.out.println("退出方法...");

return object;

}

}

本文内容总结:Spring aop注解方式和xml配置方式

原文链接:https://www.cnblogs.com/jiaokaige/p/3467567.html

以上是 Spring aop注解方式和xml配置方式 的全部内容, 来源链接: utcz.com/z/296903.html

回到顶部