SpringAOP的简单使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jnshu_it/article/details/84614942

这里是修真院后端小课堂,每篇分享文从

【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】

八个方面深度解析后端知识/技能,本篇分享的是:

【SpringAOP的简单使用】

大家好,我是IT修真院成都分院第13期的学员,一枚正直纯洁善良的JAVA程序员,今天给大家分享一下,修真院官网JAVA任务一,深度思考中的知识点——SpringAOP的简单使用

(1)背景介绍:

AOP(Aspect Oriented Programming),面向切面编程,是OOP(Object Oriented Programming,面向对象编程)的补充和完善。

OOP是开发者定义纵向关系,但是并不允许开发者定义横向关系,所以有部分代码是横向的分布在所有对象层次中,例如日志功能等而与它对应的对象的核心功能毫无关系对于其他类型的代码,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

(2)知识剖析:

Spring AOP的一些基本概念

(1)Aspect(切面):通常是一个类,里面可以定义切入点和通知

(2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用

(3)Advice(通知):AOP在特定的切入点上执行的增强处理

(4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式

(5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

有五种类型的通知:

Before(前置):在方法被调用之前调用通知;

After(后置):在方法调用之后调用通知;(不管该方法是否执行成功)

After-returning(返回结果通知):在方法返回结果后;

After-throwing(异常通知):在方法抛出异常后;

Around(环绕):在方法调用之前和之后都会调用通知;

(3)常见问题:

(1)SpringAOP使用方法

(2)使用XML方法和使用注解

(4)解决方案:

使用xml方法:

<context:annotation-config/>
<!--被代理对象-->
<bean id="math" class="com.springAOP.MyMath"/>
<!--通知类-->
<bean id="advices" class="com.springAOP.Advices"/>
<!--aop设置-->
<aop:config>
    <!--配置切面 把增强用到方法上面-->
    <aop:aspect ref="advices">
        <!--配置切点-->
        <aop:pointcut id="pointcut1" expression="execution(* com.springAOP.MyMath.*(..))"/>
        <aop:before method="before" pointcut-ref="pointcut1"/>
        <aop:after-returning method="after" pointcut-ref="pointcut1"/>
       <!-- <aop:after method="after" pointcut-ref="pointcut1"/>-->
        <aop:around method="around" pointcut-ref="pointcut1"/>
    </aop:aspect>
</aop:config>

使用注解:

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

(5)编码实战:

使用xml的advice类

/*
 * 通知类,横切逻辑
 * */
public class Advices {
    /*前置增强*/
    public void before(JoinPoint jp1) {
        System.out.println("-------前置通知-------");
        System.out.println(jp1.getSignature().getName());
    }

    public void after(JoinPoint jp){
        System.out.println("-------最终通知-------");
    }

    /*环绕增强*/
    public Object around(ProceedingJoinPoint pjp) throws Throwable{
        Object obj;
        System.out.println("方法前环绕");
        obj=pjp.proceed();
        System.out.println("方法后环绕");
        return obj;
    }

使用注解的xml类:

@Component
 @Aspect
 public class Advices2 {
 
 
     @Before("execution(* com.springAOP2.MyMath2.*(..))")
     public void Before(JoinPoint jp){
        System.out.println("-----前置通知-----");
         System.out.println(jp.getSignature().getName());
    }
 
     @After("execution(* com.springAOP2.MyMath2.*(..))")
     public void After(JoinPoint jp){
         System.out.println("-----后置通知-----");
     }
 
 }

这边使用了两种方法做演示,方法一和方法二需要修改classpath的配置文件

这个是测试文件:

@ContextConfiguration(locations = "classpath:springAOP2.xml")
 @RunWith(SpringJUnit4ClassRunner.class)
 public class TimeTest  {
 
 
 /*
     @Resource
     private MyMath myMath;*/
     @Resource
     private MyMath2 myMath2;
 //    @Test
 //    public void Test1(){
 //        int n1=100,n2=5;
 //        myMath.add(n1,n2);
 //    }
     @Test
     public void Test2(){
         int n1=100,n2=5;
         myMath2.del(n1,n2);
     }

(6)拓展思考:

基于注解与基于配置文件的优缺点:

注解:

1.更加简洁,不需要配置xml文件

2.更加方便,不需要从java代码在转到xml

3.更加语义化

缺点就是耦合度较大,依赖关系不如xml配置文件表达的清晰

(7)参考文献:

https://www.zhihu.com/question/278435266  知乎id:wayshall

https://www.cnblogs.com/liuruowang/p/5711563.html

http://www.cnblogs.com/zs234/p/3267623.html

(8)更多讨论:

(9)鸣谢:

感谢修真院的师兄,此教程是在他们之前技术分享的基础上完善而成。

(10)结束语:

今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~

PPT链接 视频链接

更多内容,可以加入IT交流群565734203与大家一起讨论交流

这里是技能树·IT修真院:https://www.jnshu.com,初学者转行到互联网的聚集地

猜你喜欢

转载自blog.csdn.net/jnshu_it/article/details/84614942
今日推荐