基于注解的Spring(IOC+AOP)

news/2024/5/28 21:31:42/

目录

这是基于黑马Spring的笔记

写再前面

开始

 @Component(value=bean的名称) 

componet衍生出的3个注解

Bean内部的属性进行注入

非自定义的Bean管理

使用配置类完全替代XML配置文件

 配置类中的注解

spring中的其他注解(偶尔会用到)

 Spring注解的解析原理

spring使用注解整合第三方框架mybatis

XML和@Mapperscan注解整合Mybatis的底层原理:

@import整合第三方框架

基于注解的AOP


写再前面

IOC和AOP都是面向切面编程(Aspect-Oriented Programming)的实现方法。

它们提供了一种抽象机制,可以实现在程序运行期动态地将额外功能插件到现有代码中。

IOC全称是Inversion of Control,即控制反转。它是Spring框架的核心,可以实现对象之间的依赖注入。基于IOC,对象的依赖关系由容器在运行期决定,完成对象的装配。这可以降低对象之间的耦合,使设计更加灵活。

AOP全称是Aspect-Oriented Programming,即面向切面编程。它可以实现在不修改源代码的情况下,为程序动态添加功能。在程序执行过程中,AOP可以在合适的连接点(如方法调用前/后),插入切面来修改程序逻辑。这有助于实现诸如日志、安全等通用功能,而不用在业务逻辑代码中夹杂各种非业务逻辑。

简单来说,IOC和AOP的区别在于:

- IOC 注重在对象创建与依赖注入,目的在于降低耦合、增强灵活性。它由容器在运行期决定对象依赖关系。

- AOP 注重在动态插入切面来影响程序运行逻辑,目的在于实现通用功能而不改变原有代码。它允许在程序运行期间插入切面来修改逻辑。所以,尽管IOC和AOP都属于面向切面编程范畴,但侧重点不同:

- IOC侧重对象的依赖关系注入,实现解耦和灵活设计。

- AOP侧重在运行期动态修改程序逻辑,实现通用功能的插入。两者都是实现高内聚低耦合的有效手段,广泛应用在企业级框架与项目中。Spring就是典型代表,它同时采用IOC和AOP实现解耦、通用功能和业务逻辑分离。

通过b站上的黑马的spring课程做的笔记。

Spring 3.0时代,进入全注解时代。S

pringboot就是一个几乎零配置的企业级开发框架。

开始

 在不使用配置类时在applicationcontext配置文件中引入(后面也可以完全以注解的方式代替配置类)

    <!-- 配置扫描组件所在的包 --><context:component-scan base-package="demo.pojo"/>

 @Component(value=bean的名称) 

若没有value则默认是类名的小写作为beanname.

测试用例

package demo.pojo;import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;@Component(value = "yzh")
@Scope("singleton")
@Lazy(false)public class user {public user() {System.out.println("无参构造执行");}@PostConstructvoid init(){System.out.println("实例化后执行");}@PreDestroyvoid destroy(){System.out.println("bean销毁前执行");}}

componet衍生出的3个注解

 既不属于web层,Service层,Dao层,普遍使用@Component.

Bean内部的属性进行注入

 

 @Value 在bean内部属性注入时,可直接放在bean的属性上,也可以放在bean的set方法中.

@Autowired 首先会根据类型进行注入,若发现有多个类型匹配,则根据注入的属性名进行匹配,若依然匹配不成功则提示报错。(在这种情况下,可以结合@Autowired,根据名称进行注入)

 @Resource 不指定名称时等同于@Autowired;指定名称时根据名称进行注入。

@Autowired扩展:

值得注意的是,当@AutoWired注解在方法上时,会根据参数的名字或者是集合中的类型进行注入(这种情况若发现有多个类型时,会全部注入到集合当中。)

非自定义的Bean管理

非自定义Bean不能像自定义Bean一样使用@Compnent进行管理,非自定义的Bean需要通过工厂的方式进行实例化,使用@Bean标注方法即可,@Bean的属性为beanName.若不加beanname则默认为方法名。(如以下的dataSource)。因为需要@Bean注解被扫描到,所以非自定义的bean所在的类必须被Spring容器管理。这也是为什么以下的'other'必须加component的原因。

见实例

