AOP采用Annotation声明方式

本文介绍了面向切面编程(AOP)的主要概念,包括横切性关注点、切面、通知、切入点、连接点等,并通过Spring框架进行实战演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AOP主要概念

**Cross Cutting Concern
是一种独立服务,它会遍布在系统的处理流程之中
**Aspect
对横切性关注点的模块化
**Advice
对横切性关注点的具体实现
**Pointcut(切入点)
它定义了Advice应用到哪些JoinPoint上,对Spring来说是方法调用、
**JoinPoint(连接点)
Advice在应用程序上执行的点或时机,Spring只支持方法的JoinPoint,这个点也可以使属性修改,如:Aspecj可以支持
**Weave(织入)
将Advice应用到Target Object上的过程叫织入,Spring支持的是动态织入
**Target Objec(目标)
Advice被应用的对象
**Proxy(代理)
Spring AOP默认使用JDK的动态代理,它的代理是运行时创建,也可以使用CGLIB代理
**Introduction
可以动态的为类添加方法

采用Annotation声明方式

引入jar包
* spring.jar
* log4j-1.2.14.jar
* commons-logging.jar
* aspectj/*.jar
建立userManger接口

package com.bjpowernode.spring;

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 com.bjpowernode.spring;

public class UserManagerImpl implements UserManager {

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

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

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

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

//  private void checkSecurity() {
//      System.out.println("-------checkSecurity-------");
//  }
}

SecurityHandler

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

@Aspect
public class SecurityHandler {


    /**
     * 定义Pointcut,Pointcut的名称为addAddMethod(),此方法没有返回值和参数
     * 该方法就是一个标识,不进行调用
     */
    @Pointcut("execution(* add*(..))")
    private void addAddMethod(){};


    /**
     * 定义Advice,表示我们的Advice应用到哪些Pointcut订阅的Joinpoint上
     */
    @Before("addAddMethod()")
    //@After("addAddMethod()")
    private void checkSecurity() {
        System.out.println("-------checkSecurity-------");
    }       
}

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">

    <!-- 启用AspectJ对Annotation的支持 -->       
    <aop:aspectj-autoproxy/>           
    <!-- 目标类 -->
    <bean id="userManager" class="com.bjpowernode.spring.UserManagerImpl"/>
    <!-- 切面 -->
    <bean id="securityHandler" class="com.bjpowernode.spring.SecurityHandler"/>
</beans>

Client

public class Client {

    public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
        //从Spring容器中获得
        UserManager userManager = (UserManager)factory.getBean("userManager");
        //执行
        userManager.addUser("张三", "123");
    }

}

评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值