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

一-Spring基础(2)-AOP-【JavaEE开发的颠覆者】

程序员文章站 2022-05-24 11:29:13
...

一、AOP

面向切面编程
Spring的AOP的存在的目的是为了解耦。AOP可以让一组类共享相同的行为。在OOP中只能通过继承类和实现接口,来使代码的耦合度增强,且类继承只能为单继承,阻碍更多行为添加到一组类上,AOP弥补了OOP的不足。

二、Spring支持AspectJ的注解式切面编程

1.使用@Aspect声明是一个切面
2.使用@After、@Before、@Around定义建言(advice),可直接将拦截规则(切点)作为参数。
3.其中@After、@Before、@Around参数的拦截规则为切点(PointCut),为了使节点复用,可使用@PointCut专门定义拦截规则,然后在@After、@Before、@Around的参数中调用。
4.其中符合条件的每一个被拦截处为拦截点(JoinPoint)。

三、示例

1.添加依赖

<!--spring aop支持-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.1.6.RELEASE</version>
        </dependency>
        <!--aspectj支持-->
        <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>

2.编写拦截规则的注解

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

3.编写使用注解的被拦截的类

//使用注解的被拦截类
@Service
public class SpringAopAnnotationService {
    @Action(name = "注解式被拦截的add操作")
    public void add(){
        System.out.println("注解式Service中的add操作正在执行");
    }
}

4.编写使用方法规则的被拦截的类

//使用方法规则被拦截类
@Service
public class SpringAopMethodService {
    public void add(){
        System.out.println("方法式Service中的add操作正在执行");
    }
}

5.编写切面

//编写切面
@Aspect
@Component
public class LogAspect {
    @Pointcut("@annotation(zhao.spring.com.SpringAOP.Action)")
    public void annotationPointCut(){};

    @After("annotationPointCut()")
    public void after(JoinPoint joinPoint){
        MethodSignature signature=(MethodSignature)joinPoint.getSignature();
        Method method=signature.getMethod();
        Action action=method.getAnnotation(Action.class);
        System.out.println("注解式拦截"+action.name());
    }

    @Before("execution(* zhao.spring.com.SpringAOP.SpringAopAnnotationService.*(..))")
    public void before(JoinPoint joinPoint){
        MethodSignature signature=(MethodSignature)joinPoint.getSignature();
        Method method=signature.getMethod();
        System.out.println("方法规则拦截"+method.getName());
    }
}
/**
* 通过@Aspect注解声明一个切面
* 通过@Component让此切面成为Spring容器管理的Bean
* 通过@PointCut注解声明切点
* 通过@After注解声明一个建言,并使用@PointCut定义的切点
*/

6.配置类

//配置类
@Configuration
@ComponentScan("zhao.spring.com.SpringAOP")
@EnableAspectJAutoProxy
public class AopConfig {
}
/**
* 使用@EnableAspectJAutoProxy注解开启Spring对AspectJ代理的支持
*/

7.启动类

//启动类
public class SpringAopMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context=
                new AnnotationConfigApplicationContext(AopConfig.class);
        //注解拦截
        SpringAopAnnotationService springAopService=context.getBean(SpringAopAnnotationService.class);
        springAopService.add();
        //方法拦截
        SpringAopMethodService springAopMethodService=context.getBean(SpringAopMethodService.class);
        springAopMethodService.add();

        context.close();
    }
}

一-Spring基础(2)-AOP-【JavaEE开发的颠覆者】