Spring实现AOP的三种方式

Spring实现AOP的方式有三种
方式一:使用<aop:advisor >的形式,此时要将类实现相应的接口。
方式二:使用<aop:aspect >的形式,只需要自己写的一个类,类中有定义方法即可。
方式三:使用相关的注解。@Aspect、@Before、@After

方式1代码实现:

java代码:

public class AfterLogClass implements AfterReturningAdvice {
    @Override
    public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
        System.out.println(o1.getClass().getSimpleName()+"类,中的"+method.getName()+"方法被调用啦!");
    }
}

public class BeforeLogClass implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println(o.getClass().getSimpleName()+"类的,"+method.getName()+"方法被调用啦!!!");
    }
}

applicationContext.xml文件代码:

<!--方式1,使用了API接口实现AOP面向切面编程-->
    <bean id="before" class="com.school.log.BeforeLogClass"/>
    <bean id="after" class="com.school.log.AfterLogClass"/>
    <bean id="userService" class="com.school.service.UserServiceImpl"/>
    <!--设置与aop有关的配置信息,导入相关的约束-->
    <aop:config>
        <!--没有显示的定义aop切面-->
        <!--创建切点,expression,这是一个表达式,可以指定要切入的方法,可以把这个理解成一个过滤器,执行到这里的时候就添加相应的方法-->
        <!--返回值,类,方法,参数-->
        <aop:pointcut id="pointcut" expression="execution(* com.school.service.UserServiceImpl.*(..))"/>
        <!--aop顾问,可以理解为通知-->
        <!--解释:Advisor充当Advice(通知)和Pointcut的适配器 , 一般会有advice和pointcut属性
        大多数切面是由定义切面行为的通知 和 定义切面在什么地方执行的切入点组合而成 . spring认识到这一点 , 提供了Advisor类
        这个类将通知和切入点组合到一个对象中 -->
        <!--< aop:advisor>:定义通知器(通知器跟切面一样,也包括通知和切点)-->
        <aop:advisor advice-ref="after" pointcut-ref="pointcut"/>
        <aop:advisor advice-ref="before" pointcut-ref="pointcut"/>
    </aop:config>

方式2代码实现:

java代码:

public class UserLogAOP {
    public void before(){
        System.out.println("我是在切入点之前执行的一个方法!");
    }

    public void after(){
        System.out.println("我是在切入点之后执行的方法!!");
    }
}

applicationContext.xml文件代码:

<bean id="user1" class="com.school.service.UserServiceImpl"/>
    <bean id="userAOP" class="com.school.util.UserLogAOP"/>
    <aop:config>
        <!--在aop切面里面写-->
        <!--自定义切面,ref="userAOP"要引用的类-->
        <aop:aspect ref="userAOP" >
            <!--切入点-->
            <aop:pointcut id="pointCut" expression="execution(* com.school.service.UserServiceImpl.*(..))"/>
            <!--通知-->
            <aop:after method="after" pointcut-ref="pointCut"/>
            <aop:before method="before" pointcut-ref="pointCut"/>
        </aop:aspect>
    </aop:config>

方式3代码实现:

java代码:

public class UserLogAOP {
    /*切入点:execution*/
    @Before("execution(* com.school.service.UserServiceImpl.*(..))")
    public void before(){
        System.out.println("这是一个在方法之前执,,,,行");
    }
    @After("execution(* com.school.service.UserServiceImpl.*(..))")
    public void after(){
        System.out.println("这是一个在方法之后执行!!!!");
    }
}

applicationContext.xml代码:

<!--aspectj-autoproxy自动装配,类似于用注解配置Bean一样,可以理解为开启注解支持-->
    <bean id="user" class="com.school.service.UserServiceImpl"/>
    <!--将注解类注册到spring中-->
    <bean id="userLog" class="com.school.util.UserLogAOP"/>
    <!--声明自动为spring容器中那些配置@aspectJ切面的bean创建代理,织入切面。-->
    <aop:aspectj-autoproxy/>

总结:
这几种方式都可以实现AOP,但是比较推荐使用注解的方式(懒到底),其中的aop:advisor和aop:aspect没有理解的很全面,有些注释内容是参考别的博客写的,这里放上链接地址。
链接1:https://blog.csdn.net/u011983531/article/details/70504281
链接2:https://blog.csdn.net/sybnfkn040601/article/details/65447425

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值