当前位置: 首页 > news >正文

想要自己做一个网站怎么做vultr建wordpress

想要自己做一个网站怎么做,vultr建wordpress,单位建设网站申请,域名备案中网站可以开通目录 一、前言 二、aop概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk代理示例 3.1.2 jdk动态代理模拟实现…目录 一、前言 二、aop概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk代理示例 3.1.2 jdk动态代理模拟实现 3.2 CGLIB 代理 3.2.1 cglib代理代码示例 3.2.2 cglib代理源码模拟实现 3.2.3 cglib代理补充说明 四、spring aop源码探究 4.1 环境准备 4.1.1 引入aop依赖包 4.1.2 自定义aop配置类 4.1.3 测试方法 4.2 spring aop切点表达式 4.2.1 语法结构 4.2.2 常见的切点表达式示例 4.3 spring aop源码分析过程 五、写在文末 一、前言 spring 是一个流行的 Java 企业应用程序开发框架其中的 aop面向切面编程是 spring 框架中一个非常重要的概念。可以说在spring框架以及生态体系下随处可见aop编程思想的运用借助这一编程思想在很多特殊的业务场景下aop的使用让编码变得易扩展、更优雅、更灵活同时也能很好的解决通用的业务问题提升开发效率。本文将详细介绍aop的核心技术和底层实现原理。 二、aop概述 2.1 什么是AOP AOP即面向切面编程AOP是一种编程范式用于在不修改原始代码的情况下向现有应用程序添加新功能。这种编程方式将应用程序分成许多独立的部分称为切面。这些切面可以在应用程序的不同位置进行编写和维护从而提高了应用程序的可重用性和可维护性。 AOP是OOP面向对象编程的延续主要用于实现横切关注点比如日志记录、性能统计、安全控制、事务处理等方面。简单来说针对应用程序中那些可以预见的以及归总为公共的处理业务的场景均可以考虑使用aop的编程实现。 2.2 AOP中的一些概念 为了后续更全面深入的掌握aop的使用有必要了解下spring aop的相关概念。这些概念能够更好的指导我们在编码中对aop的原理的理解。 切面(Aspect) AOP核心就是切面它将多个类的通用行为封装成可重用的模块该模块含有一组API提供横切功能。比如一个日志模块可以被称作日志的AOP切面。根据需求的不同一个应用程序可以有若干切面。在Spring AOP中切面通过带有Aspect注解的类实现。 连接点(Join Point) AOP核心就是切面它将多个类的通用行为封装成可重用的模块该模块含有一组API提供横切功能。比如一个日志模块可以被称作日志的AOP切面。根据需求的不同一个应用程序可以有若干切面。在Spring AOP中切面通过带有Aspect注解的类实现。 连接点(Join Point) 哪些方法需要被AOP增强这些方法就叫做连接点 通知(Advice) AOP在特定的切入点上执行的增强处理 常用的通知类型有 before前置通知 after后置通知 afterReturning返回通知 afterThrowing异常通知 around环绕通知 切入点Pointcut 实际真正被增强的方法称为切入点 2.2.1 aop通知类型 通知(advice)是你希望在横切关注点具体的实现方式即方法之前触发执行后触发...aop中的Advice主要有以下5种类型 前置通知(Before Advice) 在连接点之前执行的Advice即方法执行前使用Before注解使用这个Advice 返回之后通知(After Retuning Advice) 在连接点正常结束之后执行的Advice即你的方法正常执行完成之后执行通过 AfterReturning注解使用它前提是你的方法没有抛出异常 抛出异常后执行通知(After Throwing Advice) 如果方法执行抛异常的时候这个Advice就会被执行通过 AfterThrowing注解来使用 后置通知(After Advice) 无论连接点通过什么方式退出(方法正常返回或者抛出异常)都会执行在结束后执行这些Advice通过 After注解使用 围绕通知(Around Advice) 围绕连接点执行的Advice方法执行前可以拦截参数方法执行后可以拿到执行结果属于几种通知中比较灵活的一种通过Around注解使用 2.3 AOP实现原理 Spring AOP 的实现原理是基于动态代理和字节码操作的。具体来说 在编译阶段 Spring 会使用 AspectJ 编译器将切面代码编译成字节码文件在运行阶段 Spring 会使用 Java 动态代理或 CGLIB 代理生成代理类这些代理类会在目标对象方法执行前后插入切面代码从而实现AOP增强的功能 Spring AOP 主要使用两种代理方式JDK动态代理和 CGLIB 代理。如果目标对象实现了至少一个接口则框架使用JDK动态代理否则使用 CGLIB 代理。 2.3.1 aop中的代理实现 基于接口情况下使用JDK动态代理 JDK动态代理创建一个接口实现类的代理对象该接口实现类的代理对象会调用该接口的真实实现并且在代理对象中调用真实的实现类的方法进行增强 没有接口情况下使用 CGLIB 动态代理 CGLIB动态代理创建一个类子类的代理对象该子类的代理对象会去调用父类中的方法并且在子类代理对象调用其父类方法后做增强 2.4 静态代理与动态代理 很多同学在理解aop的代理时很容易对静态代理与动态代理这个概念搞混顾名思义静态代理简单理解就是代理的类或方法定义已经提前定义好了在需要使用的地方直接调用即可而动态代理关键是理解动态这个概念从程序的角度来说就是在程序运行过程中动态生成了目标对象的代理对象。 2.4.1 静态代理实现 定义一个接口 public interface LoginService {void login(String userId); } 接口实现 public class LoginServiceImpl implements LoginService {Overridepublic void login(String userId) {System.out.println(登录成功userIduserId);} } 实现了LoginService 接口的代理实现类 public class ProxyLoginService implements LoginService {private LoginServiceImpl loginServiceImpl;public ProxyLoginService(LoginServiceImpl loginServiceImpl){this.loginServiceImplloginServiceImpl;}Overridepublic void login(String userId) {System.out.println(执行登录之前操作);loginServiceImpl.login(user);System.out.println(执行登录方法后操作);} } 测试方法 public static void main(String[] args) {//创建电影院静态代理ProxyLoginService proxyLoginService new ProxyLoginService(new LoginServiceImpl());proxyLoginService.login(user1);} 静态代理优点 使得真实角色处理的业务更加纯粹不再去关注一些公共的事情 公共的业务由代理来完成---实现业务的分工公共业务发生扩展时变得更加集中和方便 缺点 每一个代理类都必须实现一遍真实实现类也就是realMovie的接口如果接口增加方法则代理类也必须跟着修改每一个代理类对应一个真实实现类委托类如果真实实现委托类非常多则静态代理类就非常臃肿难以胜任 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 与静态代理不同动态代理是根据代理对象动态创建代理类。这样就可以避免静态代理中代理类接口过多的问题。jdk动态代理是通过反射来实现的借助Java自带的java.lang.reflect.Proxy,通过固定的规则生成。 jdk动态代理的使用步骤如下 创建一个需要动态代理的接口即Movie接口创建一个需要动态代理接口的真实实现即RealMovie类创建一个动态代理处理器实现InvocationHandler接口并重写invoke方法去增强真实实现中的目标方法在测试类中生成动态代理的对象 3.1.1 jdk代理示例 自定义一个类实现InvocationHandler接口并重写里面的invoke方法 public class ProxyInvocationHandler implements InvocationHandler {//需要动态代理接口的真实实现类private Object object;//通过构造方法去给需要动态代理接口的真实实现类赋值public ProxyInvocationHandler(Object object) {this.object object;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {//方法增强System.out.println(方法执行前操作);//object是真实实现args是调用方法的参数//当代理对象调用真实实现的方法那么这里就会将真实实现和方法参数传递过去去调用真实实现的方法method.invoke(object,args);//方法增强System.out.println(方法执行后操作);return null;} } 编写测试类使用自定义的handler生成代理对象并调用目标方法 public class DynamicProxyTest {public static void main(String[] args) {//需要动态代理接口的真实实现LoginServiceImpl realMovie new LoginServiceImpl();//动态代理处理类ProxyInvocationHandler handler new ProxyInvocationHandler(realMovie);//获取动态代理对象//第一个参数真实实现被代理对象的类加载器//第二个参数真实实现类被代理对象它所实现的所有接口的数组//第三个参数动态代理处理器LoginService loginService (LoginService) Proxy.newProxyInstance(realMovie.getClass().getClassLoader(),realMovie.getClass().getInterfaces(),handler);loginService.login(user);}} 执行结果 3.1.2 jdk动态代理模拟实现 由于jdk的代理是在运行期间动态产生字节码所以很难看到运行期间代理产生的源码我们可以模拟其原理进行一个简单的实现代码如下 定义一个接口作为被代理的对象实现类也一并贴出 interface MinuService {int addMinu();void reduceMinu();}//目标对象实现类static class Target implements MinuService {Overridepublic int addMinu() {System.out.println(tager do addMinu);return 1;}Overridepublic void reduceMinu() {System.out.println(tager do reduceMinu);}} 定义一个handlerhandler的作用可理解为作为代理对象中实际执行方法调用的一个入口 interface MyInvocationHandler {Object invoke(Object proxy,Method method, Object[] args);} 定义代理类代理类是核心实现在代理类中主要做的事情如下 引用自定义handler引用代理类中待执行的目标方法该方法其实是运行期间动态生成的调用handler中的invoke反射调用目标方法并得到执行结果 import java.lang.reflect.Method;public class MyProxy implements JdkInner.MinuService {private JdkInner.MyInvocationHandler handler;public MyProxy(JdkInner.MyInvocationHandler handler) {this.handler handler;}static Method addMinu;static Method reduceMinu;static {try {addMinu JdkInner.MinuService.class.getMethod(addMinu);reduceMinu JdkInner.MinuService.class.getMethod(reduceMinu);} catch (NoSuchMethodException e) {e.printStackTrace();}}Overridepublic int addMinu() {Object invoke null;invoke handler.invoke(this, addMinu, new Object[0]);return Integer.parseInt(invoke.toString());}Overridepublic void reduceMinu() {handler.invoke(this, reduceMinu, new Object[0]);} } 编写测试类有没有发现这个写法和上述使用jdk的动态代理很像 public static void main(String[] args) {MinuService minuService new MyProxy(new MyInvocationHandler() {Overridepublic Object invoke(Object proxy,Method method, Object[] args) {System.out.println(before invoke method);Object result null;try {result method.invoke(new Target(), args);System.out.println(result : result);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();}return result;}});System.out.println(minuService.getClass());minuService.addMinu();} 如果你想查看jdk动态代理时产生的源码可以考虑使用arthars进行反编译查看 3.2 CGLIB 代理 CGLIB 代理是一个基于字节码操作的代理方式它是一个强大的、高性能、高质量的 Code 生成类库可以在运行期扩展 Java 类与实现 Java 接口可以为没有实现接口的类创建代理对象。CGLIB 代理会在运行时生成一个目标对象的子类并覆盖其中的方法以实现AOP的功能。下面是 CGLIB 代理的实现代码 public class CglibAopProxy implements AopProxy {private final AdvisedSupport advised;public CglibAopProxy(AdvisedSupport advised) {this.advised advised;}Overridepublic Object getProxy() {Enhancer enhancer new Enhancer();enhancer.setSuperclass(advised.getTargetSource().getTargetClass());enhancer.setCallback(new DynamicAdvisedInterceptor(advised));return enhancer.create();}private static class DynamicAdvisedInterceptor implements MethodInterceptor {private final AdvisedSupport advised;public DynamicAdvisedInterceptor(AdvisedSupport advised) {this.advised advised;}Overridepublic Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {MethodInvocation methodInvocation new CglibMethodInvocation(advised.getTargetSource().getTarget(),method,args,proxy,advised.getMethodInterceptor(),advised.getTargetSource().getTargetClass());return methodInvocation.proceed();}} } 3.2.1 cglib代理代码示例 下面是一段使用cglib进行代理的代码 import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibTest {static class Target {public void get() {System.out.println(target get);}}public static void main(String[] args) {Target target new Target();//拿到代理的类Target proxyTarget (Target)Enhancer.create(Target.class, new MethodInterceptor() {Overridepublic Object intercept(Object proxyClass, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println(before....);Object result method.invoke(target, args);System.out.println(after...);return result;}});//执行代理类的方法proxyTarget.get();}} 结果看起来和使用jdk代理类似 与jdk代理不同的是jdk的代理仅能针对接口代理而cglib生成的代理对象是一个子类所以需要注意使用cglib进行代理的时候父类不能是final的并且目标类中的代理方法也不能是final的。 3.2.2 cglib代理源码模拟实现 上面的案例了解了如何使用cglib进行代理以及代码的实现下面来模拟一下其底层源码的实现 定义一个目标类 public class CglibTarget {public void add(){System.out.println(add());}public void add(int num){System.out.println(add() : num);}public void reduce(int count){System.out.println(reduce() : count);} } 定义代理类 通过上面的介绍了解到cglib的代理对象是通过生成目标对象的子类实现的所以代理类需要继承目标类 import org.springframework.cglib.proxy.MethodInterceptor;import java.lang.reflect.Method;public class CglibProxy extends CglibTarget {private MethodInterceptor methodInterceptor;public void setMethodInterceptor(MethodInterceptor methodInterceptor) {this.methodInterceptor methodInterceptor;}static Method add_1;static Method add_2;static {try {add_1 CglibTarget.class.getMethod(add);add_2 CglibTarget.class.getMethod(add,int.class);} catch (NoSuchMethodException e) {e.printStackTrace();}}Overridepublic void add() {try {methodInterceptor.intercept(this,add_1,new Object[0],null);} catch (Throwable throwable) {throwable.printStackTrace();}}public void add(int num){try {methodInterceptor.intercept(this,add_2,new Object[]{num},null);} catch (Throwable throwable) {throwable.printStackTrace();}}public void reduce(int count){super.reduce(count);}} 测类类 import com.congge.aop.cglib.CglibProxy; import com.congge.aop.cglib.CglibTarget; import org.springframework.cglib.proxy.MethodInterceptor; import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;public class CglibTest {public static void main(String[] args) {CglibProxy proxy new CglibProxy();CglibTarget target new CglibTarget();proxy.setMethodInterceptor(new MethodInterceptor() {Overridepublic Object intercept(Object targetObj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println(before handle);Object result method.invoke(target, args);System.out.println(after handle);return result;}});proxy.add(10);} } 运行代码得到如下效果 3.2.3 cglib代理补充说明 在使用cglib代码编码实现中注意到在intercept方法参数中有一个Method的参数这个参数是做什么用的呢 不妨将代码修改成下面这样 public static void main(String[] args) {Target target new Target();//拿到代理的类Target proxyTarget (Target)Enhancer.create(Target.class, new MethodInterceptor() {Overridepublic Object intercept(Object proxyClass, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println(before....);//Object result method.invoke(target, args);Object result methodProxy.invoke(target, args);System.out.println(after...);return result;}});//执行代理类的方法proxyTarget.get();} 再次执行发现仍然可以得到正确的结果为什么会这样呢 cglib代理底层通过这种方式为调用者提供了多一种选择当选择使用methodProxy的invoke方法时将不反射而是退化为直接使用原始目标对象去调用方法某些情况下可以获得比反射更高的性能。 四、spring aop源码探究 spring底层在aop的代理上是怎么处理的呢接下来让我们通过源码一探究竟。 4.1 环境准备 4.1.1 引入aop依赖包 只需要引入aspectjweaver即可 dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.8.3/version/dependency 4.1.2 自定义aop配置类 定义一个切面的配置类这里扫描的是某个包路径下的所有方法并且使用了环绕通知在通知方法里输出了方法实际执行耗时 Component Aspect public class AspectConfig {Pointcut(execution(* com.congge.service.aop.*.*(..))))private void pointcut(){}Around(pointcut())public Object around(ProceedingJoinPoint point) throws Throwable {long start System.currentTimeMillis();Object proceed point.proceed();long end System.currentTimeMillis();System.out.println(消耗时间 (end-start));return proceed;}} 4.1.3 测试方法 编写测试方法验证上述aop切面通知是否生效 ComponentScan(com.congge.service.aop) EnableAspectJAutoProxy public class SpringApp {public static void main(String[] args) {AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(SpringApp.class);UserService userService context.getBean(UserService.class);userService.getUser();}} 运行之后效果如下说明aop的环绕通知配置生效了 4.2 spring aop切点表达式 在实际开发中aop编程的一般步骤是定义切面类然后定义具体的切点表达式然后再在具体的通知方法上面引入切点表达式即可。下面列举几种常用的几种自定义切点表达式的写法。 4.2.1 语法结构 例1对扫描包中的某个类的方法增强 execution(* com.xxx.xxxClass.方法名(..)) 例2对扫描包中的某个类的所有方法增强 execution(* com.xxx.xxxClass.* (..)) 例3对扫描包中所有类类中所有方法增强 execution(* com.xxx.service.*.* (..)) 例4所有带有某个注解的方法或类 annotation(com.xxx.annotation.xxxAnnotation) 上面举的例子都是去切入具体的某个方法、类也可以切到某个包下所有的方法也可以去切某包下带有某注解的方法等等。   4.2.2 常见的切点表达式示例 下面列举常用的几种切点表达式示例便于后续的参考 所有方法执行 execution(public * *(..)) 名以XXX开头的所有方法执行 execution(* XXX*(..)) XXX接口中所有方法执行 execution(* com.xxx.XXX.*(..)) service包下所有方法执行 execution(* com.xxx.service..*.*(..)) service包下的所有连接点 仅在Spring AOP中执行方法 within(com.xxx.service..*) 代理实现XXX接口的任何连接点 仅在Spring AOP中执行方法 this(com.xxx.service.XXXService) 所有带有XXX注解的方法或类 annotation(com.xxx.annotation.XXX) 4.3 spring aop源码分析过程 通过断点在真正执行userService.getUser()之前我们可以看到userService已经是一个代理对象而且不难看出这是一个jdk动态代理产生的对象userService接口存在实现类 于是可以断定在真正执行目标方法的时候是代理对象在帮我们执行了那么代理对象在哪里产生的呢代理对象是什么时候产生的呢这就是接下来需要搞清的重点所在。 从getBean入手一路往下走通过getBean方法最终获取到了代理对象 public T T getBean(ClassT requiredType) throws BeansException {this.assertBeanFactoryActive();return this.getBeanFactory().getBean(requiredType);} 通过getBean方法走到下面这个doGetBean方法里在这个方法中注意有一个关键的位置getSingleton很多同学在看spring源码的时候发现调用栈非常深经常陷入一种不知道从何看起的状态这里说过小技巧你只需要关注你期望得到的目标即可。比如在doGetBean这里为了快速获取到userService可以在此处设置条件断点如下 以上述getSingleton为例来说通过这个方法可能会得到代理对象需不需要进去看呢可以先走一步如果得到的是代理对象那么说明getSingleton这个方法中是产生代理对象的地方按照这个思路我们走一步看看发现此刻得到的对象就是一个代理对象说明确实是在getSingleton这个方法中产生了代理对象 以getSingleton继续深入进入该方法之后发现从singletonObjects中拿到的就是代理对象了这里不禁冒出一个问题来了singletonObjects中是什么时候将代理对象放进去的呢 这里不得不说另一个源码的调试和阅读技巧就是直接看debug中的调用栈从下面的调用栈可以发现上一步singletonObjects中存储的这个代理对象就是在其中的某一步产生并放到容器中的 这样一来至少可以说明产生代理对象的时机在当前这个getSingleton之前从spring的bean的生命周期来看要经历解析创建初始化实例化等一些步骤所以可以将目光定位到创建的过程即createBean阶段于是从getBean方法入手作为突破点即可再次断点进入来到getBean方法中 通过getBean一路来到getSingleton方法中该方法即创建初始的userService的核心代码而且第一次进入的时候发现userService的bean对象还未创建出来一直来到该方法的如下位置利用上面的调试技巧发现就是在这个singletonFactory.getObject()方法得到了代理对象 继续进入这个singletonFactory.getObject()方法就来到创建bean的方法中即createBean 沿着该方法继续往下走当走到doCreateBean这里时发现这个方法执行结束后就成了代理对象 继续进入doCreateBean方法中当走完initializeBean方法之后发现就产生了代理对象 那么initializeBean里面发生了什么呢可以断定这个方法的某个地方最终产生了代理对象于是来到下面这个方法 进入到applyBeanPostProcessorsAfterInitialization方法中 来到postProcessAfterInitialization里面之后沿着wrapIfNecessary继续进入 历经千辛万苦最终来到这里这个方法就是最终产生代理对象的地方核心创建代理对象的代码就是下面这段 protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {if (StringUtils.hasLength(beanName) this.targetSourcedBeans.contains(beanName)) {return bean;} else if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {return bean;} else if (!this.isInfrastructureClass(bean.getClass()) !this.shouldSkip(bean.getClass(), beanName)) {Object[] specificInterceptors this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);if (specificInterceptors ! DO_NOT_PROXY) {this.advisedBeans.put(cacheKey, Boolean.TRUE);Object proxy this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));this.proxyTypes.put(cacheKey, proxy.getClass());return proxy;} else {this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean;}} else {this.advisedBeans.put(cacheKey, Boolean.FALSE);return bean;}} 我们重点关注方法中createProxy这个方法即可 跳过中间的步骤最终来到createAopProxy方法中在这个方法中展示了如何创建代理对象以及采用哪种方式创建代理对象即使用jdk动态代理呢还是cglib方式呢 从这段代码不难看出这里做了一个判断如果目标对象是接口将采用jdk动态代理如果目标对象是类则使用cglib的代理由于在前面的代码中目标对象是普通的类所以将会产生一个cglib的代理对象 补充说明   在上面判断使用哪种代理方式时有一个很重要的参数即判断下面的这个参数的布尔值通过源码点击进去发现默认情况下该参数初始值为false config.isProxyTargetClass() 该参数的意义在于开发者可以通过强制指定这个参数的值从而改变代理的方式强制使用cglib如何修改呢只需要将下面的注解中改为true即可 五、写在文末 本文通过较大的篇幅全面而深度的总结了aop代理相关的技术点并且深入到源码层面解读了spring aop的完整过程aop不仅是spring编程中的重要内容也是日常开发中运用比较广泛的技术点有必要对其做深入的理解和掌握。本篇到此结束感谢观看。
文章转载自:
http://www.morning.dfffm.cn.gov.cn.dfffm.cn
http://www.morning.zwyuan.com.gov.cn.zwyuan.com
http://www.morning.zcmpk.cn.gov.cn.zcmpk.cn
http://www.morning.rjljb.cn.gov.cn.rjljb.cn
http://www.morning.bpmtg.cn.gov.cn.bpmtg.cn
http://www.morning.ghfrb.cn.gov.cn.ghfrb.cn
http://www.morning.mjbkp.cn.gov.cn.mjbkp.cn
http://www.morning.cklgf.cn.gov.cn.cklgf.cn
http://www.morning.cfccp.cn.gov.cn.cfccp.cn
http://www.morning.xctdn.cn.gov.cn.xctdn.cn
http://www.morning.zrqs.cn.gov.cn.zrqs.cn
http://www.morning.xmbhc.cn.gov.cn.xmbhc.cn
http://www.morning.wbrf.cn.gov.cn.wbrf.cn
http://www.morning.gnkdp.cn.gov.cn.gnkdp.cn
http://www.morning.cwwts.cn.gov.cn.cwwts.cn
http://www.morning.pwhjr.cn.gov.cn.pwhjr.cn
http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn
http://www.morning.nyqxy.cn.gov.cn.nyqxy.cn
http://www.morning.dwrjj.cn.gov.cn.dwrjj.cn
http://www.morning.wwznd.cn.gov.cn.wwznd.cn
http://www.morning.rggky.cn.gov.cn.rggky.cn
http://www.morning.mbaiwan.com.gov.cn.mbaiwan.com
http://www.morning.prprj.cn.gov.cn.prprj.cn
http://www.morning.bcngs.cn.gov.cn.bcngs.cn
http://www.morning.tgwfn.cn.gov.cn.tgwfn.cn
http://www.morning.rrjzp.cn.gov.cn.rrjzp.cn
http://www.morning.pqcrz.cn.gov.cn.pqcrz.cn
http://www.morning.xwlmg.cn.gov.cn.xwlmg.cn
http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn
http://www.morning.xgcwm.cn.gov.cn.xgcwm.cn
http://www.morning.ityi666.cn.gov.cn.ityi666.cn
http://www.morning.qsy37.cn.gov.cn.qsy37.cn
http://www.morning.frxsl.cn.gov.cn.frxsl.cn
http://www.morning.xfmwk.cn.gov.cn.xfmwk.cn
http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn
http://www.morning.kqqk.cn.gov.cn.kqqk.cn
http://www.morning.jjzbx.cn.gov.cn.jjzbx.cn
http://www.morning.4r5w91.cn.gov.cn.4r5w91.cn
http://www.morning.ylklr.cn.gov.cn.ylklr.cn
http://www.morning.pzcjq.cn.gov.cn.pzcjq.cn
http://www.morning.qsyyp.cn.gov.cn.qsyyp.cn
http://www.morning.nshhf.cn.gov.cn.nshhf.cn
http://www.morning.nrmyj.cn.gov.cn.nrmyj.cn
http://www.morning.fy974.cn.gov.cn.fy974.cn
http://www.morning.jgnst.cn.gov.cn.jgnst.cn
http://www.morning.bpmfq.cn.gov.cn.bpmfq.cn
http://www.morning.hqrr.cn.gov.cn.hqrr.cn
http://www.morning.kwpnx.cn.gov.cn.kwpnx.cn
http://www.morning.mjwnc.cn.gov.cn.mjwnc.cn
http://www.morning.cnfjs.cn.gov.cn.cnfjs.cn
http://www.morning.hrnrx.cn.gov.cn.hrnrx.cn
http://www.morning.yxkyl.cn.gov.cn.yxkyl.cn
http://www.morning.crrjg.cn.gov.cn.crrjg.cn
http://www.morning.zmpqh.cn.gov.cn.zmpqh.cn
http://www.morning.tygn.cn.gov.cn.tygn.cn
http://www.morning.hbjqn.cn.gov.cn.hbjqn.cn
http://www.morning.bykqg.cn.gov.cn.bykqg.cn
http://www.morning.bsxws.cn.gov.cn.bsxws.cn
http://www.morning.drwpn.cn.gov.cn.drwpn.cn
http://www.morning.lfxcj.cn.gov.cn.lfxcj.cn
http://www.morning.ywpwq.cn.gov.cn.ywpwq.cn
http://www.morning.hwnnm.cn.gov.cn.hwnnm.cn
http://www.morning.kdnrc.cn.gov.cn.kdnrc.cn
http://www.morning.xjkfb.cn.gov.cn.xjkfb.cn
http://www.morning.jpnw.cn.gov.cn.jpnw.cn
http://www.morning.kfwqd.cn.gov.cn.kfwqd.cn
http://www.morning.hchrb.cn.gov.cn.hchrb.cn
http://www.morning.ylmxs.cn.gov.cn.ylmxs.cn
http://www.morning.qbkw.cn.gov.cn.qbkw.cn
http://www.morning.kdbcx.cn.gov.cn.kdbcx.cn
http://www.morning.ydwnc.cn.gov.cn.ydwnc.cn
http://www.morning.yxwnn.cn.gov.cn.yxwnn.cn
http://www.morning.flmxl.cn.gov.cn.flmxl.cn
http://www.morning.bpmtx.cn.gov.cn.bpmtx.cn
http://www.morning.lsqmb.cn.gov.cn.lsqmb.cn
http://www.morning.smpb.cn.gov.cn.smpb.cn
http://www.morning.zpxwg.cn.gov.cn.zpxwg.cn
http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn
http://www.morning.gidmag.com.gov.cn.gidmag.com
http://www.morning.qtxwb.cn.gov.cn.qtxwb.cn
http://www.tj-hxxt.cn/news/250822.html

相关文章:

  • 手机淘宝郑州seo博客
  • 北京网站建设模板下载网站开发包含哪些类别
  • 超频三网站谁家做的做php网站时如何建立数据库
  • 平度市建设局网站淘宝代理平台
  • 上海建设部网站巴中 网站建设
  • 易语言做试用点击网站北海公司做网站
  • 网站建设服务天软科技网站建设 部署与发布
  • 网站logo做h1标签网页网站设计培训班
  • 黄冈网站建设收费网站建设学
  • 如何以目录形式访问网站大连建筑工程网
  • 网站设计 专业网站后台有些不显示
  • 禄劝彝族苗族网站建设cms框架 wordpress
  • 在家做网站wordpress动漫展主题
  • 软件开发和网站开发哪个更好代理网址网站
  • 镇江百度网站排名网站网页怎么压缩
  • 遵义住建局查询网站系统门窗品牌10大品牌排行
  • 简述建立一个网站模板步骤环保部网站建设项目重大变动
  • 网站怎么做点击广告河南建设工程信息网一体化
  • 营口化工网站建设网页设计适合什么岗位
  • 注销备案号 网站学校二级学院网站建设
  • 用户注册和登录网站怎么做的Wordpress出现错误
  • 阿里云主机 搭建网站零距离seo
  • 网站开速度 流失爱南宁app下载乘车码
  • 服务器做网站教程保洁公司网站怎么做
  • 专业企业网站建设公司价格wordpress原创中文主题
  • 网站开发语言哪种简单广州seo搜索
  • 公司建立网站的费用如何做帐网络营销是啥意思
  • 建设一个网站app需要多少钱郴州网上报名小学系统登录
  • 做电子商务网站公司大兴网站开发网站建设价格
  • 什么网站可以做微官网国内网络销售平台有哪些