Spring之AOP思想

12 篇文章 0 订阅
订阅专栏

目录

什么是AOP

 ​​​为什么用AOP

Spring AOP 应该怎么学习呢

AOP下的一些核心概念(SpringAOP并没有实现所有的概念)

基于概念的使用Spring的AOP 

一个使用的实例

关于切点的匹配

通知的种类

 使用注解的方式来实现功能​编辑

AOP框架背后的核心 

需要实现两个原理

AOP的应用-事务场景

事务的概念 

事务的隔离性

 Spring的提供的一个事务切点@Transcctional​编辑


什么是AOP

  • AOP面对切面编程,它是一种思想,它是对某一类事情的集中处理。比如用户获奖权限的效验,没学 AOP 之前,我们所有需要判断用户获奖权限的页面(中的方法),都要各自实现或调用用户验证的方法,然而有了 AOP 之后,我们只需要在某一处配置一下,所有需要判断用户中将权限页面(中的方法)就全部可以实现用户用户中将权限验证了,不再需要每个方法中都写相同的用户登录验证了。而 AOP 是一种思想,而 Spring AOP 是一个框架,提供了一种对 AOP 思想的实现,它们的关系和 IoC与 DI 类似。
  • Spring下的AOP,Java AOP做的比较早的AspectJ库,是相当于做的比较早,Spring的AOP的在使用方式的时候,很多也延续了AspectJ的方式

 ​​​为什么用AOP

为什要用 AOP?想象一个场景,我们在做后台系统时,除了登录和注册等几个功能不需要做用户登录验证之外,其他几乎所有页面调用的前端控制器( Controller)都需要先验证用户登录的状态,那这个时候我们要怎么处理呢?

  • 我们之前的处理方式是每个 Controller 都要写一遍用户登录验证,然而当你的功能越来越多,那么你要写的登录验证也越来越多,而这些方法又是相同的,这么多的方法就会代码修改和维护的成本。那有没有简单的处理方案呢?答案是有的,对于这种功能统一,且使用的地方较多的功能,就可以考虑 AOP来统一处理了。
  • 在惊动原始设计的基础上进行功能增强

除了统一的用户登录判断之外,AOP 还可以实现

  • 统一日志记录
  • 统一方法执行时间统计
  • 统一的返回格式设置
  • 统一的异常处理
  • 事务的开启和提交等

也就是说使用 AOP 可以扩充多个对象的某个能力,所以 AOP 可以说是 OOP(Object OrientedProgramming,面向对象编程)的补充和完善。


Spring AOP 应该怎么学习呢

  • 1. 学习 AOP 是如何组成的?也就是学习 AOP 组成的相关概念。

  • 2. 学习 Spring AOP 使用。

  • 3. 学习 Spring AOP 实现原理。
     

AOP下的一些核心概念(SpringAOP并没有实现所有的概念)

Join Point连接点

  • 连接点是在应用执行过程中能够插入切面(Aspect)的一个点
  • 程序执行过程中的任意位置,粒度为执行方法,抛出异常,设置变量等
  • Spring AOP中仅支持方法的这一个连接点,所以在使用Spring AOP的时候,不太提这个概念

Advice通知

  • 在切入点执行的操作,也就是我们的公共业务

Point CUT 切入点

  • 切入点是一些特使的连接点,是具体附加通知的地方
  • 哪些方法被切入,也就是哪些方法需要添加公共业务(进行功能增强)