package demo.otherbean;import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;import javax.sql.DataSource;@Component
public class other {@Bean("druid")public DataSource dataSource(){DruidDataSource   druid = new DruidDataSource();return  druid;}
}

当非自定义的Bean需要参数注入时:

基本数据类型 :@Value (位置放在参数内部)

引用类型:

1.根据名称进行注入时:@Qualifier("参数名称")此处可以省略@Autowired(这点和自定义bean的@Qualifier结合@Autowired注入时不同)

2.根据类型进行注入时: 可不加任何注解。如下面的userservice.

使用配置类完全替代XML配置文件

通过以上的注解已经能够代替bean标签,在使用配置文件时通过ClassPathXmlApplicationContext类去加载我们的配置文件;

ClassPathXmlApplicationContext context=new  ClassPathXmlApplicationContext("applicationcontext.xml");

而使用配置类时,则用

AnnotationConfigApplicationContext 去加载配置类。

        ApplicationContext context=new AnnotationConfigApplicationContext(springconfig.class);

 配置类中的注解

@ComponentScan相当于

<context:component-scan base-package="demo.otherbean"/>

@ComponentScan相当于

<context:property-placeholder location="classpath:test.properties"/>

若有多项扫描项或需要读取的配置文件,则用数组形式。参考以下实例

package demo.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration  //标明这是一个配置类 交给Spring容器去管理
@ComponentScan({"demo.pojo","demo.otherbean"})
@PropertySource({"test.properties"})
public class springconfig {}

@import 用于加载其他的配置文件,用于替代原xml标签中的<import>

spring中的其他注解(偶尔会用到)

 

 Spring注解的解析原理

 XML方式的组件扫描:在Spring容器创建时,使用XML命名空间的形式扫描指定的包以及子包下的类,识别注解,创建Beandefinition 存储到beandefinitionMap中最终进入单例池。

注解方式如@ComponentScan的组件扫描:通过BeanFactoryProcessor(bean工厂处理器)扫描注解创建Beandefinition存储到beandefinitionMap中最终进入单例池。而Bean的属性注入则通过BeanPostProcessor(Bean后处理器)扫描@Autowired等注解进行属性的注入。

spring使用注解整合第三方框架mybatis

原来的XML方式整合:

步骤

  1. 需要创建SqlSessionFactoryBean,而SqlSessionFactoryBean需要注入一个引用类型为DataSource。
  2. 创建 DataSource。DataSource属于非自定义的bean,需要通过工厂方法的方式进行注入,且该工厂方法所在的类需要被Spring容器管理.

jdbc.properties 连接数据库的配置信息:

 在这里发现了数据的格式问题,我在另一个项目中用yaml文件配置.在yaml文件里数据库的密码如上的061457需要加引号才能连接成功,而在.properties的配置文件中不能加引号才连接成功。(目前认为应该是配置文件的约束问题)

 

目录结构:

关于配置是否成功:

有个mybatisX的插件,一般来说xml文件能找到其对应的mapper接口映射文件则没什么问题。

核心注解

@MapperScan扫描Mapper接口

@PropertySource 加载配置文件

package demo.config;import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;import javax.sql.DataSource;@Configuration  //标明这是一个配置类 交给Spring容器去管理
@ComponentScan({"demo.pojo","demo.otherbean"})
@PropertySource({"jdbc.properties"})
@MapperScan("demo.mapper")
public class springconfig {@Beanpublic DataSource dataSource(@Value("${jdbc.username}")  String username,@Value("${jdbc.drive}") String drive,@Value("${jdbc.url}") String url,@Value("${jdbc.pwd}") String pwd){System.out.println(username+":"+drive+":"+url+":"+pwd);DruidDataSource druid = new DruidDataSource();druid.setDriverClassName(drive);druid.setUrl(url);druid.setUsername(username);druid.setPassword(pwd);return  druid;}@Beanpublic SqlSessionFactoryBean  SqlSessionFactoryBean(DataSource dataSource) //此处注入不加注解则通过类型进行注入{SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}}

XML和@Mapperscan注解整合Mybatis的底层原理:

简单的说:

都是扫描Mapper接口(比如以上的UserMapper),注册MapperFactorybean.而底层的MapperFactoryBean的getobject方法返回接口的实现。只不过入口不同,XML方式直接去配置MapperScannerConfig类,而注解通过导入MapperScannerRegister,通过MapperScannerRegister去注册MapperScannerConfig

@import整合第三方框架

