欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA框架spring将通知织入目标对象

程序员文章站 2022-05-06 18:13:58
...

准备:

1导包,如图:

JAVA框架spring将通知织入目标对象

2准备目标对象:我们这里以一个service为例:

public class UserServiceImpl  {
	public void save() {
		System.out.println("保存");
		//int i = 1/0;
	}

	public void delete() {
		System.out.println("删除!");
	}

	public void update() {
		System.out.println("更新!");
	}

	public void find() {
		System.out.println("查找");
	}
}

3,准备通知,代码:

import org.aspectj.lang.ProceedingJoinPoint;
public class MyAdvice {
//前通知
	public void before(){
		System.out.println("这是提前通知");
	}
	//之后通知
	public void afterReturning(){
		System.out.println("之后通知");
	}
	//环绕通知
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("环绕前通知");
		Object proceed = pjp.proceed();
		System.out.println("环绕后通知!");
		return proceed;
	}
	//异常通知
	public void afterException(){
		System.out.println("异常通知");
	}
	//之后通知,无视异常
	public void after(){
		System.out.println("之后通知,无视异常");
	}

4,配置xml文件

在配置xml文件之前,急着导入aop约束(自查)

看代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd ">
<!-- 目标对象 -->
<bean name="user" class="com.fei.ServiceDemo.UserServiceImpl"></bean>
<!-- 通知对象 -->
<bean name = "myAdvice" class="com.fei.testaop.MyAdvice"></bean>
<!-- 配置切入点 -->

<aop:config>
<!-- 表达式
public void com.fei.ServiceDemo.UserServiceImpl.save()  public权限的返回值为空的xx包下的save方法,空参数
* com.fei.ServiceDemo.UserServiceImpl.save(..) 默认权限为public,返回值任意的xx包下的save方法,任意参数
* com.fei.ServiceDemo.UserServiceImpl.*(..)   默认权限为public,返回值任意的xx包下的所有方法,任意参数
* com.fei.ServiceDemo.*ServiceImpl.*(..)   默认权限为public,返回值任意的后缀为ServiceImpl包下的所有方法,任意参数
* com.fei.ServiceDemo..*ServiceImpl.*(..)   默认权限为public,在ServiceDemo包及其子包下的,返回值任意的后缀为ServiceImpl包下的在所有方法,任意参数

 -->
 <!-- 下面是准备通知 -->
<aop:pointcut expression="execution(* com.fei.ServiceDemo.UserServiceImpl.*())" id="pc"/>
<aop:aspect ref="myAdvice">
<aop:before method="before" pointcut-ref="pc"/>
</aop:aspect>

</aop:config>
</beans>

代码中有解释,这样我们就配置好了,然后我们准备一个测试:

public class Demo1 {
	@Test
	public void test1() {
		ApplicationContext ac1 = new ClassPathXmlApplicationContext("applicationContext.xml");
			UserServiceImpl b=(UserServiceImpl)ac1.getBean("user1");
			b.save();
			System.out.println();					
	}
}

我们看结果:

这是提前通知
保存

我们这里用的用的是提前通知,其他通知一趟在xml配置,代码如下:

<aop:config>

<!-- 表达式 public void com.fei.ServiceDemo.UserServiceImpl.save() public权限的返回值为空的xx包下的save方法,空参数 * com.fei.ServiceDemo.UserServiceImpl.save(..) 默认权限为public,返回值任意的xx包下的save方法,任意参数 * com.fei.ServiceDemo.UserServiceImpl.*(..) 默认权限为public,返回值任意的xx包下的所有方法,任意参数 * com.fei.ServiceDemo.*ServiceImpl.*(..) 默认权限为public,返回值任意的后缀为ServiceImpl包下的所有方法,任意参数 * com.fei.ServiceDemo..*ServiceImpl.*(..) 默认权限为public,在ServiceDemo包及其子包下的,返回值任意的后缀为ServiceImpl包下的在所有方法,任意参数 --> <aop:pointcut expression="execution(* com.fei.ServiceDemo.UserServiceImpl.*())" id="pc"/> <aop:aspect ref="myAdvice"> <!-- 提前通知 --> <aop:before method="before" pointcut-ref="pc"/> <!-- 之后通知 --> <aop:after method="after" pointcut-ref="pc"/> <!-- 环绕通知 --> <aop:around method="around" pointcut-ref="pc"/> <!-- 异常通知 --> <aop:after-throwing method="afterException" pointcut-ref="pc"/> <!-- 之后通知,异常会不通知 --> <aop:after-returning method="afterReturning" pointcut-ref="pc"/> <!-- 提前通知 --> </aop:aspect> </aop:config>

我们看结果:

这是提前通知
环绕前通知
保存
之后通知
环绕后通知!
之后通知,无视异常

好,到这里,spring的aop已经了解一些了。

相关标签: java spring aop