采用Annotation方式完成AOP示例

作者: 小小蒜头 | 来源:发表于2017-11-17 22:08 被阅读23次

整个AOP的执行过程可简单的理解为:切入点(Pointcut)捕获一个对连接点(Joinpoint)的调用,将通知(Advice要我们做的事)加入到调用过程中。

看图原理

首先定义UserManager接口和实现类UserManagerImpl,我们这里只给出UserManager的例子。

UserManager

package cn.itcast.dao;

public interface UserManager {
    public void addUser(String username, String password);

    public void delUser(int userId);

    public String findUserById(int userId);

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

UserManagerImpl

package cn.itcast.dao.impl;

import cn.itcast.dao.UserManager;

public class UserManagerImpl implements UserManager {
    @Override
    public void addUser(String username, String password) {
        System.out.println("---------UserManagerImpl.add()--------");
    }

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

    @Override
    public String findUserById(int userId) {
        System.out.println("---------UserManagerImpl.findUserById()--------");
        return "张三";
    }

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

采用配置文件的方式:

1、 导入相应的Spring jar包。
2、将横切性关注的问题模块化,建立安全处理类。在SecurityHandler类中写我们的独立方法,也就是定义Advice(具体实现)。

package cn.itcast.spring;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

//2、将横切性关注点模块化,建立SecurityHandler.java
@Aspect
public class SecurityHandler {

    //第一个*,有无返回值;第二个*,以add开头的方法名。..表示0-n个参数
    @Pointcut("execution(* add*(..))")
    private void addAddMethod() {
        //该方法就只是一个标识,不进行调用
    }


    /*
     *这个advice通过addAddMethod()[不是真的方法调用]找到@Pointcut("execution(* add*(..))")注解
     *就知道到底应用到哪些方法(add*()),而且advice定义before
     * 就会在所有add方法之前进行调用
     * 定义的Advice,应用到哪些PointCut订阅的Joinpoint上
     */
    @Before("addAddMethod()")
    public void checkSecurity() {
        System.out.println("------checkSecrity--------");
    }
}

这里我们使用Annotation的方式,这样可以更直观的看到AOP的各个部分,当然记得在配置文件中启用AOP哦!读者也可以完全使用配置文件方式完成例子。

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

    <!-- @Aspect的注解没有启用,谁也不认识,这里启用Aspectj对Annotation的支持 -->
    <aop:aspectj-autoproxy/>

    <bean id="userManager" class="cn.itcast.dao.impl.UserManagerImpl"/>
    <bean id="securityHandler" class="cn.itcast.spring.SecurityHandler"/>

</beans>

在这里,我们看到了Aspect、Pointcut、Advice。剩下就是Joinpoint。相信读者已经知道它在哪啦!对,例子中UserManager类的addUser方法就是啦!

客户端Client调用代码

package cn.itcast.client;

import cn.itcast.dao.UserManager;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Client {
    public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserManager userManager = (UserManager) factory.getBean("userManager");
        userManager.addUser("张三", "123");
    }
}

相关文章

  • 采用Annotation方式完成AOP示例

    整个AOP的执行过程可简单的理解为:切入点(Pointcut)捕获一个对连接点(Joinpoint)的调用,将通知...

  • 02-06 AOP学习之@args,@annotation,be

    Spring AOP @args,@annotation和bean使用示例 @args:使用“@args(注解列表...

  • spring aop 自定义注解annotation中spel表

    关键词 spring aop,annotation,spel 在使用spring aop时,一种比较方便切入方式是...

  • Spring

    Spring的aop怎么实现,Spring的aop有哪些实现方式 AOP常用的实现方式有两种,一种是采用声明的方式...

  • spring笔记-AspectJ(AOP)

    AspectJ主要使用注解的方式来实现AOP,Spring AOP偏重编程的方式 1.示例接口 2.定义切面 2....

  • 关于Spring AOP

    1 spring核心AOP spring aop 实现方式,网上看到大神的示例,非常的清晰,链接如下,总共4篇: ...

  • spring AOP

    1,原理:Spring AOP底层原理采用运行时生成动态代理的方式来增强目标对象。AOP 代理其实是由 AOP 框...

  • AOP_anno 注解方式aop

    AOP_anno 注解方式aop 利用注解完成aop配置,首先要完成注解ioc注册Bean,然后再通知类中配置切面...

  • 注解 Annotation

    概述 示例 理解Annotation ① jdk 5.0 新增的功能 ② Annotation 其实就是代码里的特...

  • AOP 相关Annotation

    Spring使用AspectJ注解来声明通知方法 @Pointcut 例子: 然后后在AspectJ其他注解中用"...

网友评论

    本文标题:采用Annotation方式完成AOP示例

    本文链接:https://www.haomeiwen.com/subject/jkqsvxtx.html