Aspect 切面

  • 逻辑概念,指的就是放置各种公共业务的,以及公共业务如何和具体的业务产生关系的配置的地方,
  • 切面(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑(我们的通知)的定义,也包括了连接点的定义。

基于概念的使用Spring的AOP 


Spring AOP 的实现步骤如下:

  • 1. 添加 Spring AOP 框架支持。导入相应的jar包
  • 2 定义接口和相应的实现类,也就是我们的程序,程序中的方法可以作为切入点,进行功能增强
  • 3. 定义通知类(存放我们的切面)@Aspect修饰方法,并且让这个通知类被Spring容器管理,生产对应的bean
  • 4 在通知类(切面)定义切入点,用PointCut()进行匹配对应的切入点
  • 5 进行我们的通知的定义(具体的增强功能的逻辑,用方法的形式实现),然后跟对应的切入点建立对应的联系 @Before之类
  • 6 开启对Aop注解驱动支持 (?好像SpringBoot会自动帮我们做这些配置)

注入相应的依赖

一个使用的实例

 定义切面

关于切点的匹配

  • Aspectl是Java的AOP领域的领头羊,所以它的方案基本就称为Java AOP的标准存在了,所以AspectJ定义一组表达式的语法,来描述Pointcut,所以Spring AOP也使用这种表达式,Spring AOP和AspectJ(也是一种AOP框架)之间其实是没有关系的 
  • 就像我们很多聊天软件都采用了这种聊天框

切点表达式由切点函数组成

其中 execution() 是最常用的切点函数,用来匹配方法,语法为:execution(<修饰符><返回类型><包.类.方法(参数)><异常>) 修饰符和异常可以省略。 

  • 动作关键字:execution 描述切入点的行为动作
  • 访问的修饰符
  • 返回值
  • 包名
  • 类名/接口名(一般匹配到接口比较好,降低耦合度)
  • 方法名 具体的切入点
  • 参数 对应切入点的参数
  • 异常名 方法定义中抛出的异常,可以省略

AspectJ 支持三种通配符:

  • * :匹配任意字符,只匹配一个元素(包,类,或方法,方法参数)。
  • .. :匹配任意字符,可以匹配多个元素 ,在表示类时,必须和 * 联合使用。
  • + :表示按照类型匹配指定类的所有类,必须跟在类名后面,如 com.cad.Car+ ,表示继承该类的所有子类包括本身。

  •  匹配表达式是写在@Pointcut()里面的
  • 切入点需要依靠一个无返回值的方法(最好可以是私有的),方法体是无实际逻辑的

通知的种类

  • 前置通知使用 @Before:通知方法会在目标方法调用之前执行
  • 后置通知使用 @After:通知方法会在目标方法返回或者抛出异常后调用。
  • 返回之后通知使用 @AfterReturning:通知方法会在目标方法返回后调用
  • 抛异常后通知使用 @AfterThrowing:通知方法会在目标方法抛出异常后调用。
  • 环绕通知使用 @Around:通知包裹了被通知的方法,在被通知的方法通知之前和调用之后执行自定义的行为。这个方法是很万能的,理论上有了Around可以实现上面四种

@Around的注意事项

  • 环绕通知必须依赖形参ProcessingJoinPoint才能对原始方法进行调用,进而实现原始方法调用前后的通知添加
  • 通知中若未使用ProcessingJoinPoint对原始方法执行,则会跳过原始方法的执行,这里我们可以实现权限验证
  • 对原始方法的调用可以不接收返回值,通知方法设置成void即可,但是如果接收,必须设定为Object
  • 原始方法的返回值如果是void类型,通知方法的类型也可以是void,也可以是Object
  • 由于无法原方法运行是否会抛出异常,因此环绕通知方法必须抛出Throwable对象

 使用注解的方式来实现功能

工作流程

  • Spring容器启动
  • 读取所有切面配置中的切入点(如果没匹配上,是不会读取的)
  • 初始化bean,判定bean对应的类中的方法是否匹配到了任意的切入点 1匹配失败,创建对象  2匹配成功,创建原始对象的代理对象
  • 获取bean的执行方法  1对于没有匹配到的连接点,直接获得原始对象的bean调用方法并执行,完成操作 2获取的是bean是原始对象的代理对象,根据代理对象的运行模式运行原始方法与增强的内容,完成操作

AOP框架背后的核心 

需要实现两个原理

对象代理

  • Spring AOP框架的核心原理,因此 Spring 对 AOP 的支持局限于方法级别的拦截
  • Spring AOP 支持 JDK Proxy 和 CGLIB 方式实现动态代理。现在Spring默认都是CGLJB方式

JDK Proxy vs CGLIB Proxy

  • JDK 实现,要求被代理类必须实现接口,之后是通过 InvocationHandler 及 Proxy,在运行时动态的在内存中生成了代理类对象,该代理对象是通过实现同样的接口实现(类似静态代理接口实现的方式),只是该代理类是在运行期时,动态的织入统一的业务逻辑字节码来完成。
  • CGLIB 实现,被代理类可以不实现接口,是通过继承被代理类,在运行时动态的生成代理类对象。
  • JDK Proxy只能针对接口做对象代理,而CGLib可以针对任意对象代理,所以它的适用场景更广
     

CGLib的实现代理

织入(Weaving):代理的生成时机
织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:

  • 编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
  • 类加载器:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ5的加载时织入(load-timeweaving. LTW)就支持以这种方式织入切面。
  • 运行期:切面在应用运行的某一时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象。SpringAOP就是以这种方式织入切面的

动态代理

  • 此种实现在设计模式上称为动态代理模式,在实现的技术手段上,都是在 class 代码运行期,动态的织入字节码。
  • 我们学习 Spring 框架中的AOP,主要基于两种方式:JDK 及 CGLIB 的方式。这两种方式的代理目标都是被代理类中的方法,在运行期,动态的织入字节码生成代理类。
  • CGLIB是Java中的动态代理框架,主要作用就是根据目标类和方法,动态生成代理类。
  • Java中的动态代理框架,几乎都是依赖字节码框架(如 ASM,Javassist 等)实现的。字节码框架是直接操作 class 字节码的框架。可以加载已有的class字节码文件信息,修改部分信息,或动态生成一个 class。

 简单实现

AOP的应用-事务场景

事务的概念 

  • 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。就是将这一组操作作为一个整体
  • 在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。

其实整体的概念就是保证一致性

  • 我们就引入显式事务这种概念 来告诉MySQ几条SQL语句是一个整体
  • 如果只是一条SQL吗,其实就是一个事务,称为隐式事务

 为了保证一致的四个特性

  •  Mysql的实现者在就保证了事务的四大特性
  • Mysql的使用者就要正确的Mysql提供事务原语

事务的隔离性

 Spring的提供的一个事务切点@Transcctional

事务的传播级别

 

  • 1. Propagation.REQUIRED:默认的事务传播级别,它表示如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • 2. Propagation.REQUIRES_NEW:表示创建一个新的事务,如果当前存在事务,则把当前事务挂起。也就是说不管外部方法是否开启事务,Propagation.REQUIRES_NEW 修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。
  • 3. Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • 4. Propagation.MANDATORY:(mandatory:强制性)如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

  • 5. Propagation.NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • 6. Propagation.NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  • 7. Propagation.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED。

 

理解AOP思想
weixin_43422096的博客
10-06 734
理解AOP思想1.aop定义:2.aop的理解:3.aop实现方式:3.1 Spring AOP 1.aop定义: AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业...
java之路——AOP知识详解以及程序中的应用
m0_68987535的博客
06-18 2016
在学习AOP中,来了解spring的主要内容。Spring 的核心内容包括IOC,AOP等。IOCSpring 的 IOC(Inversion of Control)是指通过容器帮用户管理组件及实现对象之间解耦。Spring 中的 IOC 容器可以自动管理对象之间的依赖关系和生命周期。用户只需要通过配置或者注解的方式告诉 Spring 哪些组件需要注入到哪些对象中,Spring 的 IOC 容器就会自动为用户完成依赖注入。AOPSpringAOP 是指基于切面的编程。
什么是AOPAOP能干什么,有什么优点
怪咖@的博客
10-10 1万+
什么是AOP 全称是 Aspect Oriented Programming 即:面向切面编程。是OOP的延续,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型。简单的说他就是把我们程序重复的代码抽取出来,在需要执行的时候使用动态代理技术在不修改源码的基础上,对我们的已有方法进行增强。 AOP能干什么 举个例子,你想给你的网站记录用户访问日志: 对某些url,是不用记录的,而有些是需要记录的 如果你依然使用OOP,面向对象, 那你只能在那些url对应的Controller代码里面,一个一个写
SpringAOP中的JointPoint和ProceedingJoinPoint使用总结
huluwa10526的博客
12-09 4523
一、Joint Point JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。 二、Pointcut pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。 pointcut通常包含了一系列的Joint Point,我们可以通过pointcut来同
ProceedingJoinPoint获取当前方法
热门推荐
Meiyang1990的博客
01-22 7万+
aspectJ切面通过ProceedingJoinPoint想要获取当前执行的方法: 错误方法:      Signature s = pjp.getSignature();     MethodSignature ms = (MethodSignature)s;     Method m = ms.getMethod(); 这种方式获取到的方法是接口的方法而不是具体的实现类
适用spring 实现AOP思想
04-12
NULL 博文链接:https://wujie2008.iteye.com/blog/1703058
Spring AOP核心编程思想教程
10-18
非常详细的介绍Spring AOP全栈技术点,开篇帮助同学们进行知识储备,...从Spring AOP概念开始引入,通过Spring AOP代理和判断模式进行,宝库各种模式,不断的深入学习,相信会给同学们带来不一样的Spring AOP技术体验。
Spring注解驱动之AOP功能测试
08-19
Spring注解驱动之AOP功能测试 Spring框架提供了一个强大的功能,即Aspect-Oriented Programming(面向方面编程),也就是AOPAOP是一种编程范式,它提供了一种将横切关注点模块化的方法,例如日志记录、安全检查...
理解Spring AOP实现与思想 案例代码
06-06
博客《理解Spring AOP实现与思想》案例代码,对Java技术感兴趣的朋友可以关注一下我,我在csdn为您准备了很多Java干货。
springAOP个人总结
01-21
aop(aspect oriented programming)面向切面编程是spring当中一个重要内容,在学习之后感觉这个思想挺不错的,做个总结 AOP讲解 一、面向切面编程 ​ 听说过面向对象编程(oop),但是面向切面编程还真是第一次...
Spring AOP--图解AOP思想
aq_112700的博客
07-27 3179
AOP使用场景:       可以看出上图场景导致代码冗余度特别高,这个问题我们可以采取两种办法来解决:    一,将复用代码抽取成一个方法,在需要的位置手动调用此方法    二,运用AOP思想,不需要在业务方法中手动调用抽取的方法,通过配置自动执行 方法一:  普通解决方案,比较简单,这里不再详细叙述。下面进入方法二------本篇文章的核心阶段。 方法二: 学习AOP思想之...
轻松理解Spring框架的AOP思想(面向切面编程)
程序猿_hw的博客
08-30 1万+
一、何为面向切面编程      本文旨在帮助还没有理解AOP的童鞋看透弄懂AOP,也欢迎高手批评指正。      先说一个Spring是什么吧,大家都是它是一个框架,但框架这个词对新手有点抽象,以致于越解释越模糊,不过它确实是个框架的,但那是从功能的角度来定义的,从本质意义上来讲,Spring是一个库,一个Java库,所以我个人觉得应该这样回答Spring是什么:Spring是一个库,它的功能...
Spring设计思想AOP设计基本原理
我的程序人生(亦山札记)
04-10 4万+
Spring 提供了AOP(Aspect Oriented Programming) 的支持, 那么,什么是AOP呢?本文将通过一个另外一个角度来诠释AOP的概念,帮助你更好地理解和使用Spring AOP。 读完本文,你将了解到: 1. Java程序运行在JVM中的特征 2. Java程序的执行流【了解AOP、连接点(Join Point)、切入点(point cut) 的概念 】 3. 引入了代理模式的Java程序执行流(AOP实现的机制) 4.
CGB2011-DAY11-12
qq_16804847的博客
03-15 5392
1.实现数据库读写分离/负载均衡 2.实现数据库高可用 3.redis实现缓存优化 (!!!!!)
Spring AOP 实现和一些核心思想
rose_zz的专栏
11-03 4328
1.什么是AOP     AOP(Aspect Oriented Programming) 即面向切面编程,是设计模式的延续。设计模式追求的是调用者和被调用者之间的解耦。 AOP 可以说是对此目标的一种实现。  AOP 的核心思想: 将应用程序中的商业逻辑和对其提供支持的通用服务进行分离。 AOP 相关术语   >> 连接点(Joinpoint)  程序执行的某个特定的位置: 如类的
AOP-2 AOP基本概念
诗人不写诗
05-07 590
对于切面使用者来说,需要关心的就是Pointcut和Advice,Pointcut扫描出所有要处理的地方,Advice定义切入逻辑,这2个就可以满足几乎所有切面使用者的需求。其他的概念几乎都是实现层面的概念,是深入理解切面才需要了解的。
AOP的应用以及代码实现(详细剖析)
我是老伯的博客
02-20 2199
AOP的应用以及代码实现(详细剖析)
关于AspectJ,你需要知道的一切
whatigame的博客
11-20 1896
前言 本文将介绍与AspectJ以及与其相关的内容,各方面内容的侧重点会有所不同,AspectJ将会进行详细的介绍,而其他方面的内容则重点在于辅助理解AspectJ的原理,便于更好地掌握AspectJ。 在Android中你要使用AspectJ,那么你就要懂得注解,要理解AspectJ的实现你就要懂得APT与动态代理,为什么要使用AspectJ你就要理解AOP与OOP的区别,这些不仅仅是学习A...
关于JoinPoint和ProceedingJoinPoint区别
BeijingJane的博客
02-19 1936
关于JoinPoint和ProceedingJoinPoint区别
spring aop aopalliance
最新发布
08-07
Spring框架中,将AOP联盟的接口以内嵌的形式放到了spring-aop包中,同时也引入了springframework包来实现AOP切面编程思想Spring AOP的最小拦截粒度是方法级别,它通过拦截连接点(即方法)来实现对方法的增强。...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 算法之动态规划 9121
  • C语言题目代码总结解析 7027
  • 超市管理系统 5814
  • 如何在IDEA中操作数据库——导入驱动包 5099
  • 如何实现前后端交互 4271

分类专栏

  • Java核心技术卷1 6篇
  • Maven学习 5篇
  • 前端 5篇
  • 微服务 5篇
  • JUC学习 15篇
  • JavaWeb基础 19篇
  • 深入理解Java虚拟机 10篇
  • 23种设计模式 24篇
  • SSM框架 10篇
  • SpingBoot 5篇
  • Git 3篇
  • Vue 5篇
  • Linux 5篇
  • 操作系统 59篇
  • Spring 12篇
  • 笔试强训 21篇
  • 总结回顾 3篇
  • Offer刷题 1篇
  • 项目 3篇
  • 多线程 10篇
  • 网络通信 11篇
  • 测试开发 5篇
  • 算法 18篇
  • DP 算法 12篇
  • JAVA 15篇
  • 安装工具 2篇
  • 数据结构 9篇
  • 数据库 15篇
  • LeetCode 5篇

最新评论

  • 算法之动态规划

    q1712812916: 写的很好,例子讲的也非常清除,代码写的非常漂亮

  • 算法之动态规划

    weixin_57451956: 讲的真棒

  • Java万物之父Object

    陌乐: 不对吧,p3和p1就是1个对象吧,他们会在equals中的==就是为true了

  • 第七章类加载机制和类加载器

    qq_42490598: 表情包表情包写的很棒表情包

  • 超市管理系统

    huanmm1: 可以要个源代码吗大佬

最新文章

  • File类与IO流
  • 第四章IDEA操作Maven
  • 第五章Maven依赖的特性-进阶篇
2024年1篇
2023年91篇
2022年263篇
2021年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

库里不会投三分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

深圳SEO优化公司南联网站优化软件沙井网站优化软件大运企业网站建设平湖百姓网标王双龙网站推广系统坪山网站搜索优化民治百度爱采购深圳外贸网站建设坪地建设网站丹竹头SEO按效果付费坂田设计公司网站双龙关键词按天收费永湖如何制作网站吉祥百度标王观澜百姓网标王双龙SEO按天收费永湖网站开发平湖网站推广工具罗湖网站推广方案南澳SEO按效果付费松岗优化福田网站seo优化丹竹头百度标王东莞网站制作木棉湾阿里店铺托管石岩关键词按天扣费丹竹头网站推广系统塘坑网站排名优化深圳网页设计民治百度seo歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化