面试被问到Spring AOP,你解释清楚了吗?

13 篇文章 1 订阅
订阅专栏

目录

1、什么是Spring AOP

1.1、什么是AOP

1.3、AOP与Spring AOP的关系

2、AOP的组成

2.1、切面(Aspect)

2.2、连接点(Join Point)

2.3、切点(Pointcut)

2.4、通知(Advice)

  通知分类:

3、Spring AOP实现步骤

3.1、添加Spring AOP依赖

 3.2、定义切面(创建切面类)

3.3、定义切点(配置拦截规则)

切点表达式说明:

3.4、定义通知的实现

4、Spring AOP实现原理 

4.1、织入

4.2、动态代理

JDK和CGLIB实现的区别:

4.3、原理:


1、什么是Spring AOP

1.1、什么是AOP

        官方回答:

        AOP(Aspect Oriented Programming):面向切面编程,它是一种思想,是对某一件事情的集中处理。

        看不懂没关系,继续往下看~

        举例说明

        例如我们要实现一个用户登录权限的校验,如果不使用AOP,我们就需要在所有的页面中都要各自实现或者调用用户登录验证的方法(出登录和注册页面不需要),而使用AOP后,我们只需要在某一处配置一下,就可以实现所有需要判断用户登录验证的地方进行用户登录验证了,不再需要每个方法中都写相同的用户登录验证了~

1.3、AOP与Spring AOP的关系

        AOP是一种思想,而Spring AOP是一个框架,提供了一种对AOP思想的实现,他们的关系类似于IoC和DI


2、AOP的组成

以下四部分:

2.1、切面(Aspect)

官方回答:

        切面(Aspect)由切点(Pointcut)和通知(Advice)组成,它既包含了横切逻辑的定义,也包括了连接点的定义

通俗理解:

        在程序中就是一个处理某方面具体问题的一个类。类里面包含了很多方法,这些方法就是切点和通知

2.2、连接点(Join Point)

官方回答:

        应用执行过程中能够插入切面的一个点,这个点可以是方法调用时,抛出异常时,甚至是修改字段时。切面代码可以利用这些点插入到应用的正常流程之中,并添加新的行为

通俗理解:

        可能会触发AOP规则的所有点(所有请求)

        也就是说,你要告诉AOP他要拦截哪些请求,例如上述的例子,你要告诉程序,除了登录和注册其他的请求都需要验证用户是否登录~

2.3、切点(Pointcut)

官方回答:

        Pointcut是匹配Join Point的谓词

        Pointcut的作用就是提供一组规则(使用AspectJ pointcut expression language来描述)来匹配Join Point,给满足规则的Join Point添加Advice

通俗理解:       

        用来进行主动拦截的规则(配置)

2.4、通知(Advice)

官方理解:

        在AOP术语中,切面的工作被称之为通知

        通知:定义了切面是什么,何时使用,其描述了切面要完成的工作,还解决何时执行这个工作的问题

通俗理解:

        程序中被拦截请求触发的具体动作(做什么事),就是在通知中实现具体的业务代码。

  通知分类:

  • 前置通知:使用注解@Before,通知方法会在目标方法调用之前执行
  • 后置通知:使用注解@After,通知方法会在目标方法返回或者抛出异常后调用
  • 返回之后通知:使用注解@AfterReturning,通知方法会在目标方法返回后调用
  • 抛异常后通知:使用注解@AfterThrowing,通知方法会在目标方法抛出异常后调用
  • 环绕通知:使用注解@Around,通知包裹了被通知的方法,在被通知的方法之前和调用之后执行自定义行为

AOP具体的执行动作:


3、Spring AOP实现步骤

3.1、添加Spring AOP依赖

创建Spring Boot项目,然后在Maven仓库中搜索AOP,添加依赖:

 3.2、定义切面(创建切面类)

import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Aspect //告诉序程序,这个一个切面类
@Component//随着框架的启动,面也要启动~
public class UserAspect {
    
}

3.3、定义切点(配置拦截规则)

    /**
     * 切点(配置拦截规则)
     */
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {
        
    }

切点表达式说明:

AspectJ支持三种通配符

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

 切点表达式由切点函数组成,其中executio()是最常用的切点函数,用来匹配方法,

语法为:execution(<修饰符><返回类型><包.类.方法(参数)><异常>)

  • 修饰符【一般省略】:如public 公共方法、*代表任意
  • 返回值【不能省略】:如void 返回没有值、String返回值字符串、*返回任意
  • 包:如:固定包com.cr、com子包下任意某包com.*.cr、com包下所有自包,包含自己com..  、com包下任意子包com.*.cr..
  • 类:如指定类、以xxx结尾的某些类、以xxx开头的某些类、任意类(*)
  • 方法名【不能省略】:如指定方法名、以xxx开头的方法、以xxx结尾的某些方法、任意(*)
  • 参数:如无参()、一个整型(int)、参数任意(..)

