Spring中AOP的实现原理

41 篇文章 0 订阅
订阅专栏
22 篇文章 0 订阅
订阅专栏

一、什么是 AOP ?

AOP(Aspect-Oriented Programming,面向方面编程),对 OOP(Object-Oriented Programming,面向对象编程)
clipboard.png

  • 【OOP与AOP】
    • 概念
      • AOP(Aspect-Oriented Programming,面向方面编程)
      • OOP(Object-Oriented Programming,面向对象编程)
    • 方向
      • OOP 定义从上到下的关系
      • AOP 定义从左到右的关系
  • 【两个部分】
    • 核心关注点
      • 业务处理的主要流程
    • 横切关注点
      • 与业务主要流程关系不大的部分
      • 经常发生在核心关注点的多处,而各处都是基本相似的功能
      • 如权限认证、日志、事务处理

二、AOP 使用场景

1、AOP框架种类

  • AspectJ
  • JBoss AOP
  • Spring AOP

2、使用 AOP 场景

  • 性能监控:在方法调用前后记录调用事件,方法执行太长或超时报警。
  • 缓存代理:缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。
  • 软件破解:使用AOP修改软件的验证类的判断逻辑。
  • 记录日志:在方法执行前后记录系统日志。
  • 工作流系统:工作流系统需要将业务代码和流畅引擎代码混合在一起执行,那么可以使用 AOP 将其分离,并动态挂载业务。
  • 权限验证:方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕获。

3、传统编码与AOP区别

clipboard.png

三、核心概念

