当前位置: 首页 > news >正文 网站做导航的地图导航七零三八零四温州论坛 news 2025/10/25 5:19:09 网站做导航的地图导航,七零三八零四温州论坛,cms系统使用教程,电子商务网页设计代码文章目录 IOC与DI区别联系总结 依赖注入解耦管理对象的生命周期提高配置灵活性三种注入方式不可变对象的设计 构造器注入Setter方法注入字段注入Setter方法注入为什么不破坏封装性字段注入为什么破坏封装性为什么将字段或setter方法设置为private#xff1f;总结 setter方法注… 文章目录 IOC与DI区别联系总结 依赖注入解耦管理对象的生命周期提高配置灵活性三种注入方式不可变对象的设计 构造器注入Setter方法注入字段注入Setter方法注入为什么不破坏封装性字段注入为什么破坏封装性为什么将字段或setter方法设置为private总结 setter方法注入和字段注入Setter方法注入字段注入 在Setter方法注入和字段注入中提供访问和修改对象内部状态的途径Setter方法注入字段注入 将字段注入和Setter方法注入中的字段或方法设置为private字段注入即使字段为privateSetter方法注入即使setter方法为private潜在问题 Spring框架中构造函数主要用于创建和管理bean。Spring通过构造函数来实例化bean并可以自动注入所需的依赖项。这通常与Spring的依赖注入功能结合使用以简化对象的创建和配置过程 构造函数注入Constructor Injection 构造函数注入是通过bean的构造函数来传递依赖项。在Spring中你可以通过在构造函数上添加Autowired注解来自动注入所需的依赖项。构造函数注入的一个主要优点是它可以确保依赖项在bean创建时就已准备好从而避免了部分初始化的状态。然而构造函数注入的一个潜在缺点是如果依赖项很多构造函数可能会变得非常长且难以管理。 Setter方法注入Setter Injection Setter方法注入是通过bean的setter方法来设置依赖项。Spring容器会在bean实例化后调用相应的setter方法来注入依赖项。Setter方法注入的一个优点是它允许依赖项在bean的生命周期中的任何时间点进行注入这在某些情况下可能更为灵活。Setter方法注入的另一个优点是它允许bean具有可选的依赖项因为这些依赖项可以通过调用相应的setter方法来设置也可以不设置。 所以setter方法确实可以用来创建和管理bean特别是在需要更灵活的依赖注入时。但在使用setter方法注入时需要确保setter方法是public的并且遵循JavaBean的命名约定即方法名以set开头后面跟着属性名属性名的首字母大写。 在Spring中虽然不直接使用new来创建对象但Spring容器会根据配置(XML、JavaConfig或注解)自动创建和管理bean的实例。这相当于在幕后使用了new但添加了更多的管理和配置功能。 IOC与DI 在Spring框架中依赖注入Dependency Injection简称DI和控制反转Inversion of Control简称IoC是密切相关的概念它们通常一起使用来实现松耦合的应用程序架构。以下是它们之间的区别与联系 区别 概念层次 控制反转IoC是一个更广泛的概念它描述了一种设计原则即应用程序中组件之间的依赖关系的管理权从组件内部转移到外部容器或框架。这种转移使得组件之间的耦合度降低提高了系统的可维护性和可扩展性。依赖注入DI是IoC原则的一种具体实现方式。它通过外部容器或框架将依赖项注入到组件中而不是由组件自己创建或查找依赖项。这确保了组件只关注自己的核心功能而不必关心依赖项的创建和管理。 关注点 IoC关注的是控制权的转移即谁负责创建和管理组件之间的依赖关系。DI关注的是如何实现这种控制权的转移即如何将依赖项注入到组件中。 联系 相互依赖依赖注入是实现控制反转的一种手段。通过依赖注入外部容器或框架可以管理组件之间的依赖关系从而实现控制反转。共同目标IoC和DI都旨在降低组件之间的耦合度提高系统的可维护性和可扩展性。它们通过外部化依赖项的管理和注入来实现这一目标。在Spring中的应用在Spring框架中IoC容器负责创建和管理bean之间的依赖关系。这些bean可以通过构造器注入、Setter方法注入或字段注入等方式接收依赖项。因此在Spring中依赖注入是实现控制反转的一种核心机制。 总结 控制反转IoC和依赖注入DI是密切相关的概念在Spring框架中共同发挥着重要作用。IoC描述了组件之间依赖关系管理权的转移而DI是实现这种转移的一种具体方式。通过依赖注入外部容器或框架可以管理组件之间的依赖关系从而降低组件之间的耦合度提高系统的可维护性和可扩展性。在Spring中IoC容器通过依赖注入机制来创建和管理bean之间的依赖关系。 依赖注入 依赖注入是一种设计模式用于实现控制反转。在Spring中这主要通过以下方式实现 解耦 通过依赖注入对象的依赖关系由外部容器(如Spring容器)管理。这减少了对象之间的直接依赖提高了代码的可维护性和可测试性 管理对象的生命周期 Spring容器不仅负责创建对象还管理它们的生命周期包括初始化、消耗等。 提高配置灵活性 依赖关系可以通过配置文件、注解或其他方式进行定义这使得配置更加灵活。可以在不修改源代码的情况下通过修改配置来改变对象之间的依赖关系 在Spring中依赖注入通常与构造函数、setter方法或字段注入结合使用。例如当Spring创建一个bean时它可以通过调用该bean的构造函数并传递必要的依赖项来实现依赖注入 三种注入方式 在Spring框架中依赖注入Dependency Injection简称DI是一个核心概念。它允许你将对象的依赖关系即它们需要的服务或组件从外部注入而不是在对象内部创建这些依赖。这有助于降低代码之间的耦合度提高可测试性和可维护性。 Spring支持三种主要的依赖注入方式构造函数注入、setter方法注入和字段注入。 构造函数注入通过构造函数来传递依赖关系。当创建对象时依赖项会作为构造函数的参数被传递进来。这种方式可以确保所有的依赖项在对象创建时就已经被初始化从而保证对象的状态在创建后就是有效的。构造函数注入也支持不可变对象的设计因为所有的依赖项在构造函数中就已经被赋值之后无法再被修改。 Component public class MyClass { private final MyDependency myDependency; Autowired public MyClass(MyDependency myDependency) { this.myDependency myDependency; } }setter方法注入通过setter方法来传递依赖关系。在对象创建后可以通过调用setter方法来设置依赖项。这种方式提供了更大的灵活性因为可以在运行时动态地更改依赖项。然而它也可能导致对象在部分初始化的状态下被使用从而引发潜在的问题。 Component public class MyClass { private MyDependency myDependency; Autowired public void setMyDependency(MyDependency myDependency) { this.myDependency myDependency; } }字段注入直接在字段上使用注解来注入依赖关系。这种方式简单且直观但通常不建议在生产代码中使用因为它违反了封装原则使得字段直接暴露给外部。此外它也不利于单元测试和代码的可维护性。 Component public class MyClass { Autowired private MyDependency myDependency; }在实际开发中推荐使用构造函数注入因为它保证了依赖的不可变性有助于编写更健壮和可测试的代码。然而在某些特定场景下setter方法注入可能更为合适尤其是当需要在运行时动态更改依赖项时。字段注入虽然简单方便但通常应谨慎使用以避免潜在的问题。 不可变对象的设计 在构造函数注入中依赖项是在对象创建时通过构造函数参数传递进来的。这些依赖项通常被赋值给类的私有成员变量。如果这些成员变量被声明为final那么它们就只能在构造函数中被赋值一次之后就不能再被修改。 即使成员变量没有被声明为final如果类的设计遵循了不可变对象的原则那么这些成员变量在构造函数中被初始化后类中不会提供任何修改这些成员变量的方法如setter方法。这样从类的外部就无法更改这些依赖项。 不可变对象的设计有几个优点 线程安全由于对象的状态在创建后就不能再改变因此它是线程安全的不需要额外的同步措施。简化逻辑不可变对象没有状态变化因此更容易理解和推理其行为。减少错误由于状态不可变因此不会出现因状态改变而导致的错误或不一致。 在Spring框架中通过构造函数注入依赖并实现不可变对象的设计是一种常见的做法因为它结合了依赖注入的优点和不可变对象的健壮性。这种做法确保了当Spring容器创建bean时所有的依赖项都已经被正确地注入并且之后不会再发生变化从而提高了应用的稳定性和可预测性。 下面是一个简单的例子展示了如何使用构造函数注入来创建一个不可变的对象 Component public class MyService { private final MyDependency myDependency; // final关键字确保这个变量只能被赋值一次 Autowired public MyService(MyDependency myDependency) { this.myDependency myDependency; // 在构造函数中初始化依赖项 } // 类中不提供修改myDependency的方法确保其不可变性 public void performAction() { // 使用myDependency来完成某些操作 } }在这个例子中MyService类的myDependency成员变量被声明为final并且在构造函数中被初始化。由于没有提供修改这个变量的方法因此它是不可变的。 在Spring框架中依赖注入Dependency Injection, DI是一个核心概念它允许我们将对象的依赖关系从外部注入而不是在对象内部创建这些依赖。Spring提供了多种方式来实现依赖注入其中最常见的是构造器注入和Setter方法注入。尽管字段注入也被Spring支持但通常不推荐使用因为它违反了封装性原则。 构造器注入 构造器注入是Spring推荐的方式之一因为它强制在创建对象时提供所有必需的依赖项从而确保对象在创建时就已经完全初始化。这种方式有助于减少对象处于部分初始化状态的风险并提高了代码的健壮性。 在Spring中你可以通过在类的构造器上添加参数来使用构造器注入。Spring容器在创建bean实例时会自动调用带有适当参数的构造器并将依赖项注入到这些参数中。 Setter方法注入 Setter方法注入允许在对象创建后通过调用setter方法来设置依赖项。这种方式提供了更大的灵活性因为你可以在对象创建后的任何时间点注入依赖项。然而它也可能导致对象在部分初始化的状态下被使用从而引发潜在的问题。 在Spring中你可以通过在setter方法上使用Autowired注解来使用Setter方法注入。Spring容器会在bean实例化后自动调用这些带有Autowired注解的setter方法并将匹配的依赖项注入到对象中。 字段注入 尽管字段注入在Spring中是可能的通过在字段上使用Autowired注解但它通常不被推荐因为它直接暴露了类的内部状态破坏了封装性。使用字段注入的代码更难于测试和维护因为它使得类的内部实现细节对外部可见。 Setter方法注入为什么不破坏封装性 Setter方法注入不破坏封装性的原因是因为它允许对象在创建之后通过公开的方法来设置其内部状态同时保持了对这些状态的完全控制。对象通过setter方法可以执行任何必要的验证、初始化或其他逻辑以确保状态的完整性和一致性。 例子 假设有一个UserService类它依赖于一个UserRepository来访问数据库。 Service public class UserService { private UserRepository userRepository; Autowired public void setUserRepository(UserRepository userRepository) { // 这里可以添加一些初始化逻辑或验证 if (userRepository null) { throw new IllegalArgumentException(UserRepository cannot be null); } this.userRepository userRepository; } // ... 其他方法 ... }在这个例子中UserService通过公开的setter方法setUserRepository来接收UserRepository的依赖注入。由于setter方法是公开的外部代码在这里是Spring容器可以调用它但UserService仍然控制着userRepository字段的访问和赋值这符合封装性的原则。 字段注入为什么破坏封装性 字段注入破坏封装性的原因是因为它直接暴露了类的内部状态给外部代码。当字段被标记为public或通过字段注入的方式被外部直接访问和修改时类的内部实现细节就被泄露了这违反了封装性的原则。 例子 Service public class UserService { Autowired public UserRepository userRepository; // 直接字段注入 // ... 其他方法 ... }在这个例子中userRepository字段被直接标记为Spring管理的bean这意味着Spring容器可以直接访问和修改这个字段。这不仅使得UserService的内部状态对外部可见而且还可能导致不可预测的行为因为任何能够访问UserService实例的代码都可以修改userRepository字段。此外这也使得测试和维护变得更加困难因为你需要确保在所有情况下userRepository字段都被正确地设置。 总结来说Setter方法注入通过提供公开的方法来设置内部状态同时保持了对这些状态的控制因此不破坏封装性。而字段注入则直接暴露了类的内部状态给外部代码从而破坏了封装性。在设计和编写代码时应该优先考虑使用Setter方法注入来维护良好的封装性。 为什么将字段或setter方法设置为private 将字段或setter方法设置为private可以提高封装性这是面向对象编程的一个基本原则。封装性意味着隐藏对象的内部实现细节只对外暴露必要的接口。通过将字段和setter方法设置为private你可以确保只有类的内部代码能够直接访问和修改这些字段从而减少了外部代码对类内部状态的干扰和破坏。 然而在Spring中即使你将字段或setter方法设置为privateSpring容器仍然能够注入依赖项因为它使用了反射机制来访问和修改这些私有成员。但重要的是要明白这并不是说你应该在Spring中使用反射来绕过封装性。相反你应该利用Spring提供的依赖注入机制来正确地管理你的对象的依赖项。 总结 在Spring中你应该优先使用构造器注入或Setter方法注入来管理对象的依赖项。这两种方式都提供了良好的封装性和灵活性并且与Spring的依赖注入机制兼容。避免使用字段注入因为它违反了封装性原则并可能导致难以维护的代码。通过将字段和setter方法设置为private你可以进一步提高封装性并确保你的代码更加健壮和可维护。 setter方法注入和字段注入 Setter方法注入和字段注入之所以能够修改对象状态是因为它们提供了访问和修改对象内部状态的途径。具体来说这两种注入方式允许外部代码更改对象的依赖项或字段值从而影响对象的内部状态和行为。 Setter方法注入 Setter方法注入允许在对象创建后通过调用对象的setter方法来动态地设置或更改依赖项。这种方式的问题主要在于 部分初始化状态 如果setter方法没有在对象创建后立即调用或者在多线程环境中调用时序不正确对象可能会在依赖项未完全设置的情况下被使用。这导致对象处于部分初始化的状态可能引发NullPointerException、逻辑错误或其他运行时异常。 状态的不确定性 由于依赖项可以在对象生命周期的任何时刻被更改这增加了对象状态的不确定性。如果外部代码在不恰当的时机更改了依赖项可能会导致对象行为的不一致和难以预测。 依赖管理复杂性 允许动态更改依赖项意味着需要更复杂的依赖管理和状态同步机制以确保在任何时候对象的依赖项都是有效和一致的。 字段注入 字段注入是通过在字段上直接使用注解来注入依赖关系。这种方式的问题包括 封装性破坏 字段注入直接暴露了类的内部字段违反了面向对象编程的封装原则。任何能够访问这些字段的外部代码都可以修改它们这可能导致对象状态的意外更改和不可预测的行为。 安全性风险 暴露的字段可能引发安全性问题因为恶意代码可能会利用这些暴露的字段来篡改对象状态或窃取数据。 可维护性下降 当字段名称、类型或逻辑更改时所有直接引用这些字段的代码也需要相应更新这增加了代码的维护成本。 测试困难 由于字段是公开的编写单元测试时需要额外注意控制这些字段的状态以确保测试的准确性和隔离性。这可能会使测试变得更加复杂和脆弱。 综上所述Setter方法注入和字段注入都能修改对象状态但它们各自带来的问题不同。Setter方法注入主要问题在于可能导致对象的部分初始化和状态的不确定性而字段注入则主要破坏了封装性增加了安全风险并降低了代码的可维护性和可测试性。因此在实际开发中需要谨慎使用这两种注入方式并根据具体情况权衡利弊。 在Setter方法注入和字段注入中提供访问和修改对象内部状态的途径 在Setter方法注入和字段注入中提供访问和修改对象内部状态的途径分别是 Setter方法注入 提供访问的途径 通过公开的setter方法。这些方法通常被设计为public允许外部代码调用以设置或更改对象的内部状态。 提供修改的途径 同样是通过调用上述的setter方法并传递新的依赖项或值作为参数从而实现对对象内部状态的修改。 例如如果有一个setService(Service service)的setter方法外部代码可以通过调用这个方法并传入一个新的Service实例来更改对象所依赖的服务。 字段注入 提供访问的途径 通过直接访问对象的公共字段或使用反射技术访问私有字段尽管这通常不是推荐的做法。如果字段是public的那么任何能够访问到该对象的代码都可以直接读取字段的值。 提供修改的途径 直接对公共字段赋值。如果字段是public的外部代码可以直接修改字段的值从而改变对象的内部状态。使用反射来修改私有字段的值尽管这种做法应该避免因为它破坏了封装性并可能导致不可预知的副作用。 例如如果有一个public字段Service service外部代码可以直接通过object.service newServiceInstance;来更改服务依赖。 需要注意的是尽管字段注入提供了直接访问和修改对象内部状态的途径但这通常被认为是不良实践因为它破坏了封装性使得代码更加脆弱且难以维护。Setter方法注入虽然也提供了修改对象状态的途径但相对于字段注入它更好地维护了封装性并允许在设置依赖项之前进行一些验证或初始化逻辑。 将字段注入和Setter方法注入中的字段或方法设置为private 将字段注入和Setter方法注入中的字段或方法设置为private确实可以提高封装性但这样做并不能完全解决问题而且每种方式仍有其特有的考虑和问题。 字段注入即使字段为private 即使你将注入的字段设置为private你仍然需要某种方式来设置这个字段的值通常是通过构造函数、一个公开的setter方法或使用反射。如果你选择使用公开的setter方法那么问题就与Setter方法注入相似了。如果你选择使用反射来设置私有字段那么你将牺牲一部分性能和代码清晰度并且反射操作通常比直接方法调用要慢。 此外即使字段是私有的如果你通过反射或其他非标准方式来设置它你仍然可能破坏封装性并引入难以追踪的bug和安全问题。 Setter方法注入即使setter方法为private 将setter方法设置为private将阻止外部代码直接调用它但这通常不是依赖注入所期望的行为。依赖注入的目的是允许在运行时动态地更改依赖项以提高代码的灵活性和可测试性。如果setter方法是私有的那么你就需要在类内部提供另一种机制来允许依赖项的设置这可能会使设计变得复杂。 在实际应用中private setter方法通常用于以下几种情况 仅供类内部使用有时你可能希望在类内部的不同方法之间共享某个状态但不希望这个状态被外部类更改。在这种情况下一个private setter方法是有意义的。配合特定的设计模式使用例如建造者模式Builder Pattern其中private setter方法用于在构建对象的过程中设置属性。用于单元测试在某些情况下你可能希望为单元测试提供一个后门来设置或更改对象的内部状态。虽然这样做可以方便测试但它也破坏了封装性并可能导致测试与实现之间的紧密耦合。 潜在问题 封装性的破坏即使字段或方法是private的使用反射或内部机制来更改状态仍然可能破坏封装性。代码清晰度使用非标准方式来设置私有字段或调用私有方法可能会使代码难以理解和维护。安全性和错误预防私有字段和方法通常是为了防止外部错误操作而设计的。绕过这些限制可能会引入安全隐患和难以追踪的错误。测试复杂性虽然为测试提供后门可以方便测试但这也可能导致测试与实现的紧密耦合使得当实现更改时测试也需要相应更改。性能开销使用反射来访问或修改私有成员通常比直接访问或调用方法要慢得多。 综上所述将字段或setter方法设置为private可以提高封装性但并不能完全解决所有问题。在设计时应该权衡各种因素包括封装性、灵活性、可测试性和性能等。 文章转载自: http://www.morning.mftzm.cn.gov.cn.mftzm.cn http://www.morning.qytby.cn.gov.cn.qytby.cn http://www.morning.ishoufeipin.cn.gov.cn.ishoufeipin.cn http://www.morning.grxyx.cn.gov.cn.grxyx.cn http://www.morning.rhmpk.cn.gov.cn.rhmpk.cn http://www.morning.wmyqw.com.gov.cn.wmyqw.com http://www.morning.xqltq.cn.gov.cn.xqltq.cn http://www.morning.bsxws.cn.gov.cn.bsxws.cn http://www.morning.zcncb.cn.gov.cn.zcncb.cn http://www.morning.xxzjb.cn.gov.cn.xxzjb.cn http://www.morning.qfrmy.cn.gov.cn.qfrmy.cn http://www.morning.dfkby.cn.gov.cn.dfkby.cn http://www.morning.klrpm.cn.gov.cn.klrpm.cn http://www.morning.lhytw.cn.gov.cn.lhytw.cn http://www.morning.tfqfm.cn.gov.cn.tfqfm.cn http://www.morning.qclmz.cn.gov.cn.qclmz.cn http://www.morning.mjctt.cn.gov.cn.mjctt.cn http://www.morning.yfstt.cn.gov.cn.yfstt.cn http://www.morning.kdnbf.cn.gov.cn.kdnbf.cn http://www.morning.bchgl.cn.gov.cn.bchgl.cn http://www.morning.wyppp.cn.gov.cn.wyppp.cn http://www.morning.nzmw.cn.gov.cn.nzmw.cn http://www.morning.jzsgn.cn.gov.cn.jzsgn.cn http://www.morning.kgphd.cn.gov.cn.kgphd.cn http://www.morning.hnrpk.cn.gov.cn.hnrpk.cn http://www.morning.xprzq.cn.gov.cn.xprzq.cn http://www.morning.bmjfp.cn.gov.cn.bmjfp.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.supera.com.cn.gov.cn.supera.com.cn http://www.morning.bpds.cn.gov.cn.bpds.cn http://www.morning.kgcss.cn.gov.cn.kgcss.cn http://www.morning.ghcfx.cn.gov.cn.ghcfx.cn http://www.morning.pgcmz.cn.gov.cn.pgcmz.cn http://www.morning.rzdzb.cn.gov.cn.rzdzb.cn http://www.morning.tkgjl.cn.gov.cn.tkgjl.cn http://www.morning.grryh.cn.gov.cn.grryh.cn http://www.morning.tkfnp.cn.gov.cn.tkfnp.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.sjpbh.cn.gov.cn.sjpbh.cn http://www.morning.ydgzj.cn.gov.cn.ydgzj.cn http://www.morning.mlycx.cn.gov.cn.mlycx.cn http://www.morning.brsgw.cn.gov.cn.brsgw.cn http://www.morning.rkkpr.cn.gov.cn.rkkpr.cn http://www.morning.qkqjz.cn.gov.cn.qkqjz.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.hqrkq.cn.gov.cn.hqrkq.cn http://www.morning.kkjlz.cn.gov.cn.kkjlz.cn http://www.morning.fmqng.cn.gov.cn.fmqng.cn http://www.morning.srbfp.cn.gov.cn.srbfp.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.nrxsl.cn.gov.cn.nrxsl.cn http://www.morning.2d1bl5.cn.gov.cn.2d1bl5.cn http://www.morning.ppllj.cn.gov.cn.ppllj.cn http://www.morning.gtwtk.cn.gov.cn.gtwtk.cn http://www.morning.lfdmf.cn.gov.cn.lfdmf.cn http://www.morning.zzgkk.cn.gov.cn.zzgkk.cn http://www.morning.bgpb.cn.gov.cn.bgpb.cn http://www.morning.rdbj.cn.gov.cn.rdbj.cn http://www.morning.rmmz.cn.gov.cn.rmmz.cn http://www.morning.yqlrq.cn.gov.cn.yqlrq.cn http://www.morning.jlschmy.com.gov.cn.jlschmy.com http://www.morning.fwnyz.cn.gov.cn.fwnyz.cn http://www.morning.c7496.cn.gov.cn.c7496.cn http://www.morning.qhrsy.cn.gov.cn.qhrsy.cn http://www.morning.mznqz.cn.gov.cn.mznqz.cn http://www.morning.iterlog.com.gov.cn.iterlog.com http://www.morning.rhwty.cn.gov.cn.rhwty.cn http://www.morning.zdkzj.cn.gov.cn.zdkzj.cn http://www.morning.ppbrq.cn.gov.cn.ppbrq.cn http://www.morning.qkrqt.cn.gov.cn.qkrqt.cn http://www.morning.zntf.cn.gov.cn.zntf.cn http://www.morning.rtqyy.cn.gov.cn.rtqyy.cn http://www.morning.lywcd.cn.gov.cn.lywcd.cn http://www.morning.xnqwk.cn.gov.cn.xnqwk.cn http://www.morning.rwmqp.cn.gov.cn.rwmqp.cn http://www.morning.rsmtx.cn.gov.cn.rsmtx.cn http://www.morning.tdcql.cn.gov.cn.tdcql.cn http://www.morning.rqrh.cn.gov.cn.rqrh.cn http://www.morning.xqgtd.cn.gov.cn.xqgtd.cn http://www.morning.jgykx.cn.gov.cn.jgykx.cn 查看全文 http://www.tj-hxxt.cn/news/247315.html 相关文章: 长春网站建设中心网站建设外包给别人要注意什么 企业网站建设项目描述网站前台管理系统 网站的分享按键智慧团建密码只能是8位吗 龙口市建设局网站新站seo外包 深圳网站优化怎么做开个小公司注册资金要多少 用名字做头像是什么网站培训机构管理系统 资海网站建设wordpress 淘宝客采集 高端网站开发哪里有seo排名优化 电子商务网站建设和运营哈尔滨做网站的oeminc 门户类网站建立有哪些构成长治百姓网免费发布信息网 php网站的首页wordpress去除自豪的采用 手机做无水印短视频网站wordpress名博 邯郸市建设局网站门店管理系统软件排行 生鲜网站建设背景代码分享wordpress 怎么做简易手机网站佛山网站seo推广推荐 达州市住房和建设厅网站网站建设属于什么费用 国外免费建购物网站网页设计与网站建设考试名词解释 网站搭建规划模板做网站必须用对方服务器 网站建设的视频台州外发加工网 品牌网站建设预算dede网站版权信息 wordpress小说站30几岁的人想学做网站 特产电商网站建设报价单短网址生成条形码 公司做网站那家好企业软件 公司的 SEO与网站建设温州网站建设咨询 三亚中国检科院生物安全中心门户网站建设临沂法律网站开发公司 有没有教做帽子的网站自己怎么做wap网站 做网站不想用微软雅黑了重庆辣肠怎么制作 太原站建设有多长时间保定聊城网站建设 1微信网站怎么建设企业网站关键字优化 百度网站建设前期都有哪些费用阳江百姓网