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

楼盘价格哪个网站做的好网站首页做的好看

楼盘价格哪个网站做的好,网站首页做的好看,个人网站注册平台,网站办公室系列博客目录 文章目录 系列博客目录前言1.Spring1.1 Spring框架中的单例bean是线程安全的吗?面试文稿 1.2 什么是AOP#xff0c;你们项目中有没有使用到AOP#xff1f;Spring中的事务是如何实现的#xff1f;总结面试文稿 1.3 Spring中事务失效的场景有哪些总结面试文稿 1…系列博客目录 文章目录 系列博客目录前言1.Spring1.1 Spring框架中的单例bean是线程安全的吗?面试文稿 1.2 什么是AOP你们项目中有没有使用到AOPSpring中的事务是如何实现的总结面试文稿 1.3 Spring中事务失效的场景有哪些总结面试文稿 1.4 Spring的bean的生命周期BeanDefinition总结面试文稿 1.5 Spring中的循环引用总结面试文稿 1.7 SpringMVC的执行流程知道嘛面试文稿 Springboot自动配置原理总结面试文稿 Spring框架常见注解(Spring、Springmvc、Springboot)面试文稿 MyBatis执行流程面试文稿 Mybatis是否支持延迟加载总结面试文稿 Mybatis的一级、二级缓存用过吗?一级缓存二级缓存注意事项总结面试文稿 前言 现在企业都是用框架进行开发框架的面试题也很重要。spring的框架包含三个Spring、SpringMVB、SpringBoot。和持久层框架MyBatis。 1.Spring 1.1 Spring框架中的单例bean是线程安全的吗? 我们首先要知道 Spring框架中的bean是单例的吗 Service Scope(singleton) public class UserServicelmpl implements UserService { }singleton:bean在每个SpringIOC容器中只有一个实例。prototype:一个bean的定义可以有多个实例。 面试文稿 面试官:Spring框架中的单例bean是线程安全的吗? 候选人:嗯!不是线程安全的是这样的当多用户同时请求一个服务时容器会给每一个请求分配一个线程这时多个线程会并发执行该请求对应的业务逻辑(成员方法)如果该逻辑中有对该单列状态的修改(体现为该单例的成员属性)则必须考虑线程同步问题。 Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。 比如:我们通常在项目中使用的Springbean都是不可改变的状态(比如Service类和DAO类)所以在某种程度上说Spring的单例bean是线程安全的。 如果你的bean有多种状态的话(比如 ViewModel对象)就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用由“singleton变更为“prototype”。 1.2 什么是AOP你们项目中有没有使用到AOP 考察你对AOP的理解有没有使用AOP因为AOP在Spring中是个难点。 AOP称为面向切面编程用于将那些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取并封装为一可重用的模块这个模块被命名为“切面”(Aspect)减少系统中的重复代码降低了模块间的耦合度同时提高了系统的可维护性。 常见的AOP使用场景: 记录操作日志 因为很多地方都需要记录操作日志所以代码是重复的下面一点也是这个原因缓存处理Spring中内置的事务处理 下面详细解释一下如何使用AOP记录操作日 记录操作日志思路 获取请求的用户名、请求方式、访问地址、模块名称、登录ip、操作时间记录到数据库的日志表中。 Component Aspect //切面类 public class SysAspect {Pointcut(annotation(com.itheima.annotation.Log))//检测添加了Log注释的代码来使用下面的AOP代码。private void pointcut() {}Around(pointcut())public Object around(ProceedingJoinPoint joinPoint) throws Throwable {//获取用户名//需要通过解析seesion或token获取//获取被增强类和方法的信息Signature signature joinPoint.getSignature();MethodSignature methodSignature (MethodSignature) signature;//获取被增强的方法对象Method method methodSignature.getMethod();//从方法中解析注解if(method ! null){Log logAnnotation method.getAnnotation(Log.class);System.out.println(logAnnotation.name());}//方法名字String name method.getName();System.out.println(name);//通过工具类获取Request对象RequestAttributes reqa RequestContextHolder.getRequestAttributes();ServletRequestAttributes sra (ServletRequestAttributes)reqa;HttpServletRequest request sra.getRequest();//访问的urlString url request.getRequestURI().toString();System.out.println(url);//请求方式String methodName request.getMethod();System.out.println(methodName);//登录IPString ipAddr getIpAddr(request);System.out.println(ipAddr);//操作时间System.out.println(new Date());*///保存到数据库操作日志//....return joinPoint.proceed();} }下面的代码加了Log注解所以会调用使用AOP中的代码。 使用了AOP代码的输出结果如下。 下面就是在新增日志时候使用AOP来记录操作日志的思路AOP还可以用在很多功能中只要添加了Log注释即可使用AOP的代码。 Spring中的事务是如何实现的 Spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务控制:需使用TransactionTemplate来进行实现对业务代码有侵入性项目中很少使用声明式事务管理:声明式事务管理建立在AOP之上的。其本质是通过AOP功能对方法前后进行拦截将事务处理的功能编织到拦截的方法中也就是在目标方法开始之前加入一个事务在执行完目标方法之后根据执行情况提交或者回滚事务。 开始事务需要在方法上添加Transactional。注意上面红字出错也就是出现异常后面内容需要使用这个逻辑 总结 什么是AOP 面向切面编程用于将那些与业务无关但却对多个对象产生影响的公共行为和逻辑抽取公共模块复用降低耦合。 你们项目中有没有使用到AOP 记录操作日志缓存spring实现的事务。 核心是:使用aop中的环绕通知切点表达式(找到要记录日志的方法)通过环绕通知的参数获取请求方法的参数(类、方法、注解、请求方式等)获取到这些参数以后保存到数据库。 Spring中的事务是如何实现的 其本质是通过AOP功能对方法前后进行拦截在执行方法之前开启事务在执行完目标方法之后根据执行情况提交或者回滚事务。 面试文稿 什么是AOP 候选人AOP即面向切面编程在Spring中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来实现公共模块复用降低耦合。常见的应用场景包括公共日志保存和事务处理。 你们项目中有没有使用到AOP 候选人我们之前在后台管理系统中使用AOP来记录系统操作日志。主要思路是使用AOP的环绕通知和切点表达式找到需要记录日志的方法然后通过环绕通知的参数获取请求方法的参数例如类信息、方法信息、注解、请求方式等并将这些参数保存到数据库。 Spring中的事务是如何实现的 候选人Spring实现事务的本质是利用AOP完成的。它对方法前后进行拦截在执行方法前开启事务在执行完目标方法后根据执行情况提交或回滚事务。 1.3 Spring中事务失效的场景有哪些 主要考察 对spring框架的深入理解、复杂业务更可能导致事务失效的编码经验。 以下都可能会导致事务失效 异常捕获处理抛出检查异常非public方法 情况一异常捕获处理 情况二抛出检查异常 情况三 总结 Spring中事务失效的场景有哪些 异常捕获处理自己处理了异常没有抛出解决:手动抛出抛出检查异常配置rollbackFor属性为Exception非public方法导致的事务失效改为public 面试文稿 Spring中事务失效的场景有哪些 候选人 在项目中我遇到过几种导致事务失效的场景 如果方法内部捕获并处理了异常没有将异常抛出会导致事务失效。因此处理异常后应该确保异常能够被抛出。如果方法抛出检查型异常checked exception并且没有在Transactional注解上配置rollbackFor属性为Exception那么异常发生时事务可能不会回滚。如果事务注解的方法不是公开public修饰的也可能导致事务失效。 1.4 Spring的bean的生命周期 这个题比较难难在bean加载过程中步骤很多不好记忆。为什么问这个问题呢不了解bean的生命周期不影响开发但是掌握了生命周期可以帮助我们更好的掌握Spring的框架更好的去理解 Spring容器是如何管理和创建bean实例。以后遇到bean的相关问题比如spring的循环依赖问题可以让我们更方便的调试和解决问题。 下面先从整体上介绍Bean创建的整个流程再用代码的方式演示一边。 BeanDefinition Spring容器在进行实例化时会将xml配置的的信息封装成一个BeanDefinition对象Spring根据BeanDefinition来创建Bean对象里面有很多的属性用来描述Bean。 bean iduserDao classcom.itheima.dao.impl.UserDaolmpl lazy-inittrue/ bean iduserService classcom.itheima.service.UserServicelmpl scopesingleton property nameuserDao refuserDao/property/beanbeanClassName:bean 的类名initMethodName:初始化方法名称properryValues:bean 的属性值scope:作用域lazyInit:延迟初始化 BeanDefinition首先使用Bean的构造函数来实例化Bean的对象第二步是依赖注入像一些Outwired表明的属性第三步是Aware接口实现接口就要实现里面的方法。 后置处理BeanPostProcessor可以对类实现增强。 package com.itheima.lifecycle;import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component;import javax.annotation.PostConstruct; import javax.annotation.PreDestroy;Component public class User implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {public User() {System.out.println(User的构造方法执行了.........);}private String name ;Value(张三)public void setName(String name) {System.out.println(setName方法执行了.........);}Overridepublic void setBeanName(String name) {System.out.println(setBeanName方法执行了.........);}Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println(setBeanFactory方法执行了.........);}Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println(setApplicationContext方法执行了........);}PostConstructpublic void init() {System.out.println(init方法执行了.................);}Overridepublic void afterPropertiesSet() throws Exception {System.out.println(afterPropertiesSet方法执行了........);}PreDestroypublic void destory() {System.out.println(destory方法执行了...............);}}package com.itheima.lifecycle;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.cglib.proxy.Enhancer; import org.springframework.cglib.proxy.InvocationHandler; import org.springframework.stereotype.Component;import java.lang.reflect.Method;Component public class MyBeanPostProcessor implements BeanPostProcessor {Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {if (beanName.equals(user)) {System.out.println(postProcessBeforeInitialization方法执行了-user对象初始化方法前开始增强....);}return bean;}Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (beanName.equals(user)) {System.out.println(postProcessAfterInitialization-user对象初始化方法后开始增强....);//下面的代码开启没有注释掉则说明带有增强效果//cglib代理对象Enhancer enhancer new Enhancer();//设置需要增强的类enhancer.setSuperclass(bean.getClass());//执行回调方法增强方法enhancer.setCallback(new InvocationHandler() {Overridepublic Object invoke(Object o, Method method, Object[] objects) throws Throwable {//执行目标方法return method.invoke(method,objects);}});//创建代理对象return enhancer.create();}return bean;}}以下是配置代码 Configuration ComponentScan(com.itheima.lifecycle) public class SpringConfig { } 以下是测试代码 package com.itheima.lifecycle;import com.itheima.config.SpringConfig; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class UserTest {public static void main(String[] args) {ApplicationContext ctx new AnnotationConfigApplicationContext(SpringConfig.class);User user ctx.getBean(User.class);System.out.println(user);} }测试结果如下没有执行销毁方法是因为没有关闭容器。销毁方法也不是重点。 通过打断点可以看到user具体是什么类的对象。 未开启增强时 开启增强后获得代理对象。 总结 面试文稿 Spring的bean的生命周期 候选人Spring中bean的生命周期包括以下步骤 通过BeanDefinition获取bean的定义信息。调用构造函数实例化bean。进行bean的依赖注入例如通过setter方法或Autowired注解。处理实现了Aware接口的bean。执行BeanPostProcessor的前置处理器。调用初始化方法如实现了InitializingBean接口或自定义的init-method。执行BeanPostProcessor的后置处理器可能在这里产生代理对象。最后是销毁bean。 1.5 Spring中的循环引用 有循环引用可能会有死循环的问题。下面是否存在某对象是指存在成品的对象不能是半成品。 Spring解决循环依赖是通过三级缓存对应的三级缓存如下所示 显然一级缓存无法处理循环问题。 如果要想打破循环依赖,就需要一个中间人的参与,这个中间人就是二级缓存下图中左边的圆柱体。 但现在放入单例池中的A不是增强后的代理对象A。 如何解决这个问题呢三级缓存。三级缓存帮我们存储对象工厂帮助我们产生普通对象或者代理对象。 下图中最上面的是二级缓存。 Spring使用三级缓存解决了大部分循环引用问题但有些解决不了。 之前我们使用Setter方法注入现在用构造器注入。Bean的生命周期第一步就是调用构造函数三级缓存可以解决初始化从依赖注入到BeanPostProcessor#after中的循环依赖不能解决构造函数中的循环依赖。使用加Lazy延迟加载什么时候需要Bean对象我再进行Bean的创建并不是实例化的时候直接把需要Bean对象注入注入进来。 为什么不能去除二级缓存是因为要把对象工厂生成好的对象放在二级缓存里面不能多次调用对象工厂让它再生成对象它会产生多例处理起来会很麻烦。 总结 Spring中的循环引用 循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A循环依赖在spring中是允许存在spring框架依据三级缓存已经解决了大部分的循环依赖 ① 一级缓存:单例池缓存已经经历了完整的生命周期已经初始化完成的bean对象 ②二级缓存:缓存早期的bean对象(生命周期还没走完) ③ 三级缓存:缓存的是ObjectFactory表示对象工厂用来创建某个对象的对象。 构造方法出现了循环依赖怎么解决? A依赖于BB依赖于A注入的方式是构造函数 原因:由于bean的生命周期中构造函数是第一个执行的spring框架并不能解决构造函数的的依赖注入 解决方案:使用Lazy进行懒加载什么时候需要对象再进行bean对象的创建 面试文稿 Spring中的循环引用 候选人循环依赖发生在两个或两个以上的bean互相持有对方形成闭环。Spring框架允许循环依赖存在并通过三级缓存解决大部分循环依赖问题 一级缓存单例池缓存已完成初始化的bean对象。二级缓存缓存尚未完成生命周期的早期bean对象。三级缓存缓存ObjectFactory用于创建bean对象。 那具体解决流程清楚吗 候选人解决循环依赖的流程如下 实例化A对象并创建ObjectFactory存入三级缓存。A在初始化时需要B对象开始B的创建逻辑。B实例化完成也创建ObjectFactory存入三级缓存。B需要注入A通过三级缓存获取ObjectFactory生成A对象存入二级缓存。B通过二级缓存获得A对象后B创建成功存入一级缓存。A对象初始化时由于B已创建完成可以直接注入BA创建成功存入一级缓存。清除二级缓存中的临时对象A。 构造方法出现了循环依赖怎么解决 候选人由于构造函数是bean生命周期中最先执行的Spring框架无法解决构造方法的循环依赖问题。可以使用Lazy懒加载注解延迟bean的创建直到实际需要时。 1.7 SpringMVC的执行流程知道嘛 Springmvc的执行流程是这个框架最核心的内容一共有两种。 视图阶段(老旧JSP等)前后端分离阶段(接口开发异步) 第一种视图阶段(JSP) 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理器映射器)HandlerMapping找到具体的处理器生成处理器对象及处理器拦截器(如果有)再一起返回给DispatcherServlet.DispatcherServlet调用HandlerAdapter(处理器适配器)HandlerAdapter经过适配调用具体的处理器(Handler/Controller)Controller执行完成返回ModelAndView对象HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServletDispatcherServlet将ModelAndView传给ViewReslover(视图解析器)ViewReslover解析后返回具体View(视图)DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)DispatcherServlet响应用户 第二种前后端分离阶段接口开发、异步请求 用户发送出请求到前端控制器DispatcherServletDispatcherServet收到请求调用HandlerMapping(处理器映射器)HandlerMapping找到具体的处理器生成处理器对象及处理器拦截器(如果有)再一起返回给DispatcherServlet。DispatcherServlet调用HandlerAdapter(处理器适配器)HandlerAdapter经过适配调用具体的处理器(Handler/Controller)方法上添加了ResponseBody通过HttpMessageConverter来将返回结果转换为JSON并响应 面试文稿 SpringMVC的执行流程 候选人SpringMVC的执行流程包括以下步骤 用户发送请求到前端控制器DispatcherServlet。DispatcherServlet调用HandlerMapping找到具体处理器。HandlerMapping返回处理器对象及拦截器如果有给DispatcherServlet。DispatcherServlet调用HandlerAdapter。HandlerAdapter适配并调用具体处理器Controller。Controller执行并返回ModelAndView对象。HandlerAdapter将ModelAndView返回给DispatcherServlet。DispatcherServlet传给ViewResolver进行视图解析。ViewResolver返回具体视图给DispatcherServlet。DispatcherServlet渲染视图并响应用户。 Springboot自动配置原理 Springboot中最高频的一道面试题也是框架最核心的思想问到SpringBoot必问这道题。 三个注解中最重要的是EnableAutoConfiguration下面详细介绍一下。 Import就是导入一些类把他们放到Spring容器中。 右下角有默认提供的一百多个自动配置类但这些并不是都进行加载比如打开一个进行查看。 通过ConditionalOnClass判断是否有对应class来进行是否加载下面的public class RedisAutoConfiguration。Bean就是把下面方法的返回值放入到Spring容器中也就是会有个RedisTemplate型的东西放入到了Spring容器中ConditionalOnMissingBean是来判断当前容器中是否有对应的Bean如果有就不走下面的代码了已经有了就不用再创建了。 总结 Springboot自动配置原理 1、在Spring Boot项目中的引导类上有一个注解SpringBootApplication这个注解是对三个注解进行了封装分别是: SpringBootConfigurationEnableAutoConfigurationComponentScan 2、其中EnableAutoConfiguration是实现自动化配置的核心注解。该注解通过Import注解导入对应的配置选择器。内部就是读取了该项目和该项目引用的Jar包的classpath路径下META-INF/spring.factories文件中的所配置的类的全类名。在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到Spring容器中。 3、条件判断会有像ConditionalOnClass这样的注解判断是否有对应的class字节码文件如果有则加载该类把这个配置类的所有的Bean放入spring容器中使用。 面试文稿 Springboot自动配置原理 候选人Spring Boot的自动配置原理基于SpringBootApplication注解它封装了SpringBootConfiguration、EnableAutoConfiguration和ComponentScan。EnableAutoConfiguration是核心它通过Import导入配置选择器读取META-INF/spring.factories文件中的类名根据条件注解决定是否将配置类中的Bean导入到Spring容器中。 Spring框架常见注解(Spring、Springmvc、Springboot) 面试文稿 谈到注解主要讲Spring中请求和相应的注解SpringMVC中注入的注解SpringBoot中自动装配的注解。注意不要混淆着去说。 Spring 的常见注解有哪些 候选人Spring的常见注解包括 声明Bean的注解Component、Service、Repository、Controller。依赖注入相关注解Autowired、Qualifier、Resource。设置作用域的注解Scope。配置相关注解Configuration、ComponentScan、Bean。AOP相关注解Aspect、Before、After、Around、Pointcut。 SpringMVC常见的注解有哪些 候选人SpringMVC的常见注解有 RequestMapping映射请求路径。RequestBody接收HTTP请求的JSON数据。RequestParam指定请求参数名称。PathVariable从请求路径中获取参数。ResponseBody将Controller方法返回的对象转化为JSON。RequestHeader获取请求头数据。PostMapping、GetMapping等。 Springboot常见注解有哪些 候选人Spring Boot的常见注解包括 SpringBootApplication由SpringBootConfiguration、EnableAutoConfiguration和ComponentScan组成。其他注解如RestController、GetMapping、PostMapping等用于简化Spring MVC的配置。 MyBatis执行流程 了解执行流程可以更好的 理解了各个组件的关系Sql的执行过程(参数映射、sql解析、执行和结果处理) 有了配置文件再用sqlsession来操作数据库。 mappedStatement对象就是用来封装某一个标签的也就是一次数据库操作。 面试文稿 MyBatis执行流程 候选人MyBatis的执行流程如下 读取MyBatis配置文件mybatis-config.xml。构造会话工厂SqlSessionFactory。会话工厂创建SqlSession对象。操作数据库的接口Executor执行器。Executor执行方法中的MappedStatement参数。输入参数映射。输出结果映射。 Mybatis是否支持延迟加载 Mybatis支持延迟记载但默认没有开启。什么叫做延迟加载? 延迟加载原理 使用CGLIB创建目标对象的代理对象当调用目标方法user.getOrderlist()时进入拦截器invoke方法发现user.getOrderlist()是nul值执行sal查询order列表把order查询上来然后调用user.setOrderList(ListorderList)接着完成user.getOrderList()方法的调用 总结 面试文稿 Mybatis是否支持延迟加载 候选人MyBatis支持延迟加载即在需要用到数据时才加载。可以通过配置文件中的lazyLoadingEnabled配置启用或禁用延迟加载。 延迟加载的底层原理知道吗 候选人延迟加载的底层原理主要使用CGLIB动态代理实现 使用CGLIB创建目标对象的代理对象。调用目标方法时如果发现是null值则执行SQL查询。获取数据后设置属性值并继续查询目标方法。 Mybatis的一级、二级缓存用过吗? 下图是一般的缓存的思路一级、二级缓存的思路与下面基本相同。 本地缓存基于PerpetualCache类本质是一个HashMap。下面两个都基于本地缓存来做的缓存。 一级缓存:作用域是session级别SqlSession范围相对较小二级缓存:作用域是namespace和mapper的作用域不依赖于sessionSqlSession。 一级缓存 一级缓存:基于 PerpetualCache 的 HashMap 本地缓存其存储作用域为 Session当Session进行flush或close之后该Session中的所有Cache就将清空默认打开一级缓存。 上面图中代码只用了一个SqlSession。但是要是用来两个SqlSession那就要执行两次查询。 二级缓存 二级缓存是基于namespace和mapper的作用域起作用的不是依赖于SQLsession默认也是采用 PerpetualCache类 HashMap 存储。 如何只执行一次SQL呢开启二级缓存。 注意事项 对于缓存数据更新机制当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后默认该 作用域下所有 select 中的缓存将被 clear二级缓存需要缓存的数据实现Serializable接口只有会话提交或者关闭以后一级缓存中的数据才会转移到二级缓存中 总结 面试文稿 Mybatis的一级、二级缓存用过吗 候选人MyBatis的一级缓存是基于PerpetualCache的HashMap本地缓存作用域为Session默认开启。二级缓存需要单独开启作用域为Namespace或mapper默认也是采用PerpetualCacheHashMap存储。 Mybatis的二级缓存什么时候会清理缓存中的数据 候选人当作用域一级缓存Session/二级缓存Namespaces进行了新增、修改、删除操作后默认该作用域下所有select中的缓存将被清空。
http://www.pierceye.com/news/980783/