3.4、定义通知的实现

     /**
     * 前置通知
     */
    @Before("pointcut()")
    public void beforeAdvice() {
        System.out.println("执行了前置通知");
    }
    /**
     * 后置通知
     */
    @After("pointcut()")
    public void afterAdvice() {
        System.out.println("执行了后置通知");
    }

这样看代码,看不懂的哦?我们看一下我的目录

我们再捋一捋:

  我们在UserController类中,写两个方法,测试一下:

@RestController
@RequestMapping("/user")
public class UserController {
    
    @RequestMapping("/hi")
    public String sayHi() {
        System.out.println("执行了目标方法,sayHi()方法");
        return "hi,老朋友~";
    }
    
    @RequestMapping("/hello")
    public String sayHello() {
        System.out.println("执行了目标方法,sayHello()方法");
        return "hello,新朋友!!!";
    }
}

程序运行起来,前端:

后端控制台:

前端:

控制台:

咱们加一个类,当这个类不被拦截时:

@RestController
@RequestMapping("/art")
public class ArticleController {
    @RequestMapping("/hi")
    public String sayHi() {
        System.out.println("hi,hi,看到我了吗?");
        return "hi,hi,看到我了吗?";
    }
}

 程序运行,前端:

控制台:

说明AOP是起作用了的~

 再看一个环绕通知,其他的和前置通知和后置通知一样我就不举例啦~

    @Around("pointcut()")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {

        System.out.println("进入环绕通知");
        Object obj = joinPoint.proceed();//执行目标方法
        System.out.println("退出环绕通知");
        return obj;
    }

前端:

控制台:


4、Spring AOP实现原理 

前置小知识:

4.1、织入

织入(Weaving):代理的生成时机

        织入是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织入到目标对象中

在目标对象的生命周期里有多个点可以进行织入:

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

4.2、动态代理

        此种实现在设计模式上称为动态代理模式,在实现的技术手段上,都是在class代码运行期,动态的织入字节码

        Spring框架中的AOP,主要基于两种方式:JDK和CGLIB的方式。这两种方式的代理目标都是被代理类中的方法,在运行期,动态的织入字节码生成代码类

  • CGLIB是Java中的动态代理框架,主要作用就是根据目标类和方法,动态生成代理类
  • Java中的动态代理框架,几乎都是依赖字节码框架(如ASM、Javassist等)实现的
  • 字节码框架是直接操作class字节码的框架。可以加在已有的class字节码文件信息,修改部分信息,或动态生成一个class

JDK和CGLIB实现的区别:

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

4.3、原理:

        Spring AOP是构建在动态代理基础上的,因此Spring 对AOP的支持局限于方法级别的拦截

        Spring AOP支持JDKProxy和CGLIBProxy方式实现动态代理。默认情况下,对于非final修饰的类,Spring AOP会基于CGLIBProxy生成代理类,CGLIBProxy生成代理类的原理就是继承目标类,被关键字final修饰的类,由于不能被继承,所以会基于DKProxy生成代理类

        Spring AOP的本质就是生成一个目标对象的代理类,当前端传来请求时,不会将请求直接交给目标对象,而是首先代理类进行代理,如果满足一定的条件,才会将请求交给目标对象

        如果处理请求前需要登录验证,那么代理类会去验证用户账号是否登录,如果用户登陆了才会将请求交给目标对象并执行核心业务代码,否则代理类之间返回响应让用户先登录~

好啦~本期到这了就结束咯~晚安!!!

