# Spring-AOP(面向切面编程)--day08

Spring-AOP(面向切面编程)–day08

 AOP个人理解:
在多个业务模块的过程中,存在相同的子环节,比如到银行存钱、取钱、查询余额都需要进行用户验证环节,而这三个事务的核心是各自的存取钱、查询余额操作,用户验证是这三个事务模块都需要完成的操作用户验证,那么可以将这三个模块都用需要使用的用户验证操作提取出来,单独存储,然后设置这个验证用户的使用时机。
对于切面两个字的理解:
理解成汉堡,面包中间切开(切面),可以往里面加火腿、鸡腿肉等等,火腿和鸡腿肉是另外做好然后再往里面加入。就算你什么都不往里面加,他还算是个汉堡(我也不知道算不算反正还能吃)。那火腿和鸡肉呢,你不要汉堡可能往馒头里面加。好差不多就是这个意思,反正我暂时是这么理解的。

一、基本流程

1)流程分析

 上述存取钱、查询余额流程分析
话不多少上图
事务流程
图1
切面分析
在这里插入图片描述

将这两个事务中重复出现的放入卡、输密码和取走卡提取出来,再根据切面位置(上面那条直线在对应时间从插入操作)。

2)代码实现

主要业务


@Component(value = "zhuyao")
public class Zhuyao {
    public void cunqian()
    {
        System.out.println("存钱");
    }
    public void quqian()
    {
        System.out.println("取钱");
    }
}

切面业务

@Component
@Aspect
public class DoSomethings {
    @Before("execution(* SpringAOP.test.Zhuyao.cunqian())")
    public void before(){
        System.out.println("放卡输密码");
    }

    @After("execution(* SpringAOP.test.Zhuyao.cunqian())")

    public void after(){
        System.out.println("拿走卡");
    }
}

xml配置

    <context:component-scan base-package="SpringAOP.test" />
    <aop:aspectj-autoproxy/>

测试

        ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
        Zhuyao zy= (Zhuyao)applicationContext.getBean("zhuyao",Zhuyao.class);
        zy.cunqian();

结果

放卡输密码
存钱
拿走卡

这里已经实现了对取钱业务的支持,那么存钱业务也想实现怎么做,也就是如何定义多个切点?
进行如下修改:

@Before("execution(* SpringAOP.test.Zhuyao.*())")//匹配Zhuyao类下的所有方法
//* SpringAOP.test.Zhuyao.*()
// execution 中可以通过通配符 设置方法的格式  格式为 返回值  方法全限定名() 这样理解

//另外Before() 中定义的切点方法可以用 || 连接来进行指定匹配

下面引用:原文地址
插入时间定义:

注解说明
@Before前置通知,在连接点方法前调用
@Around环绕通知,它将覆盖原有方法,但是允许你通过反射调用原有方法,后面会讲
@After后置通知,在连接点方法后调用
@AfterReturning返回通知,在连接点方法执行并正常返回后调用,要求连接点方法在执行过程中没有发生异常
@AfterThrowing异常通知,当连接点方法异常时调用

xml 配置说明

AOP元素用途备注
aop:advisor定义 AOP 的通知其一种很古老的方式,很少使用
aop:aspect定义一个切面——
aop:before定义前置通知——
aop:after定义后置通知——
aop:around定义环绕通知——
aop:after-returning定义返回通知——
aop:after-throwing定义异常通知——
aop:config顶层的 AOP 配置元素 AOP 的配置是以它为开始的
aop:declare-parents给通知引入新的额外接口,增强功能——
aop:pointcut定义切点——

xml配置示例

<!-- 装配 Bean-->
<bean name="landlord" class="pojo.Landlord"/>
<bean id="broker" class="aspect.Broker"/>

<!-- 配置AOP -->
<aop:config>
    <!-- where:在哪些地方(包.类.方法)做增加 -->
    <aop:pointcut id="landlordPoint"
                  expression="execution(* pojo.Landlord.service())"/>
    <!-- what:做什么增强 -->
    <aop:aspect id="logAspect" ref="broker">
        <!-- when:在什么时机(方法前/后/前后) -->
        <aop:around pointcut-ref="landlordPoint" method="around"/>
    </aop:aspect>
</aop:config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值