springAOP的实现方式

简介: 基于上篇介绍玩AOP的相关概念以及通知类型,我们继续了解AOP的几种使用方法.经典的基于代理的AOP@AspectJ注解驱动的切面纯POJO切面(纯粹通过aop:fonfig标签配置)注入式AspectJ切面

前言

基于上篇介绍玩AOP的相关概念以及通知类型,我们继续了解AOP的几种使用方法.

  • 经典的基于代理的AOP
  • @AspectJ注解驱动的切面
  • 纯POJO切面(纯粹通过aop:fonfig标签配置)
  • 注入式AspectJ切面

AOP常用的实现方式有两种,

1、采用声明的方式来实现(基于XML),

2、是采用注解的方式来实现(基于@AspectJ注解驱动的切面)。

具体使用方式

1.经典的基于代理的AOP实现,大致步骤为:配置文件中配置pointcut, 在java中用编写实际的aspect 类, 针对对切入点进行相关的业务处理。
JDK动态代理:动态代理是在运行时动态的生成一个代理类,在其中插入横切逻辑,在调用方法时不调用本来类的方法,转而调用代理类的方法

业务接口:

public interface IUserService {
    public String findUser();
}
public class UserServiceImpl implements IUserService{
private String name;
    public void setName(String name){
        this.name=name;
    }
    public String getName(){
        return this.name;
    }
    public String findUser(){
        System.out.println("============执行业务方法findUser,查找的用户是:"+name+"=============");
        return name;
    }
}

切面类:

public class AopAspect {
    public void doBefore(JoinPoint jp){
        System.out.println("===========执行前置通知============");
    }
    public void doAfterReturning(JoinPoint jp,String result){
        System.out.println("===========执行后置通知============");
        System.out.println("返回值result==================="+result);
    }
    public void doAfter(JoinPoint jp){
        System.out.println("===========执行最终通知============");
    }
    public void doAfterThrowing(JoinPoint jp,Exception ex){
        System.out.println("===========执行异常通知============");
    }
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
 System.out.println("======执行环绕通知开始=========");
         Object result=pjp.proceed();
        System.out.println("======执行环绕通知结束=========");
        return result;
    }
}

Spring配置:

<!-- 声明一个业务类 -->
    <bean id="userManager" class="com.spring.service.impl.UserManagerServiceImpl">
        <property name="name" value="lixiaoxi"></property>
    </bean>  
    <!-- 声明通知类 -->
    <bean id="aspectBean" class="com.spring.aop.AopAspect" />
    <aop:config>
     <aop:aspect ref="aspectBean">
        <aop:pointcut id="pointcut" expression="execution(* com.spring.service.impl.UserManagerServiceImpl..*(..))"/>
        <aop:before method="doBefore" pointcut-ref="pointcut"/> 
        <aop:after-returning method="doAfterReturning" pointcut-ref="pointcut" returning="result"/>
        <aop:after method="doAfter" pointcut-ref="pointcut" /> 
        <aop:around method="doAround" pointcut-ref="pointcut"/> 
        <aop:after-throwing method="doAfterThrowing" pointcut-ref="pointcut" throwing="ex"/>
      </aop:aspect>
   </aop:config>

二、使用注解配置AOP

采用注解来做aop, 主要是将写在spring 配置文件中的连接点写到注解里面。

业务接口和业务实现与上边一样,具体切面类如下:

@Aspect
public class AopAspectJ {
    public static final String EDP="execution(* com.spring.service.impl.UserManagerServiceImpl..*(..))";
    @Before(EDP)
    public void doBefore(JoinPoint jp){
        System.out.println("=========执行前置通知==========");
    }
    @AfterReturning(value=EDP,returning="result")
    public void doAfterReturning(JoinPoint jp,String result){
        System.out.println("===========执行后置通知============");
    }
    @After(value=EDP)
    public void doAfter(JoinPoint jp){
        System.out.println("===========执行最终通知============");
    }
    @Around(EDP)
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
        System.out.println("======执行环绕通知开始=========");
         Object result=pjp.proceed();
        System.out.println("======执行环绕通知结束=========");
        return result;
    }
    /**
     * 在目标方法非正常执行完成, 抛出异常的时候会走此方法
     * @param jp
     * @param ex
     */
    @AfterThrowing(value=EDP,throwing="ex")
    public void doAfterThrowing(JoinPoint jp,Exception ex) {
        System.out.println("===========执行异常通知============");
    }
}

spring的配置:

<!-- 声明spring对@AspectJ的支持 -->
    <aop:aspectj-autoproxy/>    
    <!-- 声明一个业务类 -->
    <bean id="userManager" class="com.spring.service.impl.UserManagerServiceImpl">
        <property name="name" value="lixiaoxi"></property>
    </bean>   
     <!-- 声明通知类 -->
    <bean id="aspectBean" class="com.spring.aop.AopAspectJ" />



相关文章
|
13天前
|
Java Spring 容器
同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
同一接口有多个实现类,怎么来注入一个指定的实现?@Resource、@Autowired、@Qualifier
|
5月前
|
Java Spring 容器
SpringAop
SpringAop
34 0
|
8月前
|
Java 编译器 Spring
Spring框架@Autowired和@Resource到底有什么区别
Spring框架@Autowired和@Resource到底有什么区别
366 0
|
8月前
|
XML 监控 Java
SpringAOP介绍与使用
SpringAOP介绍与使用
47 0
|
9月前
|
Java Spring
解析Spring注解:@Resource与@Autowired的区别
在Spring框架中,依赖注入是实现松耦合、可维护性高的应用的重要方式之一。`@Resource`和`@Autowired`是两个常用的注解,用于实现依赖注入。然而,它们在用法和特点上有所不同。本文将详细介绍`@Resource`和`@Autowired`之间的区别,以及在Spring应用中的应用场景。
140 0
|
9月前
|
Java Spring
|
10月前
|
开发框架 SpringCloudAlibaba Java
Spring注解装配:@Autowired和@Resource使用及原理详解
`@Resource`和`@Autowired`都是实现bean的注入,在日常开发中使用非常频繁,但是使用体验不太一样,笔者喜欢用`@Resource`,因为在使用`@Autowired`时IDEA会出现一些警告爆红提示
156 0
Spring注解装配:@Autowired和@Resource使用及原理详解
|
12月前
|
XML Java 数据格式
SpringAOP(一)
SpringAOP(一)
|
12月前
|
Java 数据库连接 数据库
SpringAOP(三)
SpringAOP(三)
|
缓存 监控 Java
SpringAop学习(一)
SpringAop学习(一)
60 0
SpringAop学习(一)