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

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

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

²        切面(Aspect

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

²        连接点(JoinPoint

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

²        处理逻辑(Advice

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

1.  Around

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

2.  Before

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

3.  Throw

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

²        切点(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定义PointcutAdvice

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

 

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

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

/**

 * 定义Aspect

 */

@Aspect

public 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" class="spring.SecurityHandler"/>          

<bean id="userManager" class="spring.UserManagerImpl"/>

UserManager.java

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()-----

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值