        Spring与Mybatis的注解方式整合有个重要的技术点就是@Import,第三方框架与Spring整合很多都是凭借自定义标签完成的,而第三方框架与Spring整合注解方式很多是靠@Import注解完成的。

比如在myatis的@MapperScan注解中

 开发用的最多的还是导入普通的配置类。而需要整合自定义的第三方框架时,使用@Import导入实现ImportSelector接口的类以及实现ImportBeanDefinitionRegistrar接口的类就比较普遍了。

    下面给出一个实例(自定义注解导入实现ImportBeanDefinitionRegistrar接口的类)

自定义注解

package demo.config;import org.springframework.context.annotation.Import;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Import(MyImportBeanDefinitionRegistrar.class)
public @interface Mymapper {}

基于注解的AOP

Spring框架的AOP支持两种代理方式:基于JDK动态代理和基于CGLIB的代码生成代理。

  1. 基于JDK动态代理:使用JDK动态代理进行AOP代理时,目标对象必须实现至少一个接口。Spring会为实现了指定接口的目标对象动态生成一个代理对象,并在代理对象中拦截对目标方法的调用,并执行相应的增强逻辑。由于JDK动态代理是基于接口进行代理的,因此对于没有实现任何接口的目标类,无法使用JDK动态代理进行代理。

  2. 基于CGLIB的代码生成代理:如果目标对象没有实现任何接口,则Spring将使用CGLIB库来为该对象创建一个子类,并将代理逻辑织入到子类中。与JDK动态代理不同,CGLIB代理是通过生成目标类的子类来实现的,因此它能够代理没有实现任何接口的类。但是,由于CGLIB是通过生成目标类的子类来实现代理,所以对于final方法、private方法等无法覆盖的方法,也无法使用CGLIB来进行代理。

总之,Spring框架的AOP支持多种代理方式,在选择代理方式时需要根据目标对象是否实现接口、要代理的方法类型(final方法、private方法等)以及代理性能等因素来进行选择。通常情况下,如果目标对象实现了接口,则优先使用基于JDK动态代理的方式;否则,使用基于CGLIB的代码生成代理。

开启自动代理的注解,默认为基于JDK的动态代理,一般在配置类加上这个注解(因为基于注解开发,肯定要创建一个配置类)我发现无论有没有实现接口的类以上面两种方式(JDK的动态代理,CJLIB)都能实现AOP.

@EnableAspectJAutoProxy

基于CJlib的代理

@EnableAspectJAutoProxy(proxyTargetClass=true)

 AOP的相关Maven依赖


<!--提供AOP基本模块的功能--><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.20</version></dependency><!--     AspectJ 是一种面向切面编程(AOP)框架,aspectjweaver 提供了实现基于 AspectJ 的 AOP 功能所需的运行时依赖关系。--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version></dependency>
<!--    spring-aspects 为 Spring AOP 提供了额外的方面(Aspect),可以用于事务管理等功能。--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.16</version></dependency>

通知类

package demo.advise;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.stereotype.Component;@EnableAspectJAutoProxy
@Component
@Aspect
public class advise {@Pointcut("execution( *  demo.otherbean.*.*(..))")
public  void myponitcut(){} //切点表达式的抽取@Before("myponitcut()")//切点表达式,demo包下的otherbean包下的所有类的所有方法的所有参数为切点public  void beforeAdvise(JoinPoint joinPoint){System.out.println("当前目标对象是:"+joinPoint.getTarget());System.out.println("表达式:"+joinPoint.getStaticPart());System.out.println("前置通知");}@After("myponitcut()")//切点表达式,demo包下的otherbean包下的所有类的所有方法的所有参数为切点public  void afterAdvise(JoinPoint joinPoint){System.out.println("当前目标对象是:"+joinPoint.getTarget());System.out.println("表达式:"+joinPoint.getStaticPart());System.out.println("后置通知");}
}

