从零开始学Spring-: 基于aspectj 的SpringAop就基本开发

本文详细介绍了如何使用Spring AOP结合AspectJ进行面向切面编程,包括注解方式和XML配置方式,涵盖切面类创建、切入点定义、前置通知、后置通知及环绕通知的实现。

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


Spring Aop-:aspectj 的就基本开发

1. 注解方式


1.导入所需要的jar 包

<?xml version="1.0" encoding="UTF-8"?>

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.imooc.spring_aspectj</groupId>
    <artifactId>spring_aspectj</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>


2.导入AOP 依赖

<?xml version="1.0" encoding="UTF-8"?>
<beans xsi:schemaLocation=" http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans.xsd
 http://www.springframework.org/schema/aop
 http://www.springframework.org/schema/aop/spring-aop.xsd"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns="http://www.springframework.org/schema/beans">
<!--开启aspectj 的注解开发-->
 <aop:aspectj-autoproxy/>
</beans>

3. 创建实体目标类 并在springxml中注册

 
    package com.imooc.aspectj.Demo1;

    public class ProductDao {
      public void save() {
      System.out.println ( "查询" );
       }

       public void update() {
      System.out.println ( "修改" );
      }

       public void delect() {
      System.out.println ( "删除" );
      }

       public void add() {
      System.out.println ( "增加" );
      }
    }

###4. 创建切面类 并在springxml中注册

   
package com.imooc.aspectj.Demo1;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

    /*切面类*/
    /*声明为切面类*/
    @Aspect
    public class MyAspectAnno {
       /*设置前置通知*/
      @Before(value = "execution(* com.imooc.aspectj.Demo1.ProductDao.*(..))")
      public void before() {
      System.out.println ( "前置通知" );
       }
    }


4.2 后置通知拓展

@AfterReturning(value = "execution(* com.imooc.aspectj.Demo1.ProductDao.update(..))",returning = "result")
public void after( Object result ) {
   System.out.println ( "后置通知" + result);
}


4.3 环绕通知拓展
@Around ( value = "execution(* com.imooc.aspectj.Demo1.ProductDao.delect(..))" )
public  Object aroud(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
   System.out.println ("环绕前通知");
   /*如果不调用这个方法 目标方法会被拦截*/
  Object proceed = proceedingJoinPoint.proceed ();
   System.out.println ("环绕后通知");
   return proceed ;

}


5创建测试类

package com.imooc.aspectj.Demo1;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import javax.naming.Name;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContent.xml")
public class SpringDemo {
   @Resource(name = "productDao")
   private ProductDao productDao;

   @Test
   public void test() {
      productDao.add ();
      productDao.delect ();
      productDao.update ();
      productDao.save ();
   }
}

2.Xml方式

1.导入所需jar 包

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.imooc.spring_aspectj</groupId>
    <artifactId>spring_aspectj</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>aopalliance</groupId>
            <artifactId>aopalliance</artifactId>
            <version>1.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>




###2.创建切面类

package com.imooc.Demo2;

/*Xml 方式通知*/
public class MyAspectXml {
    public void befor() {
        System.out.println("前置通知");
    }

    public void afterReturing(Object o) {
        System.out.println("后置增强" + o);
    }
}

3.创建接口

package com.imooc.Demo2;

public interface CustoMDao {
    public void add();

    public void update();

    public void save();

    public void delect();

    public void findAll();


}


4.创建实现类

package com.imooc.Demo2;

public class CustomDaoImpl implements CustoMDao{

    public void add() {
        System.out.println("添加");
    }

    public void update() {
        System.out.println("修改");

    }

    public void save() {
        System.out.println("查询");

    }

    public void delect() {
        System.out.println("删除");

    }

    public void findAll() {
        System.out.println("查询所有");
    }

}

5.配置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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!--XML方式 配置AspectJ-->
    <!--配置目标类-->
    <bean id="custoMDao" class="com.imooc.Demo2.CustomDaoImpl"></bean>
    <!--切面类的配置-->
    <bean id="MyAspecyXml" class="com.imooc.Demo2.MyAspectXml"></bean>
    <!---->
    <aop:config>

        <!--切入点-->
       <aop:pointcut id="pointcut" expression="execution(* com.imooc.Demo2.CustoMDao.save(..))"/>
      <aop:pointcut id="poincut2" expression="execution(* com.imooc.Demo2.CustoMDao.*(..))"/>
        <!--切面-->
        <aop:aspect ref="MyAspecyXml">
            <aop:before method="befor" pointcut-ref="pointcut"></aop:before>
            <aop:after-returning method="afterReturing" pointcut-ref="poincut2" returning="o"></aop:after-returning>
        </aop:aspect>

    </aop:config>
</beans>


6.创建测试类

package com.imooc.Demo2;


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(value = "classpath:Aspectj.xml")
public class SpringDemo2 {
    @Resource(name = "custoMDao")
    private CustoMDao customDao;

    @Test
    public void Demo1() {
        customDao.add();
        customDao.delect();
        customDao.update();
        customDao.save();
        customDao.findAll();
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值