IOC和AOP以及spring框架的的面试
zzs1126的博客
04-03 456
在软件业,AOP为Aspect Oriented Programming的缩写,意味:面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,AOP是OOP的延续.将一些共性的内容进行抽取,在需要用到的地方,以动态代理的方式进行插入.在不修 改源码的基础上,还能对源码进行前后增强。属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性 注入。
IOC、AOP以及spring框架的面试汇总
weixin_65824274的博客
04-03 1793
属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性注入;在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件。
【建议收藏】2024年Java程序员必备面试题,2024年最新spring的ioc和aop面试
最新发布
ghfgjfg679的博客
04-17 324
机会是留给有准备的人,大家在求职之前应该要明确自己的态度,熟悉求职流程,做好充分的准备,把一些可预见的事情做好。对于应届毕业生来说,校招更适合你们,因为绝大部分都不会有工作经验,企业也不会有工作经验的需求。同时,你也不需要伪造高大上的实战经验,以此让自己的简历能够脱颖而出,反倒会让面试官有所怀疑。你在大学时期应该明确自己的发展方向,如果你在大一就确定你以后想成为Java工程师,那就不要花太多的时间去学习其他的技术语言,高数之类的,不如好好想着如何夯实Java基础。请转发本文支持一下。
Spring面试题】AOP相关面试题:概念?使用场景?如何使用?核心?
丨康有为丨的博客
09-06 430
AOP是面向切面,面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。对多个对象封装成一个模块叫,然后某个方法为。通俗的讲:就是在一些代码中做重复操作的时候,我们为了实现代码的复用性,统一去处理这些工作,让后让我们得操作自然的嵌入(用自定义注解)到指定方法的指定位置。利用AOP可以对业务逻辑 的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高 了开发的效率。
Spring面试(三)AOP
weixin_45773632的博客
03-16 689
文章目录1. 什么是AOP?2. Spring AOP术语3. advice(增强)的类型4. @Pointcut() 的execution表达式 1. 什么是AOPAOP (Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度
Spring框架学习--AOP面向切面编程
代码敌敌畏的博客
05-29 231
Spring框架学习--AOP面向切面编程 距离上一篇更新已经一个多月了。。。现在续上 AOP简介 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业...
Spring AOP 16道面试题及答案.docx
06-29
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
SpringAOP是什么?为什么要有SpringAOP
10-15
SpringAOP是什么?为什么要有SpringAOP
SpringAOP使用介绍,从前世到今生
02-24
SpringAOP发展到现在出现的全部3种配置方式。由于Spring强大的向后兼容性,实际代码中往往会出现很多配置混杂的情况,而且居然还能工作,本文希望帮助大家理清楚这些知识。我们先来把它们的概念和关系说说清楚AOP...
spring aop 自定义注解保存操作日志到mysql数据库 源码
11-25
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
Spring面试之不同版本AOP执行顺序详解
a1k2l45k的博客
12-28 849
aop切面顺序
springAOP面试
drhrht的博客
08-02 1530
一般称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。...
springAOP常见面试题解析
weixin_46221109的博客
03-16 1044
1.什么是 aopaop是面向切面编程,不同于java原始的oop是面向对象编程,使用aop可以实现不需要修改原功能代码,只需要修改一下配置,即可实现功能的扩展 aop采用的是横向抽取机制,取代了传统的纵向继承体系,减少了重复性代码 运行期间通过代理方式向目标类植入增强代码 经典的应用场景有事务的管理,安全检查,缓存,性能监控等等 2.aop的实现原理? aop底层是采用动态代理机制实现的:接...
面试时问aop是什么该怎么回答
baidu_28366941的博客
02-29 5583
只说aop是面向切面编程只是个很基础的概念,看过点教程的初学者都知道所以必须得深化点,你得告诉他,aop实现原理其实是java动态代理,但是jdk的动态代理必须实现接口,所以springaop是用cglib这个库实现的,cglib使用了asm这个直接操纵字节码的框架,所以可以做到不实现接口的情况下完成动态代理。
Spring AOP IOC 实现原理,面试问到如何回答
热门推荐
monkeyduck的专栏
01-11 5万+
IOC:控制反转也叫依赖注入,IOC利用java反射机制,AOP利用代理模式。所谓控制反转是指,本来被调用者的实例是有调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理创建,将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中
面试题思考:解释一下什么叫AOP(面向切面编程)
weixin_30815427的博客
08-04 353
这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。 AOPSpring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。 使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。 从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。 这些系统性的编程工作都...
SpringBoot使用AOP问题汇总
雪落南城的博客
03-01 751
1、外部引入的AOP切面没有生效 由于aop的service是外部引入的(需加@Component) 故没有被注册成bean 需要手动注册一下 @Bean public CatAopService catAopService() { return new CatAopService(); } 2、横切的方法没有返回数据 只需要在切面处理的时候定义返回值即可 @CatAnn...
Spring--IOC
小虾米的博客
01-26 265
https://blog.csdn.net/dkbnull/article/details/87219562 控制反转,简单点说,就是创建对象的控制权,被反转到了Spring框架上。 通常,我们实例化一个对象时,都是使用类的构造方法来new一个对象,这个过程是由我们自己来控制的,而控制反转就把new对象的工交给了Spring容器。 IoC的主要实现方式有两种:依赖查找、依赖注入。 依赖注入...
Spring AOP是如何利用IOC?
12-20
Spring AOP利用IOC(控制反转)来实现对目标类的增强。在Spring框架中,通过IOC容器来管理和创建对象,而不是由开发者手动创建对象。当使用Spring AOP时,我们可以将切面(Aspect)定义为一个普通的Java类,并使用IOC容器来创建和管理切面对象。 具体来说,Spring AOP通过以下步骤来利用IOC实现对目标类的增强: 1. 在Spring配置文件中定义切面(Aspect)类,并将其声明为一个Bean。例如: ```xml <bean id="myAspect" class="com.example.MyAspect"></bean> ``` 2. 在切面类中定义增强(Advice)方法,例如@Before、@After等。这些增强方法将在目标类的特定方法执行前后被调用。 3. 在Spring配置文件中定义目标类,并将其声明为一个Bean。例如: ```xml <bean id="myService" class="com.example.MyService"></bean> ``` 4. 在Spring配置文件中配置AOP代理,将切面和目标类关联起来。例如: ```xml <aop:config> <aop:aspect ref="myAspect"> <aop:pointcut expression="execution(* com.example.MyService.*(..))" id="myPointcut"/> <aop:before method="beforeAdvice" pointcut-ref="myPointcut"/> </aop:aspect> </aop:config> ``` 在上述配置中,我们将切面类(myAspect)和目标类(myService)关联起来,并指定了切入点(pointcut)和增强方法(beforeAdvice)。 通过以上步骤,Spring AOP会在运行时动态地创建代理对象,并将增强逻辑织入到目标类的方法中。这样,当目标类的方法被调用时,增强方法会在特定的时机被执行,实现对目标类的增强。

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

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

热门文章

  • (c语言——递归)输入一个十进制整数,将其转化为二进制数输出 13366
  • (C语言)输入一个整数,输出其位数并逆序输出 12322
  • 七分钟教会你如何编写一个合格的测试用例 9415
  • 性能测试工具——Jmeter的安装【超详细】 8625
  • (C语言) 题目:对10个整数进行排序 (升序)(拓展qsort函数) 6077

分类专栏

  • playwright 付费 10篇
  • 测试 35篇
  • MySQL 3篇
  • 计算机网络 12篇
  • 面试 10篇
  • 多线程 6篇
  • 操作系统 5篇
  • Java 36篇
  • Vue 10篇
  • 前端 12篇
  • uni-app 1篇
  • Python 4篇
  • JVM 1篇
  • Redis 21篇
  • MySQL练习题 1篇
  • OJ项目 5篇
  • Token 2篇
  • 项目部署 3篇
  • Docker 5篇
  • Spring 13篇
  • Django 3篇
  • 移动端UI 1篇
  • Linux 1篇
  • 记录 8篇
  • 高阶数据结构 6篇
  • 数据结构 8篇
  • LeetCode 9篇
  • Selenium 2篇
  • 指针 5篇
  • C语言 14篇

最新评论

  • 【pytest、playwright】allure报告生成视频和图片

    qq_1737381936: 什么够吧,这也要收费

  • 【pytest、playwright】allure报告生成视频和图片

    qq_1737381936: 为什么d s d

  • 性能测试工具——Jmeter的安装【超详细】

    Run 等待: 那你就把超详细删了吧。这详细个毛线,还盘古开天,你去工地上班吧,别写文档了。

  • 性能测试工具——Jmeter的安装【超详细】

    海螺炒面: 你不会去java安装详细配置看?要不要从盘古开天给你讲起表情包

  • 计算机网络——应用层重点协议【HTTP协议】

    龙洋静: GET 请求的幂等性 幂等性(Idempotence)意味着对同一资源的多次请求应该具有相同的效果,即无论这个请求被执行多少次,结果都是一样的。 对于 GET 请求来说,它只是简单地请求获取某个资源。无论您发送多少次相同的 GET 请求,服务器都会返回相同的资源表示。因此,GET 请求是幂等的。 POST 请求的非幂等性 与 GET 请求不同,POST 请求通常用于提交数据到服务器以创建新的资源。每次发送 POST 请求时,都可能会在服务器上产生新的副本或状态更改。 例如,如果您使用 POST 请求提交表单数据来创建一个新的用户账户,那么每次提交都会创建一个新的用户账户。这意味着,如果您多次发送相同的 POST 请求,将会在服务器上创建多个用户账户,而不是简单地更新或检索现有资源。因此,POST 请求通常不是幂等的。 注意 虽然 POST 请求通常不是幂等的,但在某些情况下,可以通过实现特定的业务逻辑来使 POST 请求具有幂等性。例如,您可以在服务器端实现一种机制,该机制在接收到 POST 请求时检查是否已经存在具有相同数据的资源,并据此决定是否创建新资源或返回现有资源的表示。 此外,还有其他 HTTP 方法,如 PUT、DELETE 和 PATCH,它们各自具有不同的幂等性特性。在设计 RESTful API 时,了解并正确使用这些方法是非常重要的。

大家在看

  • 自定义模板打造专属炫酷的CSDN个人主页!HTML+CSS个性化DIY全攻略 59

最新文章

  • Playwright的browser、context、page三层结构
  • Cookie和Session的区别?
  • playwright-断言
2024年25篇
2023年89篇
2022年76篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为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 网站制作 网站优化