相关文章:

  • 河东手机网站建设工作服厂家联系方式
  • 站长工具seo综合查询搭建流程
  • 各省住房和城乡建设厅网站怎样租用个人网站空间
  • 深圳市南山区住房和建设局网站官网桂林两江四湖象山景区讲解导游词
  • 环保网站设计是什么柴沟堡做网站公司
  • 用php和mysql做网站wordpress怎么创建自己的博客
  • 网站建设制作设计珠海百度收录排名
  • 有没有做家具特卖的网站360建筑
  • 网站建设技术架构学校网站建设源代码
  • 无为教育网站网站平面设计培训
  • 广东省建筑网站信誉好的低价网站建设
  • 高端网站建设 杭州做效果图网站
  • 进贤县住房和城乡建设局网站短网址生成网站源码
  • 手机网站用二级目录做的弊端四川建设人员数据网站
  • 做网站什么类型好数据分析师培训需要多少钱
  • 建html5网站合作网站开发
  • 南通网站推广优化公司网站语言切换功能如何做
  • php网站开发案例论文临沂网站建设中企动力
  • 霸州做网站1766534168WordPress全局屏蔽谷歌
  • 织梦做的网站被黑了北京互联网排名
  • 专业seo整站优化专业建站教程
  • 网站建设合同注意点什么网站可以接设计方案
  • 青岛建设公司网站费用建网站的流程和费用
  • 徐州cms模板建站液压电机东莞网站建设
  • 阿里巴巴国际站运营工作内容北京软件开发公司排行榜最新
  • 电子商务网站的开发流程包括泉州seo建站
  • 微信h5商城网站开发米拓模板网站建设
  • 品牌网站设计案例wordpress 实例
  • 郑州大学科技园手机网站建设wordpress 新手指南
  • 国外免费建站网站搭建南阳网站排名优化报价