欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

09点睛Spring4.1-AOP

程序员文章站 2022-03-10 11:30:25
...

9.1 AOP

  • AOP可以了让一组类共享相同的行为.在OOP中只能通过继承类和实现接口,这样使代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上;
  • 下面演示一个日志系统的实现,简单但不失表达AOP的核心内容
    • 演示通过注解拦截和通过方法规则拦截;
  • 一些小术语
    • JoinPoint:你需要拦截的代码位置(代码里已标识)
    • Pointcut:符合某个条件后需要执行的代码位置(代码里已标识)

9.2 示例

采取2种截获方式:拦截注解和拦截方法

9.2.1 增加aspectj依赖到maven

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.8.5</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.8.5</version>
</dependency>

9.2.2 编写拦截规则的注解

package com.wisely.aop;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Action {
    String name();

}

9.2.3 编写需要拦截的2个测试bean

  • 使用注解
package com.wisely.aop;

import org.springframework.stereotype.Service;

@Service
public class Demo1Service {
    @Action(name="demo1,add操作")
    public void add(){} //JoinPoint
    @Action(name="demo1,remove操作")
    public void remove(){}//JoinPoint
    @Action(name="demo1,update操作")
    public void update(){}//JoinPoint
    @Action(name="demo1,query操作")
    public void query(){}//JoinPoint

}
  • 使用方法规则
package com.wisely.aop;

import org.springframework.stereotype.Service;

@Service
public class Demo2Service {
    public void add(){}//JoinPoint
    public void remove(){}//JoinPoint
    public void update(){}//JoinPoint
    public void query(){}//JoinPoint
}

9.2.4 编写切面

package com.wisely.aop;

import java.lang.reflect.Method;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {
    @After("@annotation(com.wisely.aop.Action)") //此处为pointcut
    public void after(JoinPoint joinPoint) {
        //每一个符合表达式条件的位置为joinPoint
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        Action action = method.getAnnotation(Action.class);
        System.out.println(action.name());
        //获得操作内容后可插入数据库中
    }

    @Before("execution(* com.wisely.aop.Demo2Service.*(..))") //此处为pointcut
    public void before(JoinPoint joinPoint){
        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
        Method method = signature.getMethod();
        System.out.println("demo2,"+method.getName());

    }
}

9.2.5 测试

package com.wisely.aop;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy //开启对AspectJ的@Aspect注解的支持,别忘了
public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext("com.wisely.aop");
        Demo1Service d1s = context.getBean(Demo1Service.class);
        d1s.add();
        d1s.remove();
        d1s.update();
        d1s.query();

        Demo2Service d2s = context.getBean(Demo2Service.class);
        d2s.add();
        d2s.remove();
        d2s.update();
        d2s.query();
        context.close();
    }

}

输出结果

demo1,add操作
demo1,remove操作
demo1,update操作
demo1,query操作
demo2,add
demo2,remove
demo2,update
demo2,query

新书推荐《JavaEE开发的颠覆者: Spring Boot实战》,涵盖Spring 4.x、Spring MVC 4.x、Spring Boot企业开发实战。

 

京东地址:http://item.jd.com/11894632.html

当当地址:http://product.dangdang.com/23926195.html

亚马逊地址:http://www.amazon.cn/图书/dp/B01D5ZBFUK/ref=zg_bsnr_663834051_6 

淘宝地址:https://item.taobao.com/item.htm?id=528426235744&ns=1&abbucket=8#detail

 

 

 

或自己在京东、淘宝、亚马逊、当当、互动出版社搜索自选。

 


09点睛Spring4.1-AOP
            
    
    博客分类: 点睛Spring4.1