 通过这个通知类可以看到:

它可以带参数为JoinPoint(切点),更可以通过其getTarget方法拿到切点所在的类对象。


http://www.ppmy.cn/news/360570.html

相关文章

内网隧道代理技术(四)之NETSH端口转发

内网隧道代理技术(四)之NETSH端口转发

NETSH端口转发 NETSH介绍 netsh是windows系统自带命令行程序&#xff0c;攻击者无需上传第三方工具即可利用netsh程序可进行端口转发操作&#xff0c;可将内网中其他服务器的端口转发至本地访问运行这个工具需要管理员的权限 本地端口转发 实验场景 现在我们有这么一个环境…
阅读更多...
OceanBase 的 MERGE INTO 并行实现要点

OceanBase 的 MERGE INTO 并行实现要点

今天给大家介绍 OceanBase Merge Into 用法&#xff0c;以及其并行的基本原理。 语法 Merge Into 语法是 SQL 中比较复杂的语法&#xff0c;一条语句可以涵盖增删改查四大模式。 MERGE [hint_options] INTO target_table_name [opt_alias] USING source_table_name [opt_alia…
阅读更多...
第二章(第一节):数列与极限

第二章(第一节):数列与极限

1.数列及其极限 1.内容概述 极限理论是高等数学的基础,高等数学中的很多基本概念都是借助极限的方法来描述的,我们以数列为研究,引入极限的概念2.数列的通项公式 一个数列{an}的第n项,an与项数n的关系,如果可以用一个公式来表示,这个公式就叫做这个数列的通项公式。 1.数…
阅读更多...
【光源色温】

【光源色温】

H光2300 A光2850 TL843850 CWF4100 D50 5000 D65 6500 D75 7500
阅读更多...
Mac 屏幕色温一直变化

Mac 屏幕色温一直变化

早上发现屏幕色温一直变化&#xff0c;找了好久&#xff0c;发现需要设置“关闭原彩显示”&#xff0c;这里记录下&#xff1a;
阅读更多...
如何校准显示器颜色

如何校准显示器颜色

当你打开电脑发现显示器的颜色不正常&#xff0c;先打开设置&#xff0c;搜索校准 点击校准显示器颜色&#xff0c;然后点击下一页 到调整伽玛那一页&#xff0c;将伽玛数值调低一点。 后面的RGB色彩根据自己的感受调整一下就行了。完成后系统会弹出文本校对选择清晰的文本
阅读更多...
什么是色温?

什么是色温?

色温&#xff1a; 色温是光源色彩的一个标志&#xff0c;不同的颜色对应不同的色温。 定义&#xff1a;把标准黑体&#xff08;自身不发光且熔点很高的物体&#xff09;加热&#xff0c;温度升高到一定程度时该黑体颜色开始从深红-浅红-橙红-白-蓝 逐渐改变&#xff0c;某光源与…
阅读更多...
如何将电脑屏幕颜色调回正常色

如何将电脑屏幕颜色调回正常色

今天小编要为大家讲讲如何将电脑屏幕颜色调回正常色&#xff0c;一起来看看吧。 操作方法 01 首先点击鼠标右键找到“打开个性化”进入。 02 然后找到控制面板。 03 然后将查看方式改为“小图标”&#xff0c;如图所示。然后找到“颜色管理”&#xff0c;并点击进入。 04 点击…
阅读更多...
计算机色温调整,如何调节计算机屏幕的色温

计算机色温调整,如何调节计算机屏幕的色温

适用产品&#xff1a; 荣耀 MagicBook Pro(2020款 intel i5/16gb/512gb/mx350、amd 3550h/16gb/512gb/vega 8、amd 3750h/16gb/512gb/vega 10、 intel i5/8g/512g/独显mx250、2020款 锐龙版 r5/8gb/256gb、 intel i7/16g/1tb/独显mx250、amd 3550h/8gb/512gb/vega 8、2020款 in…
阅读更多...
懂?色温与显示指数的关系

懂?色温与显示指数的关系

色温 热力学中&#xff0c;黑体是一种理想化的物体&#xff0c;它能够吸收外来的全部电磁辐射&#xff0c;并且不会有任何的发射与透射。随着温度上升&#xff0c;黑体所辐射处理的电磁波与光线称为黑体辐射。 光学中&#xff0c;色温指的是“把某个黑体加热到一个温度&#xf…
阅读更多...
计算机的色彩在哪调整w10,win10电脑色彩太冷怎么调节屏幕色彩

计算机的色彩在哪调整w10,win10电脑色彩太冷怎么调节屏幕色彩

一些追求个性化的用户觉得win10电脑色彩太冷&#xff0c;看着很不舒服&#xff0c;想要自定义设置一下屏幕色彩&#xff0c;这该怎么操作&#xff1f;其实调节方法很简单&#xff0c;小编和大家说下win10电脑色彩太冷的调节方法。 具体方法如下&#xff1a; 第一步&#xff0c;…
阅读更多...
色温

色温

光源的色温是以光源发光时所显现的颜色与一个绝对黑体被高温燃烧时所显现的颜色相一致时这个黑体被燃烧温度来定义的&#xff0c;它的单位是绝对温度Kelvin『K』,K值越高&#xff0c;显现的颜色就愈趋向于白蓝色&#xff1b;K值越低&#xff0c;显现的颜色就愈趋向于黄红色。我…
阅读更多...
计算机上用的色彩空间,你的显示器颜色正确吗?色域设置很重要

计算机上用的色彩空间,你的显示器颜色正确吗?色域设置很重要

在使用HDMI线连接显示器时&#xff0c;有一个东西经常被人们忽视&#xff0c;那就是“色域设置”。这个设置关系到画面最终呈现出来的色彩&#xff0c;所以还是挺重要的。今天我们就教大家如何来开启全色域&#xff0c;还原最真实的色彩。 简单来说&#xff0c;这个问题就是在使…
阅读更多...
测试图片色域软件,显示器色域检测

测试图片色域软件,显示器色域检测

色域是颜色的一种编码&#xff0c;也是某一个规定的色彩空间或者输出装置呈现出来的一个颜色范围&#xff0c;展示给用户看到的颜色&#xff0c;使用显示器色域检测工具&#xff0c;可以检测到电脑显示器的色域情况&#xff0c;并且提供具体的参数&#xff0c;这款软件对于需要…
阅读更多...
如何教你真正的懂得色温?

如何教你真正的懂得色温?

色温你真的懂吗&#xff1f; 经常会在网上看到一些“科普”&#xff0c;说家里用3000K太黄&#xff0c;4000K太白&#xff0c;用3500K最合适。对于这样的科普&#xff0c;只能呵呵。 本来&#xff0c;觉得白还是黄&#xff0c;就是很主观的&#xff0c;每个人对色彩亮度的感知…
阅读更多...
色温调整

色温调整

色温转rgb https://github.com/esemeniuc/kelvin_rgb #求出色温 def tem(x,y): a (x-0.329)/(y-0.187) t1 669*a**4-779*a**33360*a**2-7047*a5652 b (x-0.3316)/(y-0.1893) t2 669*b**4-779*b**33360*b**2-7047*b5210 if t1<10000: te t1 else: te t2 return te …
阅读更多...
显示器调色温

显示器调色温

色温6500K。亮度30&#xff0c;对比度75
阅读更多...
屏幕色温

屏幕色温

作者&#xff1a;浮平 链接&#xff1a;https://www.zhihu.com/question/29094989/answer/43175752 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 使用手机的时候&#xff0c;我们时常会听到“冷屏”和“暖屏”的说法…
阅读更多...
光色(色温)

光色(色温)

光是有颜色的&#xff0c;光发出的颜色就是色温。色温就是指光源光谱成份的颜色。色温的单位用&#xff08;K&#xff09;表示&#xff0c;是英国物理学家开尔文&#xff08;Kelvin&#xff09;的英文缩写。当光线的颜色偏红、橙、黄色时&#xff0c;我们就称它为低色温。当光线…
阅读更多...
batch_size对精确度和损失的影响

batch_size对精确度和损失的影响

1 问题 在深度学习的学习过程中&#xff0c;模型性能对batchsize虽然没有学习率那么敏感&#xff0c;但是在进一步提升模型性能时&#xff0c;batch_size就会成为一个非常关键的参数。 batch_size对精度和损失的影响研究。 batch_size [,32,64,128&#xff0c;256] 不同batch_…
阅读更多...
最新文章

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