a2.springAOP 入门代码

AOP实战
本文介绍AOP的基本概念,包括切面、连接点、通知等,并通过Spring框架中的一个具体示例展示了如何使用注解方式实现AOP,涉及@Before、@After等注解的应用。

AOP

  • AOP中基础概念
Aspect(切面)
    * 通常是一个类;
    * 用来定义切点和通知;

JointPoint(连接点)
    * 被增强的具体方法;

Advice(通知)
    * 执行的增强处理;
    * before、after、afterReturning、afterThrowing、around

Pointcut(切点):
    * 如果把连接点比喻成数据记录, 那么切点就是查询条件;
    * 一个切点可以匹配多个连接点;
    * 理解:
        * 可以把切点理解为连接点的容器;
        * 定义一个切点(连接点容器)
        * 容器所有连接点都会被增强

* AOP切面使用了动态代理技术
    * AOP初始化容器时, 会判断bean是否有切面;
    * 如果有切面, 则使用JDK/CGLIB动态生成代理类字节码文件;
    * 创建的bean对象为代理对象;
  • Execution 表达式
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)

modifiers-pattern:方法的操作权限
ret-type-pattern:返回值【必填】
declaring-type-pattern:方法所在的包
name-pattern:方法名 【必填】
parm-pattern:参数名
throws-pattern:异常

CODE

* spring中AOP有两种实现: xml和注解;
* 下面的demo是注解形式的实现;

* IUser: 接口;
* UserImpl: 实现;
* MyAspect: 切面;
  • pom
        <!-- aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.3.9.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjrt</artifactId>
            <version>1.6.11</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.6.11</version>
        </dependency>
  • applicationContext
    <!-- 启动对@AspectJ注解的支持 -->
    <aop:aspectj-autoproxy/>

    <!-- 配置bean -->
    <bean id="user" class="spring.aop.IUserImpl"/>
    <!-- 切面也必须配置成bean -->
    <bean id="myAspect" class="spring.aop.MyAspect"/>
  • IUser
public interface IUser {
    public void say(String say);
}
  • IUserImpl
public class IUserImpl implements IUser {

    @Override
    public void say(String say) {
        System.out.println(say);
    }

}
  • MyAspect
//声明这是一个组件
@Component
//声明这是一个切面 Bean
@Aspect
public class MyAspect {

    
    //配置切入点,该方法无方法体,主要为方便同类中其他方法使用此处配置的切入点
    @Pointcut("execution(* spring.aop.*User*.say(..))")
    public void aspect(){ }
    
    //方法执行前通知
    @Before("aspect()")
    public void before(JoinPoint joinPoint){
        Object [] args = joinPoint.getArgs(); //获取参数, 这里就一个参赛;
        System.out.println("参数: " + args[0]);
        System.out.println("before");
    }
    
    @After("aspect()")
    public void after(JoinPoint joinPoint){
        System.out.println("after");
    }
    
    @Around("aspect()")
    public void around(JoinPoint joinPoint) throws Throwable{
        System.out.println("around before");
        ((ProceedingJoinPoint) joinPoint).proceed();
        System.out.println("around after");
    }
    
    //返回通知
    @AfterReturning("aspect()")
    public void afterReturn(JoinPoint joinPoint){
        System.out.println("return");
    }
    
    //配置抛出异常后通知
    @AfterThrowing(pointcut="aspect()", throwing="ex")
    public void afterThrow(JoinPoint joinPoint, Exception ex){
        System.out.println("exception");
    }
}
  • test
    public static void main(String[] args) {
        BeanFactory factory = new ClassPathXmlApplicationContext("config/applicationContext.xml");
        IUser user = (IUser) factory.getBean("user");
        user.say("aa");
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值