Spring学习笔记(14)----使用Spring的注解方式实现AOP
2011-07-30 17:21
1266 查看
下面介绍使用Spring框架进行AOP编程。
首先我们需要导入需要的jar包:
1.aspectjrt.jar
2.aspectjweaver.jar
3.cglib-nodep-2.1_3.jar
在spring中有两种方式实现面向切面编程,一种是基于XML配置,另一种是使用注解份额方式,在实际开放中我们可以任选其中的一种即可。
首先介绍下使用注解方式进行AOP开发。
要使用注解方式,我们需要打开注解处理器
Xml代码
<aop:aspectj-autoproxy/>
我们还是使用前面介绍的接口:
Java代码
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);
}
实现这个接口:
Java代码
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类下的所有方法进行拦截,则切入点如下表示:
Java代码
@Pointcut("execution (* com.szy.spring.UserManagerImpl.*(..))")
private void anyMethod() //定义切入点
{
}
其中切入点的名称是下面方法的名称aynMethod(),包括括号。
下面我们定义通知,通知分为前置通知、后置通知、意外通知、等。通知分为前置通知、后置通知、意外通知、最终通知和环绕通知等。
演示前置通知,
Java代码
@Before("anyMethod()") //括号内为切入点名称
public void doBefore()
{
System.out.println("----------------执行前置通知-----------------");
}
@AfterReturning("anyMethod()")
public void doAfterReturning()
{
System.out.println("----------------执行后置通知-----------------");
}
Java代码
@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配置,或者使用扫描的方式。
Xml代码
<bean id="interceptor" class="com.szy.spring.Interceptor"/>
下面我们进行测试
Java代码
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager manager=(UserManager)context.getBean("userManager");
manager.addUser("coolszy", "kuka");
按照我们的设计,输入的结果应为
----------------执行前置通知-----------------
----------------进入判断方法-----------------
--------UserManagerImpl.addUser()----------
----------------执行后置通知-----------------
----------------执行最终通知-----------------
----------------退出判断方法-----------------
首先我们需要导入需要的jar包:
1.aspectjrt.jar
2.aspectjweaver.jar
3.cglib-nodep-2.1_3.jar
在spring中有两种方式实现面向切面编程,一种是基于XML配置,另一种是使用注解份额方式,在实际开放中我们可以任选其中的一种即可。
首先介绍下使用注解方式进行AOP开发。
要使用注解方式,我们需要打开注解处理器
Xml代码
<aop:aspectj-autoproxy/>
我们还是使用前面介绍的接口:
Java代码
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);
}
实现这个接口:
Java代码
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类下的所有方法进行拦截,则切入点如下表示:
Java代码
@Pointcut("execution (* com.szy.spring.UserManagerImpl.*(..))")
private void anyMethod() //定义切入点
{
}
其中切入点的名称是下面方法的名称aynMethod(),包括括号。
下面我们定义通知,通知分为前置通知、后置通知、意外通知、等。通知分为前置通知、后置通知、意外通知、最终通知和环绕通知等。
演示前置通知,
Java代码
@Before("anyMethod()") //括号内为切入点名称
public void doBefore()
{
System.out.println("----------------执行前置通知-----------------");
}
@AfterReturning("anyMethod()")
public void doAfterReturning()
{
System.out.println("----------------执行后置通知-----------------");
}
Java代码
@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配置,或者使用扫描的方式。
Xml代码
<bean id="interceptor" class="com.szy.spring.Interceptor"/>
下面我们进行测试
Java代码
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
UserManager manager=(UserManager)context.getBean("userManager");
manager.addUser("coolszy", "kuka");
按照我们的设计,输入的结果应为
----------------执行前置通知-----------------
----------------进入判断方法-----------------
--------UserManagerImpl.addUser()----------
----------------执行后置通知-----------------
----------------执行最终通知-----------------
----------------退出判断方法-----------------
相关文章推荐
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP入门)
- ITCAST视频-Spring学习笔记(使用Spring的注解方式实现AOP的细节)
- spring学习笔记7--使用spring进行面向切面的(AOP)编程(1)注解方式实现
- Spring学习笔记(三)Spring注解方式实现AOP
- Spring学习笔记(14)----使用CGLIB实现AOP功能
- Spring——使用Spring的注解方式实现面向切面技术AOP
- 使用Spring的注解方式实现AOP的细节
- Spring实现AOP方式之二:使用注解配置 Spring AOP
- Spring系列之 (十):AOP实现方式(二):使用AspectJ的注解方式
- ITCAST视频-Spring学习笔记(使用CGLIB实现AOP功能与AOP概念解释)
- Spring4学习笔记-AOP(基于注解的方式)
- AOP之Spring使用注解方式实现AOP(入门)
- Spring_6_使用注解的方式实现AOP
- 使用Spring的注解方式实现AOP
- 使用Spring的注解方式实现AOP
- Spring使用注解的方式实现AOP
- 使用Spring的注解方式实现AOP
- 使用Spring AOP注解方式实现表单重复提交验证功能
- 【学习笔记】Spring AOP注解使用总结
- 使用Spring的注解方式实现AOP