首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring收拾11 - 面对切面(AOP)1 - 注解配置的方式实现AOP

2012-10-13 
Spring整理11 -- 面对切面(AOP)1 -- 注解配置的方式实现AOPAOP是使用动态代理而现实的,在上面动态代理中,

Spring整理11 -- 面对切面(AOP)1 -- 注解配置的方式实现AOP

AOP是使用动态代理而现实的,在上面动态代理中,我们可以想一下几个概念,我们写一个验证方法,在现实类中我们在拿几个方法中应用这个方法。那在Spring AOP中是如何表述这些概念?

下面先来看AOP中几个比较重要的概念:

2??????? 切面(Aspect)

切面,对象操作过程中的截面。这可能是AOP中最关键的一个术语。例如,我们上面介绍的用户权限验证,不同身份的用户可以做什么,不可以做什么,均由这个模块加以判定。而这个模块调用的位置通常也比较固定:用户发起请求之后,执行业务逻辑之前。

2??????? 连接点(JoinPoint)

程序运行过程中的某个阶段点。如某个方法调用,或者某个异常被抛出。

2??????? 处理逻辑(Advice)

在某个连接点所采用的处理逻辑,处理逻辑的调用模式通常有三种:

1.? Around

在连接点前后插入预处理过程和后处理过程。

2.? Before

仅在连接点之前插入预处理过程。

3.? Throw

在连接点抛出异常时进行异常处理。

2??????? 切点(PointCut)

一系列连接点的集合,它指明处理方式(Advice)将在何时被触发。

1.1. 采用注解配置的方式实现AOP
下面我们来介绍一个用注解库来实现spring AOP,来讲解AOP相关概念。

步骤:

1)??????? 添加spring相关依赖库

* SPRING_HOME/dist/spring.jar

* SPRING_HOME/lib/jakarta-commons/commons-logging.jar

* SPRING_HOME/lib/log4j/log4j-1.2.14.jar

* SPRING_HOME/lib/aspectj/*.jar

2)??????? 采用Aspect定义切面

3)??????? 在Aspect定义Pointcut和Advice

4)??????? 启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中

?

例子我们还是基于上面动态代理的那个例子,代码如下:

使用注解配置AOP类,SecurityHandler.java

/** * 定义Aspect */@Aspectpublic class SecurityHandler {        /**     * 定义Pointcut,Pointcut的名称就是allAddMethod,* 此方法不能有返回值和参数,该方法只是一个     * 标识     * Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint)     */    @Pointcut("execution(* add*(..)) || execution(* del*(..))")    private void allAddMethod(){};      /**     * 定义Advice,标识在那个切入点何处织入此方法     */    @Before("allAddMethod()")    private void checkSecurity() {       System.out.println("------checkSecurity()------");    }    }

??


applicationContext.xml:

<aop:aspectj-autoproxy/><!-- 启动使用注解配置AOP支持 --><bean id="securityHandler" name="code">public interface UserManager {     public void addUser(String username, String password);      public void deleteUser(int id);     public void modifyUser(int id, String username, String password);      public String findUserById(int id);}

?
?


UserManagerImpl.java

public class UserManagerImpl implements UserManager {    public void addUser(String username, String password) {            System.out.println("----UserManagerImpl.addUser()------");    }     public void deleteUser(int id) {              System.out.println("------UserManagerImpl.deleteUser()---");    }     public String findUserById(int id) {              System.out.println("----UserManagerImpl.findUserById()--");       return null;    }    public void modifyUser(int id, String username, String password) {    System.out.println("-------UserManagerImpl.modifyUser()--");    }} 

?
测试端代码:

public class Client {    public static void main(String[] args) {       BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");              UserManager userManager = (UserManager)factory.getBean("userManager");       userManager.addUser("张三", "123");    }}

?

打印信息:

-------checkSecurity()---------------

-------UserManagerImpl.addUser()-----

热点排行