Spring学习笔记(15)----使用Spring的注解方式实现AOP

下面介绍使用Spring框架进行AOP编程。

首先我们需要导入需要的jar包:

1.aspectjrt.jar

2.aspectjweaver.jar

3.cglib-nodep-2.1_3.jar

 

在spring中有两种方式实现面向切面编程,一种是基于XML配置,另一种是使用注解份额方式,在实际开放中我们可以任选其中的一种即可。

 

首先介绍下使用注解方式进行AOP开发。

要使用注解方式,我们需要打开注解处理器

<aop:aspectj-autoproxy/>

我们还是使用前面介绍的接口:

 

package com.szy.spring;

public interface UserManager
{

	public abstract void addUser(String username, String password);

	public abstract void deleteUser(int userId);

	public abstract String findUser(int userId);

	public abstract void modifyUser(int userId, String username, String password);

}

 

实现这个接口:

package com.szy.spring;

public class UserManagerImpl implements UserManager 
{

	public void addUser(String username, String password)
	{
		System.out.println("--------UserManagerImpl.addUser()----------");
	}

	public void deleteUser(int userId)
	{
		System.out.println("--------UserManagerImpl.deleteUser()----------");
	}

	public String findUser(int userId)
	{
		System.out.println("--------UserManagerImpl.findUser()----------");
		return null;
	}

	public void modifyUser(int userId, String username, String password)
	{
		System.out.println("--------UserManagerImpl.modifyUser()----------");
	}
}

 

下面我们定义一个切面类,由于我们使用的是注解方式,因此我们使用@Aspect来标识它是切面类。在切面类中我们要定义切入点,切入点是用来定义我们要拦截的方法。在切入点定义中使用了AOP表达式语言,下面通过实例简单解释一下:

 

@Pointcut("execution (* com.szy.spring..*.*(..))")
execution:代表执行
第一个*:代表返回值类型,使用*代表任何类型的返回值
com.szy.spring:代表包名
..:代表其底下的子包也进行拦截
第二个*:代表对哪个类进行拦截,*代表所有类
第三个*:代表方法
(..):代表方法的蚕食有无都可以

 

现在我们要对UserManagerImpl类下的所有方法进行拦截,则切入点如下表示:

@Pointcut("execution (* com.szy.spring.UserManagerImpl.*(..))")

private void anyMethod()  //定义切入点
 {
 }

 

其中切入点的名称是下面方法的名称aynMethod(),包括括号。

 

下面我们定义通知,通知分为前置通知、后置通知、意外通知、等。通知分为前置通知、后置通知、意外通知、最终通知和环绕通知等。

演示前置通知,

@Before("anyMethod()") //括号内为切入点名称
  public void doBefore()
  {
   System.out.println("----------------执行前置通知-----------------");
  }
 
  @AfterReturning("anyMethod()")
  public void doAfterReturning()
  {
   System.out.println("----------------执行后置通知-----------------");
  }
 @After("anyMethod()")
 public void doAfter()
 {
  System.out.println("----------------执行最终通知-----------------");
 }
 
  @AfterThrowing("anyMethod()")
  public void doAfterThrowing()
  {
   System.out.println("----------------执行意外通知-----------------");
  }
  
 @Around("anyMethod()")
 public Object doAround(ProceedingJoinPoint pjp) throws Throwable
 {
  System.out.println("----------------进入判断方法-----------------");
  Object result=pjp.proceed();  //该方法必须被执行
  System.out.println("----------------退出判断方法-----------------");
  return result;
 }

 

 我们把切面交给spring管理,要交给spring管理我们可以在配置文件同进行bean配置,或者使用扫描的方式。

<bean id="interceptor" class="com.szy.spring.Interceptor"/>

 下面我们进行测试

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
		UserManager manager=(UserManager)context.getBean("userManager");
		manager.addUser("coolszy", "kuka");

 

按照我们的设计,输入的结果应为

----------------执行前置通知-----------------
----------------进入判断方法-----------------
--------UserManagerImpl.addUser()----------
----------------执行后置通知-----------------
----------------执行最终通知-----------------
----------------退出判断方法-----------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值