Spring面向切面编程AOP(ApplicationContext.xml配置)

本文详细介绍Spring面向切面编程(AOP)的概念与应用,包括AOP术语解释、代码案例及配置详解。通过具体项目实例,展示如何使用AOP降低代码耦合度,实现方法增强。

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

Spring面向切面编程(ApplicationContext.xml配置)


  • AOP概念  : Aspect oriented programming  面向切面编程
    我们在某个方面的功能提出来与一批对象进行隔离,这样与一批对象之间降低了耦合性,可以就某个功能进行编程。在程序中运行期间  不修改源代码 对已经有的方法进行增强

  • AOP的相关术语

    1. jointpoint(连接点):连接点是应用程序提供给切面插入的地方(切面对象的所有方法),可以添加新的方法。
    2. pointcut(切点):把通知advice要插入的点(切面对象类中被aop代理的方法)
    3. advice(通知):advice是我们切面功能的实现,它通知程序新的行为。(要为切点添加的功能)
    4. target(目标类):切点所在的类
    5. proxy(代理类):被置入advice后形成的类,target+advice
    6. aspect(切面):是切点和通知的结合
    7. weaving(织入):是指应用aspects到一个target对象创建proxy对象的过程:complie time(编译期),classload time(加载期),runtime(运行期) 
  • 具体案例代码实现

    1. 项目目录结构+mevan依赖


    2. AccountServiceImpl
      package cn.kgc.service.impl;
      
      import cn.kgc.service.AccountService;
      import org.springframework.stereotype.Service;
      
      @Service
      public class AccountServiceImpl implements AccountService {
          public void transfer(String name) {
              System.out.println(name+":正在转账....");
          }
      }
      

       

    3. UserServiceImpl
      package cn.kgc.service.impl;
      
      import cn.kgc.service.UserService;
      import org.springframework.stereotype.Service;
      
      @Service
      public class UserServiceImpl implements UserService {
          public void print() {
              System.out.println("UserServiceImple:打印方法...");
          }
      }
      

       

    4. 通知类Logger

      package cn.kgc;
      
      import org.aspectj.lang.JoinPoint;
      import org.aspectj.lang.ProceedingJoinPoint;
      import org.aspectj.lang.Signature;
      import org.springframework.stereotype.Service;
      
      @Service
      public class Logger {
          public void before(JoinPoint joinPoint){
              Object target = joinPoint.getTarget();
              String className = target.getClass().getName();
              System.out.println("截取的类名:" + className);
              Signature signature = joinPoint.getSignature();
              String name = signature.getName();
              System.out.println("截取方法名字:" + name);
              System.out.println("前置通知代码.....");
      
          }
          public void afterReturing(){
              System.out.println("后置通知代码...");
          }
          public void after(){
              System.out.println("finally终置代码...");
          }
      
          public void afterThrowing(Exception e) {
              System.out.println("方法运行异常:" + e);
          }
      
          public void around(ProceedingJoinPoint proceedingJoinPoint) {
              System.out.println("前置代码");
              try {
                  proceedingJoinPoint.proceed();
              } catch (Throwable throwable) {
                  throwable.printStackTrace();
                  System.out.println("异常执行代码");
              }finally{
                  System.out.println("finally终置通知代码");
              }
          }
      }
      

       

    5. 配置文件applicationContext.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:context="http://www.springframework.org/schema/context"
             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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
          <context:component-scan base-package="cn.kgc"/>
          <aop:config>
              <aop:aspect ref="logger">
                  <aop:pointcut id="pointcut" expression="execution(* cn.kgc.service.impl.*.*(..))"/>
                  <aop:before method="before" pointcut-ref="pointcut"></aop:before>
                  <aop:after-returning method="afterReturing" pointcut-ref="pointcut"/>
                  <aop:after method="after" pointcut-ref="pointcut"/>
                  <aop:after-throwing throwing="e" method="afterThrowing" pointcut-ref="pointcut"/>
                  <aop:around method="around" pointcut-ref="pointcut"/>
      
              </aop:aspect>
          </aop:config>
      </beans>

       

  • 测试类TestAop
  • package cn.kgc;
    
    import cn.kgc.service.AccountService;
    import cn.kgc.service.UserService;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class TestAop {
        @Autowired
        private UserService userService;
        @Autowired
        private AccountService accountService;
        @Test
        public void test(){
            userService.print();
            System.out.println("--------------------------");
            accountService.transfer("小芳");
        }
    
    }
    

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值