clipboard.png
【术语】

  • 切面(Aspect):
    一个关注点的模块化,这个关注点可能会横切多个对象。
    事务管理是 J2EE 应用中一个关于横切关注点的很好列子。
    在 Spring AOP 中,切面可以使用基于模式或者基于 @Aspect 注解的方式来实现。
  • 连接点(Joinpoint):
    在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。
    在 Spring AOP 中,一个连接点总是表示一个方法的执行。
  • 切入点(Pointcut):
    匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如:当执行某个特定名称的方法时)。
    切入点表达式如何和连接点匹配是 AOP 的核心:Spring 缺省使用 Aspect 切入点语法。
  • 引入(Introduction):
    用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration))
    Spring 允许引入新的接口(以及一个对应的实现)到任何被代理的对象。例如,可以使用引入来使一个 bean 实现 isModified 接口,以便简化缓存机制。
  • 目标对象(Target Object):
    被一个或者多个切面所通知的对象,也被称为通知(advised)对象。
    既然 Spring AOP 是通过运行时代理实现的。这个对象永远是一个被代理(proxied)对象。
  • AOP 代理(AOP Proxy):
    AOP 框架创建的对象,用来实现切面契约(例如,通知方法执行等等)。
    在 Spring 中,AOP 代理可以是 JDK 动态代理或者 CGLIB 代理。
  • 织入(Weaving):
    把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时(例如使用 AspectJ 编译器),类加载时和运行时完成。Spring 和其他纯 Java AOP 框架一样,在运行时完成织入。
  • 通知(Advice):
    在切面的某个特定的连接点上执行的动作。其中包括“around”、“before” 和 “after” 等不同类型的通知。
    许多 AOP 框架(包括 Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。

【通知类型】

  • 前置通知(Before advice):
    @Before
    在某连接点之前执行的通知,但这个通知不能阻止了连接点之前的执行流程(除非它抛出一个异常)。
  • 后置通知(After returning advice):
    @After
    在某连接点正常完成后执行的通知,例如,一个方法么有抛出任何异常,正常返回。
  • 异常通知(After throwing advice):
    @After-returning
    在方法抛出异常退出时执行的通知。
  • 最终通知(After(finally)advice):
    @After-throwing
    当某连接点退出的时候执行的通知(不论是正常退出还是异常退出);
  • 环绕通知(Around advice):
    @Around
    包围一个连接点的通知,如方法调用,这是最强大的一种通知类型。

三、简单例子

1、基于注解的方式

@Aspectj 
public class TransactionDemo {
    @Pointcut(value="execution(* com.yangxin.core.service.*.*.*(..))")
    public void point() { //... }
    
    @Before(value="point()")
    public void before() {
        System.out.println("transaction begin");
    }
    
    @AfterReturning(value = "point()")
    public void after() {
        System.out.println("transaction commit");
    }
    
    @Around("point()")
    public void around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("transaction begin");
        joinPoint.proceed();
        System.out.println("transaction commit");
    }
} 

在 applicationContext.xml 中配置:

<aop:aspectj-autoproxy />
    <bean id="transactionDemo" class="com.yangxin.core.transaction.TransactionDemo" />   

2、基于 XML 的方式

<aop:config>
    <aop:aspect ref="log">
        <aop:pointcut
                expression="(execution(* spring.ch3.topic1.Chief.*(..)))"
                id="chiefPointCut" />
        <aop:before method="washOven" pointcut-ref="chiefPointCut" />
        <aop:before method="prepare" pointcut-ref="chiefPointCut" />
        <aop:after method="after" pointcut-ref="chiefPointCut" />
    </aop:aspect>
</aop:config>
    

四、Spring AOP 原理

AOP 代理其实是由 AOP 框架动态生成的一个对象,该对象可作为目标对象使用。
AOP 代理包含了目标对象的全部方法,但 AOP 代理中的方法与目标对象的方法存在差异:AOP 方法在特定切入点添加了增强处理,并回调了目标对象的方法。
clipboard.png

Spring 的 AOP 代理由 Spring 的 IoC 容器负责生成、管理,其依赖关系也由 IoC 容器负责管理。因此,AOP 代理可以直接使用容器中的其他 Bean 实例作为目标,这种关系可由 IoC 容器的依赖注入提供。

aop开发时,其中需要参与开发的只有 3 个部分:

  • 定义普通业务组件。
  • 定义切入点,一个切入点可能横切多个业务组件。
  • 定义增强处理,增强处理就是在 AOP 框架为普通业务组件织入的处理动作。

五、两种动态代理方式

Spring默认采取的动态代理机制实现AOP,当动态代理不可用时(代理类无接口)会使用CGlib机制。

Spring提供了两种方式来生成代理对象: JDKProxy和Cglib,具体使用哪种方式生成由AopProxyFactory根据AdvisedSupport对象的配置来决定。默认的策略是如果目标类是接口,则使用JDK动态代理技术,否则使用Cglib来生成代理。

1、JDK 动态代理

  • JDK动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编制在一起。
  • Proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。

2、CGLib动态代理

  • CGLib全称为Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展Java类与实现Java接口,CGLib封装了asm,可以再运行期动态生成新的class。和JDK动态代理相比较:JDK创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过CGLib创建动态代理。

六、补充实例

clipboard.png

package springMVCmybatis.com.my.aop;
import org.aspectj.lang.annotation.Aspect; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Before; 
import org.aspectj.lang.annotation.Pointcut; 
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.After; 
import org.aspectj.lang.annotation.AfterReturning; 
import org.aspectj.lang.annotation.AfterThrowing; 
import org.springframework.core.annotation.Order;

@Aspect
@Order(3)
public class MyAopTest {
    @Pointcut("execution(* springMVCmybatis.addController.addEmp(..))")
    private void pointCutMethod() { //... }
    
    @Pointcut("execution(* springMVCmybatis.com.my.aop.UserServiceImp.*(..))") 
    private void testAOP() { //... }
    
    /**
    * 声明前置通知 ,JoinPont是srpring提供的静态变量,
    * 通过joinPoint参数可以获得目标方法的类名,方法参数,方法名等信息,这个参数可有可无。
    */
    @Before("pointCutMethod() || testAOP()") 
    public void doBefore(JoinPoint joinPoint) { 
        System.out.println("@Before:开始添加--order=3"); 
    } 
    
    /**
    * 声明后置通知 ,如果result的类型与proceed执行的方法返回的参数类型不匹配那么就不会执行这个方法
    */
    @AfterReturning(pointcut = "pointCutMethod()  || testAOP()", returning = "result") 
    public void doAfterReturning(String result) { 
        System.out.println("@AfterReturning:后置通知--order=3"); 
        System.out.println("---" + result + "---"); 
    } 
    
    /**
    * 声明例外通知 
    */
    @AfterThrowing(pointcut = "pointCutMethod() || testAOP()", throwing = "e") 
    public void doAfterThrowing(Exception e) { 
        System.out.println("@AfterThrowing:例外通知--order=3"); 
        System.out.println(e.getMessage()); 
    }
    
    /**
    * 声明最终通知
    */
    @After("pointCutMethod() || testAOP()") 
    public void doAfter() { 
        System.out.println("@After:最终通知--order=3"); 
    } 

    /**
    * 声明环绕通知
    * 参数必须是ProceedingJoinPoint,通过该对象的proceed()方法来执行目标函数,
    * proceed()的返回值就是环绕通知的返回值,proceedingJoinPoint是个接口,
    * implement JoinPoint,所以也可以获得目标函数的类名,方法名等参数。
    */
    @Around("pointCutMethod() || testAOP()") 
    public Object doAround(ProceedingJoinPoint pjp) throws Throwable { 
        System.out.println("@Around:进入方法---环绕通知--order=3"); 
        Object o = pjp.proceed(); 
        System.out.println("@Around:退出方法---环绕通知--order=3"); 
        return o; 
    }
}

七、切点表达式

1、方法签名表达式

execution(<修饰符模式>?<返回类型模式><方法所在类的完全限定名称模式>(<参数模式>)<异常模式>?)
execution(modifiers-pattern? ret-type-pattern fully-qualified-class-name (param-pattern) throws-pattern?)   

对比方法的定义来记忆,一个java方法的全部定义方式可以表示成下面的方式:

public String springMVCmybatic.com.my.aop.UserServiceImp(String a, int b) throw Exception{}
  • modifier-pattern?:表示方法的修饰符,可有可无;对应的就是 public
  • ret-type-pattern:表示方法的返回值;对应的就是 String
  • fully-qualified-class-name 方法所在类的完全限定名称;对应的就是 springMVCmybatic.com.my.aop.UserServiceImp
  • param-pattern:表示方法的参数;对应的就是 String a, int b
  • throws-pattern:表示方法抛出的异常,可有可无;对应的就是 throw Exception

2、&&,||,!(表达式之间可以采用与,或,非的方式来过滤。)

@Around("pointCutMethod() || testAOP()") 
public Object doAround(ProceedingJoinPoint pjp) throws Throwable { 
    System.out.println("@Around:进入方法---环绕通知"); 
    Object o = pjp.proceed(); 
    System.out.println("@Around:退出方法---环绕通知"); 
    return o; 
}

八、多个切点的执行顺序

上面的例子中,定义了order=3,重新创建一个切面,定义order=6,执行的结果是:

@Around:进入方法---环绕通知--order=3
@Before:开始添加--order=3
@Around:进入方法---环绕通知--order=6
@Before:开始添加--order=6
============执行业务方法findUser,查找的用户是:张三=============
@Around:退出方法---环绕通知--order=6
@After:最终通知--order=6
@AfterReturning:后置通知--order=6
---张三---
@Around:退出方法---环绕通知--order=3
@After:最终通知--order=3
@AfterReturning:后置通知--order=3
---张三---
 
 
@Around:进入方法---环绕通知--order=3
@Before:开始添加--order=3
@Around:进入方法---环绕通知--order=6
@Before:开始添加--order=6
============执行业务方法addUser=============
@After:最终通知--order=6
@AfterThrowing:例外通知--order=6
null
@After:最终通知--order=3
@AfterThrowing:例外通知--order=3
null

从结果中可以看出order越小越先执行,执行完了之后就order越小就越后推出。总结为下面的图:
clipboard.png

spring

Spring AOP实现原理详解及实例
10-19
主要介绍了Spring AOP实现原理详解及实例的相关资料,需要的朋友可以参考下
Spring——AOP原理及流程详解
共勉
11-28 7930
基于5.3.9 版本的Spring源码,对AOP原理及流程详解,AOP是在Bean生成流程什么位置介入处理的?各个通知方法又是怎么组装的?AOP真的只是动态代理这么简单吗?
SpringAOP的详细讲解
最新发布
tq02的博客
04-09 1163
本文讲解的是SpringAOP,将切点、切面、通知点,逐步剖析,代码举例,配合理解!
springAop实现原理
ChenJin_2的博客
06-02 2275
springAop实现原理
Spring框架的AOP实现原理
qq_59510147的博客
11-20 1888
AOP:面向切面编程,是将那些与业务无关(比如有事务处理,日志管理,权限控制等),但要为业务模块共同调用的逻辑封装成一个可重用的模块,这个模块被称为切面,便于减少系统的重复代码,降低模块间的耦合度,有利于未来的可拓展性和可维护性。另一个为Proxy类,我们可以通过这个类的newProxyInstance()方法,返回一个代理对象,生成的代理类实现了原来类的所有接口,然后对这些接口进行代理,通过代理对象调用这些方法,底层通过反射来调用我们实现的invoke()方法。此通知可以在方法调用前后完成自定义的行为。
Spring AOP功能实现
weixin_44697633的博客
04-15 750
一、AOP的基本概念: 1、什么是aopAOP(Aspect Oriented Programming)称为面向切面编程,在程序开发主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子。在不改变原有的逻辑的基础上,增加一些额外的功能。代理也是这个功能,读写分离也能用aop来做。AOP可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层.
SpringAOP 原理详解
20年码农
04-14 2048
AOP是一种编程范式,用于在不修改原始代码的情况下向现有应用程序添加新功能。这种编程方式将应用程序分成许多独立的部分,称为切面。这些切面可以在应用程序的不同位置进行编写和维护,从而提高了应用程序的可重用性和可维护性。AOP主要用于实现横切关注点(Cross-Cutting Concerns),例如日志记录、性能监测、事务管理等。通过AOP,我们可以将这些关注点与应用程序的其他部分分离开来,从而使应用程序更加模块化和易于维护。
深入浅析Springaop实现原理
09-02
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。本文给大家介绍Springaop实现原理,感兴趣的朋友一起学习吧
spring aop实现原理
03-15
NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927
Spring AOP实现原理解析
08-28
Spring AOP实现原理解析 Spring AOP(Aspect-Oriented Programming)是一种面向方面编程的技术,它可以将公共行为封装到一个可重用模块,以减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可...
深入理解springAOP机制原理
08-29
Spring AOP 是通过代理模式来实现的。SpringAOP 机制可以分为三个部分:切面(Aspect)、连接点(Joinpoint)和通知(Advice)。 切面(Aspect) 切面是一个特殊的类,它封装了横切关注点的逻辑。切面...
Spring AOP —— 详解、实现原理、简单demo
CYK_byte的博客
03-05 2306
AOP 就是面向切面的编程, 是一种思想,是对某一类事情的集处理。
Spring AOP 技术实现原理
xdpcxq的专栏
01-20 646
Spring AOP实现基于代理模式,通过代理对象来包装目标对象,实现切面逻辑的注入。通过本文,我们深入了解了Spring AOP是如何基于JDK动态代理和CGLIB代理技术实现的。通过详细的示例演示,希望读者能更清晰地理解Spring AOP的底层原理,并在实际项目灵活应用这一强大的技术。
Spring AOP实现原理 ?
yygr的博客
03-11 1708
Spring AOP实现原理 ? - 知乎 AOP实现,最关键的有两步: 得到代理对象 利用递归责任链执行前后置通知及目标方法 IOC容器初始化时,对于涉及AOP操作的目标类,其实Spring返回的是代理对象,而不是目标类的实例。至于Spring是如何创建AOP代理对象的,这里不做讨论,我们只讨论得到代理对象后的链式调用流程。 代理对象proxy其实包含了很多东西,比如: 目标对象 增强器 ... 之前我曾经写过一篇动态代理相关的回答:Java 动态代理作用是什么? 大概就是讲了..
SpringAOP实现原理
m0_57229961的博客
01-27 9309
本学习笔记将尽可能的将AOP的知识讲解的通俗易懂,先从一个典型的问题出发,引入AOP这个概念,介绍AOP的基本概念,再到SpringAOP实现方案,最后进行一个简单的总结归纳。本学习笔记不考虑cglib、也不会太关注Spring AOP如何使用,而是尽可能的简单的说清楚AOP的工作原理。 笔记贴出的源代码均是Spring 5.1.7-RELEASE 版本 问题提出 如下代码块,现在需要统计这个方法执行的耗时情况 public void runTask() { doSome
Spring 框架之 AOP 原理深度剖析
qq13321123的博客
05-10 1873
Spring AOP是基于代理和动态代理技术实现的切面编程框架,通过将业务逻辑分解为多个部分来提高代码的复用性和可维护性。在实现过程Spring AOP主要通过Advisor、Pointcut、Advice、JoinPoint和ProxyFactory等核心接口来管理和织入切面代码。在使用Spring AOP时,我们需要定义切面类、连接点和切入点,并通过Spring配置文件aop:config和aop:aspect标签来指定各种通知类型。
SpringSpring AOP 初识及实现原理解析
xyk:的博客
08-05 2305
AOP(Aspect Oriented Programming):面向切面编程,它是⼀种思想,它是对某⼀类事情的集处理。在我们想要对某一件事情进行集处理,就可以使用到AOP,它提供一种将程序的横切关注点模块化的方式。在 AOP ,我们将这些横切关注点称为“切面”,它们独立于业务逻辑模块,但是可以在程序运行的不同阶段被织入到业务逻辑。简单来说,AOP 就是对某一件事进行集处理的思想方式~使用@Aspect@Component // 随着框架的启动而启动。
Spring AOP 实现原理和使用场景
兴趣是最好的老师,勤能补拙
03-09 3345
Spring AOP 是通过在目标方法执行前、执行后、抛出异常时等切入点执行切面代码的一种机制。其实现原理是使用动态代理技术,在方法运行时动态生成代理对象,然后插入切面代码。当执行目标方法时,由动态代理对象拦截方法并在适当的时间点执行切面代码,然后再调用实际的目标方法。在 Spring 定义切面,提供一些特定的注解,如 @Before、@After、@Around 等,将切面适切地应用于业务逻辑
Spring AOP实现原理与应用场景
glamour2015的博客
02-22 2750
实现原理 AOP(Aspect-OrientedProgramming,面向方面编程):是OOP的补充和完善。OOP引入了封装、继承、多态性等建立一种对象层次结构(从上到下的关系)。当需要为分散的对象引入公共行为的时候(从左到右的关系),OOP就显得无能为力。例如:日志功能。日志代码往往水平的散步所有对象层次,与对象的核心功能毫无关系。这种代码被称为横切(cross-cutting)代码还有像安...
springaop实现原理
05-10
Spring AOP实现原理主要是基于动态代理,它通过代理对象来控制访问目标对象的过程。当我们在应用使用AOP时,Spring会在运行时动态地创建一个代理对象,该代理对象包含了目标对象的所有方法,并且可以在目标对象的方法执行前后加入额外的逻辑。 Spring AOP实现过程分为以下几步: 1.定义切点:指定在哪些方法上应用AOP。 2.定义通知:在方法执行前、后或出现异常时执行的代码。 3.创建代理对象:Spring使用JDK动态代理或CGLib动态代理技术创建代理对象。 4.代理对象调用目标对象:代理对象拦截目标对象的方法调用,并在执行通知之后再调用目标对象的方法。 在实际应用,我们可以通过配置文件或注解的方式来定义切点和通知,Spring会根据配置自动生成代理对象。 总之,Spring AOP实现原理主要是基于动态代理和切面编程思想,通过代理对象控制访问目标对象的过程,并在方法执行前后加入额外的逻辑,实现了面向切面编程的目的。

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

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

热门文章

  • 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 22210
  • Spring中AOP的实现原理 10792
  • DNS解析过程 6143
  • 四种常见的线程池 5838
  • 宽表和窄表概念和优缺点 4648

分类专栏

  • java面试 21篇
  • java 41篇
  • spring boot 22篇
  • 网络 9篇
  • mysql面试 4篇
  • 中间件 6篇
  • Redis 4篇
  • url 2篇
  • http编码方式 1篇
  • 算法 1篇
  • 数据结构与算法 2篇
  • docker 2篇
  • JVM 1篇
  • maven 1篇
  • elasticsearch 7篇
  • 时区|时间 1篇
  • 阿里云 2篇
  • lambda 2篇
  • cmd 1篇
  • 编码字符 1篇
  • Lombok 1篇

最新评论

  • 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    _JC_Chris: 动图太棒了!

  • 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    事了拂喵去: 清晰明了

  • 基于Zookeeper + Dubbo 搭建的项目

    宏远十一冠王: 博主可以分享一下代码,或者分享一下仓库的链接吗?

  • 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    造势: 有小辈就出来

  • 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)

    D€W: 讲的真好

大家在看

  • 深度神经网络在哪些领域应用最广泛?
  • 多处理机操作系统:提高计算机系统性能的关键
  • Python 迭代器与生成器 842
  • 127.0.0.1与本机IP地址的区别 858
  • 【调试笔记-20240617-Linux- frp 结合 nginx 实现内网网站在公网发布】 1300

最新文章

  • Collector原理解析
  • 阻塞队列 — DelayedWorkQueue源码分析
  • 地址栏输入URL到显示页面的过程
2022年8篇
2021年75篇
2020年12篇

目录

目录

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳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 网站制作 网站优化