Spring(AOP)

AOP用于分离业务逻辑与非业务逻辑,降低耦合度,提高代码复用性。文章通过例子展示了从1.0到1.2版本的代码演化,引出AOP需求。接着解释了AOP的核心概念,如连接点、切入点、通知和切面,并介绍了SpringAOP的实现,包括基于XML配置和注解的方式。
摘要由CSDN通过智能技术生成

 aop引入案例

1.0版本

public void saveAdmin(Admin admin){
            jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");
  }
  
 
1.1版本
  public void saveAdmin(Admin admin){
            验证功能()
            jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");

  }
  public void updateAdmin(Admin admin){
            验证功能()
            jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");

  }
 
1.2版本
  public void saveAdmin(Admin admin){
          
            //业务代码
            if(admin.getAccount!=null){
              jdbcTemplate.update("insert into admin(account,password)value(?,?)","cccc","2222");
            }
         
  }
  
 
非业务代码: 
  验证功能(){
  
  }
  输出日志(){
  
  }
  提交事务(){
  
  }
  统一异常处理(){
  
  }

      开发好一个版本后,后期如果需要添加新的功能,就需要修改原来的代码, 加入调用新功能的代码. 这样开发就很麻烦,会存在大量的冗余代码.   
      利用 AOP 可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的 耦合度降低,提高程序的可重用性,同时提高了开发的效率 , AOP是一种编程技巧,不是代替OOP的
   AOP将程序中的一些非业务代码进行提取,在不需要修改原来代码的情况下,为程序添加额外的功能.非业务代码(验证权限,打印日志,提交事务,统一异常处理), AOP思想不是spring框架特有的,只是spring框架引入使用了这一思想
               AOP是通过一个 代理对象 来实现对非业务代码进行调用的 
                代理对象(4s 中介  手机店)
             告诉代理对象,调用哪个方法时,让代理对象去帮助我们调用哪个方法
                底层实现: 使用的是动态代理模式
AOP 的基本概念
连接点(Joinpoint): 类中可以被增强的方法,这个方法就被称为连接点
切入点(pointcut): 类中有很多方法可以被增强,但实际中只有 add 和 update 被增了,那么 add 和 update 方法就被称为切入点(实际实现的连接点)
通知(Advice): 通知是指一个切面在特定的连接点要做的事情(增强的功能)。通 知分为方法执行前通知,方法执行后通知,环绕通知等.
切面(Aspect): 把通知添加到切入点的整个过程称为切面.
目标(Target): 代理的目标对象(连接点,切入点所在类)
代理(Proxy): 向目标对象应用通知时创建的代理对象

springAOP 实现(具体操作)

(1)下载 AOP 相关 jar

< dependency >
< groupId >org.springframework</ groupId >
< artifactId >spring-aspects</ artifactId >
< version >5.2.2.RELEASE</ version >
</ dependency >

(2) 方式一:基于aspectj的xml配置

public class MyUtil {


    public void printLog(){
        System.out.println("打印日志");
    }
    public void commit(){
        System.out.println("提交事务");
    }
    public void exceptionAdmin(Throwable e){
        System.out.println("异常:"+e.getMessage());
    }
}

 

@Repository(value = "adminDao")
public class AdminDao {

    @Autowired
    JdbcTemplate jdbcTemplate;
    public void saveAdmin(Admin admin){
        System.out.println("保存管理员");
    }
    public void saveAdmin(){
        System.out.println("保存管理员1");
    }
    public void updateAdmin(){
        System.out.println("修改管理员");
    }
}

//在.xml中配置
<bean id="myutil" class="com.ffyc.ssm.util.MyUtil"></bean>
    <aop:config>
        <aop:pointcut id="saveAdmin" expression="execution(* com.ffyc.ssm.dao.AdminDao.saveAdmin(..))"/>
        <aop:aspect ref="myutil">
            <aop:before method="printLog" pointcut-ref="saveAdmin"></aop:before>
            <aop:after-returning method="printLog" pointcut-ref="saveAdmin"></aop:after-returning>
            <aop:after method="printLog" pointcut-ref="saveAdmin"></aop:after>
            <aop:after-throwing method="exceptionAdmin" pointcut-ref="saveAdmin" throwing="e"></aop:after-throwing>
        </aop:aspect>
    </aop:config>

环绕通知

 方式二:注解

 在方法上注释

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值