欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

如何解決Springservice本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題

如何解決Spring service本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題,相信很多沒有經(jīng)驗(yàn)的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機(jī)構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計(jì)、成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運(yùn)營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價(jià)值。

前些日子一朋友在需要在目標(biāo)對象中進(jìn)行自我調(diào)用,且需要實(shí)施相應(yīng)的事務(wù)定義,且網(wǎng)上的一種通過BeanPostProcessor的解決方案是存在問題的。

1、預(yù)備知識

使用AOP 代理后的方法調(diào)用執(zhí)行流程,如圖所示 如何解決Spring service本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題

也就是說我們首先調(diào)用的是AOP代理對象而不是目標(biāo)對象,首先執(zhí)行事務(wù)切面,事務(wù)切面內(nèi)部通過TransactionInterceptor環(huán)繞增強(qiáng)進(jìn)行事務(wù)的增強(qiáng),即進(jìn)入目標(biāo)方法之前開啟事務(wù),退出目標(biāo)方法時(shí)提交/回滾事務(wù)。

2、測試代碼準(zhǔn)備

Java代碼  

 public interface AService {  
    public void a();  
    public void b();  
}  
   
@Service()  
public class AServiceImpl1 implements AService{  
    @Transactional(propagation = Propagation.REQUIRED)  
    public void a() {  
        this.b();  
    }  
    @Transactional(propagation = Propagation.REQUIRES_NEW)  
    public void b() {  
    }  
}

###3、問題

目標(biāo)對象內(nèi)部的自我調(diào)用將無法實(shí)施切面中的增強(qiáng),如圖所示

如何解決Spring service本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題

此處的this指向目標(biāo)對象,因此調(diào)用this.b()將不會執(zhí)行b事務(wù)切面,即不會執(zhí)行事務(wù)增強(qiáng),因此b方法的事務(wù)定義“@Transactional(propagation = Propagation.REQUIRES_NEW)”將不會實(shí)施,即結(jié)果是b和a方法的事務(wù)定義是一樣的,可以從以下日志看出:

org.springframework.transaction.annotation.AnnotationTransactionAttributeSource Adding transactional method 'a' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'txManager' org.springframework.orm.hibernate4.HibernateTransactionManager Creating new transaction with name [com.sishuok.service.impl.AServiceImpl1.a]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' -----創(chuàng)建a方法事務(wù) org.springframework.orm.hibernate4.HibernateTransactionManager Opened new Session …… for Hibernate transaction ---打開Session …… org.springframework.transaction.support.TransactionSynchronizationManager Initializing transaction synchronization org.springframework.transaction.interceptor.TransactionInterceptor Getting transaction for [com.sishuok.service.impl.AServiceImpl1.a] org.springframework.transaction.interceptor.TransactionInterceptor Completing transaction for [com.sishuok.service.impl.AServiceImpl1.a] ----完成a方法事務(wù) org.springframework.orm.hibernate4.HibernateTransactionManager Triggering beforeCommit synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Triggering beforeCompletion synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Initiating transaction commit

org.springframework.orm.hibernate4.HibernateTransactionManager Committing Hibernate transaction on Session ……---提交a方法事務(wù) 或 org.springframework.orm.hibernate4.HibernateTransactionManager Rolling back Hibernate transaction on Session ……---如果有異常將回滾a方法事務(wù)

org.springframework.orm.hibernate4.HibernateTransactionManager Triggering afterCommit synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Triggering afterCompletion synchronization org.springframework.transaction.support.TransactionSynchronizationManager Clearing transaction synchronization …… org.springframework.orm.hibernate4.HibernateTransactionManager Closing Hibernate Session …… after transaction --關(guān)閉Session

我們可以看到事務(wù)切面只對a方法進(jìn)行了事務(wù)增強(qiáng),沒有對b方法進(jìn)行增強(qiáng)。

3、解決方案

此處a方法中調(diào)用b方法時(shí),只要通過AOP代理調(diào)用b方法即可走事務(wù)切面,即可以進(jìn)行事務(wù)增強(qiáng),如下所示:

Java代碼

public void a() {  
    aopProxy.b();//即調(diào)用AOP代理對象的b方法即可執(zhí)行事務(wù)切面進(jìn)行事務(wù)增強(qiáng)  
}

判斷一個(gè)Bean是否是AOP代理對象可以使用如下三種方法: AopUtils.isAopProxy(bean) : 是否是代理對象; AopUtils.isCglibProxy(bean) : 是否是CGLIB方式的代理對象; AopUtils.isJdkDynamicProxy(bean) : 是否是JDK動態(tài)代理方式的代理對象;

3.1、通過ThreadLocal暴露Aop代理對象

1、開啟暴露Aop代理到ThreadLocal支持(如下配置方式從spring3開始支持)

  <aop:aspectj-autoproxy expose-proxy="true"/><!—注解風(fēng)格支持-->
  <aop:config expose-proxy="true"><!—xml風(fēng)格支持-->

2、修改我們的業(yè)務(wù)實(shí)現(xiàn)類

  this.b();-----------修改為--------->((AService) AopContext.currentProxy()).b();

3、執(zhí)行測試用例,日志如下

org.springframework.beans.factory.support.DefaultListableBeanFactory Returning cached instance of singleton bean 'txManager' org.springframework.orm.hibernate4.HibernateTransactionManager Creating new transaction with name [com.sishuok.service.impl.AServiceImpl2.a]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; '' -----創(chuàng)建a方法事務(wù) org.springframework.orm.hibernate4.HibernateTransactionManager Opened new Session ……for Hibernate transaction --打開a Session org.springframework.orm.hibernate4.HibernateTransactionManager Preparing JDBC Connection of Hibernate Session …… org.springframework.orm.hibernate4.HibernateTransactionManager Exposing Hibernate transaction as JDBC transaction …… …… org.springframework.transaction.support.TransactionSynchronizationManager Initializing transaction synchronization org.springframework.transaction.interceptor.TransactionInterceptor Getting transaction for [com.sishuok.service.impl.AServiceImpl2.a]

org.springframework.transaction.annotation.AnnotationTransactionAttributeSource Adding transactional method 'b' with attribute: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; '' …… org.springframework.orm.hibernate4.HibernateTransactionManager Suspending current transaction, creating new transaction with name [com.sishuok.service.impl.AServiceImpl2.b] -----創(chuàng)建b方法事務(wù)(并暫停a方法事務(wù)) …… org.springframework.orm.hibernate4.HibernateTransactionManager Opened new Session for Hibernate transaction ---打開b Session …… org.springframework.transaction.support.TransactionSynchronizationManager Initializing transaction synchronization org.springframework.transaction.interceptor.TransactionInterceptor Getting transaction for [com.sishuok.service.impl.AServiceImpl2.b] org.springframework.transaction.interceptor.TransactionInterceptor Completing transaction for [com.sishuok.service.impl.AServiceImpl2.b] ----完成b方法事務(wù)

org.springframework.orm.hibernate4.HibernateTransactionManager Triggering beforeCommit synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Triggering beforeCompletion synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Initiating transaction commit org.springframework.orm.hibernate4.HibernateTransactionManager Committing Hibernate transaction on Session …… ---提交b方法事務(wù) org.springframework.orm.hibernate4.HibernateTransactionManager Triggering afterCommit synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Triggering afterCompletion synchronization org.springframework.transaction.support.TransactionSynchronizationManager Clearing transaction synchronization …… org.springframework.orm.hibernate4.HibernateTransactionManager Closing Hibernate Session …… after transaction --關(guān)閉 b Session

-----到此b方法事務(wù)完畢

org.springframework.orm.hibernate4.HibernateTransactionManager Resuming suspended transaction after completion of inner transaction ---恢復(fù)a方法事務(wù) …… org.springframework.transaction.support.TransactionSynchronizationManager Initializing transaction synchronization org.springframework.transaction.interceptor.TransactionInterceptor Completing transaction for [com.sishuok.service.impl.AServiceImpl2.a] ----完成a方法事務(wù) org.springframework.orm.hibernate4.HibernateTransactionManager Triggering beforeCommit synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Triggering beforeCompletion synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Initiating transaction commit org.springframework.orm.hibernate4.HibernateTransactionManager Committing Hibernate transaction on Session ……---提交a方法事務(wù) org.springframework.orm.hibernate4.HibernateTransactionManager Triggering afterCommit synchronization org.springframework.orm.hibernate4.HibernateTransactionManager Triggering afterCompletion synchronization org.springframework.transaction.support.TransactionSynchronizationManager Clearing transaction synchronization …… org.springframework.orm.hibernate4.HibernateTransactionManager Closing Hibernate Session …… after transaction --關(guān)閉 a Session

此處我們可以看到b方法的事務(wù)起作用了。

以上方式是解決目標(biāo)對象內(nèi)部方法自我調(diào)用并實(shí)施事務(wù)的最簡單的解決方案。

4、實(shí)現(xiàn)原理分析

如何解決Spring service本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題

  • 4.1、在進(jìn)入代理對象之后通過AopContext.serCurrentProxy(proxy)暴露當(dāng)前代理對象到ThreadLocal,并保存上次ThreadLocal綁定的代理對象為oldProxy;

  • 4.2、接下來我們可以通過 AopContext.currentProxy() 獲取當(dāng)前代理對象;

  • 4.3、在退出代理對象之前要重新將ThreadLocal綁定的代理對象設(shè)置為上一次的代理對象,即AopContext.serCurrentProxy(oldProxy)。

有些人不喜歡這種方式,說通過ThreadLocal暴露有性能問題,其實(shí)這個(gè)不需要考慮,因?yàn)槭聞?wù)相關(guān)的(Session和Connection)內(nèi)部也是通過SessionHolder和ConnectionHolder暴露到ThreadLocal實(shí)現(xiàn)的。

不過自我調(diào)用這種場景確實(shí)只有很少情況遇到,因此不用這種方式我們也可以通過如下方式實(shí)現(xiàn)。

3.2、通過初始化方法在目標(biāo)對象中注入代理對象

Java代碼

@Service  
public class AServiceImpl3 implements AService{  
    @Autowired  //①  注入上下文  
    private ApplicationContext context;  
      
    private AService proxySelf; //②  表示代理對象,不是目標(biāo)對象  
    @PostConstruct  //③ 初始化方法  
    private void setSelf() {  
        //從上下文獲取代理對象(如果通過proxtSelf=this是不對的,this是目標(biāo)對象)  
        //此種方法不適合于prototype Bean,因?yàn)槊看蝕etBean返回一個(gè)新的Bean  
        proxySelf = context.getBean(AService.class);   
    }  
    @Transactional(propagation = Propagation.REQUIRED)  
    public void a() {  
       proxySelf.b(); //④ 調(diào)用代理對象的方法 這樣可以執(zhí)行事務(wù)切面  
    }  
    @Transactional(propagation = Propagation.REQUIRES_NEW)  
    public void b() {  
    }  
}

此處日志就不分析,和3.1類似。此種方式不是很靈活,所有需要自我調(diào)用的實(shí)現(xiàn)類必須重復(fù)實(shí)現(xiàn)代碼。

3.3、通過BeanPostProcessor在目標(biāo)對象中注入代理對象

此種解決方案可以參考http://fyting.iteye.com/blog/109236。

BeanPostProcessor 的介紹和使用敬請等待我的下一篇分析帖。

一、定義BeanPostProcessor 需要使用的標(biāo)識接口

Java代碼

public interface BeanSelfAware {  
    void setSelf(Object proxyBean);  
}

 即我們自定義的BeanPostProcessor (InjectBeanSelfProcessor)如果發(fā)現(xiàn)我們的Bean是實(shí)現(xiàn)了該標(biāo)識接口就調(diào)用setSelf注入代理對象。

二、Bean實(shí)現(xiàn)

Java代碼

@Service  
public class AServiceImpl4 implements AService, BeanSelfAware {//此處省略接口定義  
    private AService proxySelf;  
    public void setSelf(Object proxyBean) { //通過InjectBeanSelfProcessor注入自己(目標(biāo)對象)的AOP代理對象  
        this.proxySelf = (AService) proxyBean;  
    }  
    @Transactional(propagation = Propagation.REQUIRED)  
    public void a() {  
        proxySelf.b();//調(diào)用代理對象的方法 這樣可以執(zhí)行事務(wù)切面  
    }  
    @Transactional(propagation = Propagation.REQUIRES_NEW)  
    public void b() {  
    }  
}

實(shí)現(xiàn)BeanSelfAware標(biāo)識接口的setSelf將代理對象注入,并且通過“proxySelf.b()”這樣可以實(shí)施b方法的事務(wù)定義。

三、InjectBeanSelfProcessor實(shí)現(xiàn)

Java代碼

@Component  
public class InjectBeanSelfProcessor implements BeanPostProcessor {  
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
        return bean;  
    }  
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
        if(bean instanceof BeanSelfAware) {//如果Bean實(shí)現(xiàn)了BeanSelfAware標(biāo)識接口,就將代理對象注入  
            ((BeanSelfAware) bean).setSelf(bean); //即使是prototype Bean也可以使用此種方式  
        }  
        return bean;  
    }  
}

postProcessAfterInitialization根據(jù)目標(biāo)對象是否實(shí)現(xiàn)BeanSelfAware標(biāo)識接口,通過setSelf(bean)將代理對象(bean)注入到目標(biāo)對象中,從而可以完成目標(biāo)對象內(nèi)部的自我調(diào)用。

關(guān)于BeanPostProcessor的執(zhí)行流程等請一定參考我的這篇帖子,否則無法繼續(xù)往下執(zhí)行。

四、InjectBeanSelfProcessor的問題

**(1、場景:**通過InjectBeanSelfProcessor進(jìn)行注入代理對象且循環(huán)依賴場景下會產(chǎn)生前者無法通過setSelf設(shè)置代理對象的問題。 循環(huán)依賴是應(yīng)該避免的,但是實(shí)際工作中不可避免會有人使用這種注入,畢竟沒有強(qiáng)制性。

(2、用例

(2.1、定義BeanPostProcessor 需要使用的標(biāo)識接口

和3.1中一樣此處不再重復(fù)。

(2.2、Bean實(shí)現(xiàn)

Java代碼

@Service  
public class AServiceImpl implements AService, BeanSelfAware {//此處省略Aservice接口定義  
    @Autowired  
    private BService bService;   //①  通過@Autowired方式注入BService  
    private AService self;       //②  注入自己的AOP代理對象  
    public void setSelf(Object proxyBean) {  
        this.self = (AService) proxyBean;  //③ 通過InjectBeanSelfProcessor注入自己(目標(biāo)對象)的AOP代理對象  
        System.out.println("AService=="+ AopUtils.isAopProxy(this.self)); //如果輸出true標(biāo)識AOP代理對象注入成功  
    }  
    @Transactional(propagation = Propagation.REQUIRED)  
    public void a() {  
        self.b();  
    }  
    @Transactional(propagation = Propagation.REQUIRES_NEW)  
    public void b() {  
    }  
}

Java代碼

@Service  
public class BServiceImpl implements BService, BeanSelfAware {//此處省略Aservice接口定義  
    @Autowired  
    private AService aService;  //①  通過@Autowired方式注入AService  
    private BService self;      //②  注入自己的AOP代理對象  
    public void setSelf(Object proxyBean) {  //③ 通過InjectBeanSelfProcessor注入自己(目標(biāo)對象)的AOP代理對象  
        this.self = (BService) proxyBean;  
        System.out.println("BService=" + AopUtils.isAopProxy(this.self)); //如果輸出true標(biāo)識AOP代理對象注入成功  
    }  
    @Transactional(propagation = Propagation.REQUIRED)  
    public void a() {  
        self.b();  
    }  
    @Transactional(propagation = Propagation.REQUIRES_NEW)  
    public void b() {  
    }  
}

此處A依賴B,B依賴A,即構(gòu)成循環(huán)依賴,此處不探討循環(huán)依賴的設(shè)計(jì)問題(實(shí)際工作應(yīng)該避免循環(huán)依賴),只探討為什么循環(huán)依賴會出現(xiàn)注入代理對象失敗的問題。

循環(huán)依賴請參考我的博文http://jinnianshilongnian.iteye.com/blog/1415278。

依賴的初始化和銷毀順序請參考我的博文http://jinnianshilongnian.iteye.com/blog/1415461。

(2.3、InjectBeanSelfProcessor實(shí)現(xiàn)

和之前3.3中一樣 此處不再重復(fù)。

(2.4、測試用例

Java代碼

@RunWith(value = SpringJUnit4ClassRunner.class)  
@ContextConfiguration(value = {"classpath:spring-config.xml"})  
public class SelfInjectTest {  
    @Autowired  
    AService aService;  
    @Autowired  
    BService bService;  
    @Test  
    public void test() {  
    }  
}

執(zhí)行如上測試用例會輸出:

BService=true

AService==false

即BService通過InjectBeanSelfProcessor注入代理對象成功,而AService卻失敗了(實(shí)際是注入了目標(biāo)對象),如下是debug得到的信息:

如何解決Spring service本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題

如何解決Spring service本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題

(2. 5、這是為什么呢,怎么在循環(huán)依賴會出現(xiàn)這種情況?

敬請期待我的下一篇分析帖。

3.4、改進(jìn)版的InjectBeanSelfProcessor的解決方案

Java代碼

@Component  
public class InjectBeanSelfProcessor2 implements BeanPostProcessor, ApplicationContextAware {  
    private ApplicationContext context;  
    //① 注入ApplicationContext  
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {  
        this.context = applicationContext;  
    }  
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
        if(!(bean instanceof BeanSelfAware)) { //② 如果Bean沒有實(shí)現(xiàn)BeanSelfAware標(biāo)識接口 跳過  
            return bean;  
        }  
        if(AopUtils.isAopProxy(bean)) { //③ 如果當(dāng)前對象是AOP代理對象,直接注入  
            ((BeanSelfAware) bean).setSelf(bean);  
        } else {  
            //④ 如果當(dāng)前對象不是AOP代理,則通過context.getBean(beanName)獲取代理對象并注入  
            //此種方式不適合解決prototype Bean的代理對象注入  
            ((BeanSelfAware)bean).setSelf(context.getBean(beanName));  
        }  
        return bean;  
    }  
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
        return bean;  
    }  
}

5、總結(jié)

縱觀其上: 【3.1 通過ThreadLocal暴露Aop代理對象】適合解決所有場景(不管是singleton Bean還是prototype Bean)的AOP代理獲取問題(即能解決目標(biāo)對象的自我調(diào)用問題);

【3.2 通過初始化方法在目標(biāo)對象中注入代理對象】 和【3.4 改進(jìn)版的InjectBeanSelfProcessor的解決方案】能解決普通(無循環(huán)依賴)的AOP代理對象注入問題,而且也能解決【3.3】中提到的循環(huán)依賴(應(yīng)該是singleton之間的循環(huán)依賴)造成的目標(biāo)對象無法注入AOP代理對象問題,但該解決方案不適合解決循環(huán)依賴中包含prototype Bean的自我調(diào)用問題;

【3.3 通過BeanPostProcessor 在目標(biāo)對象中注入代理對象】:只能解決 普通(無循環(huán)依賴)的 的Bean注入AOP代理,無法解決循環(huán)依賴的AOP代理對象注入問題,即無法解決目標(biāo)對象的自我調(diào)用問題。

jingnianshilongnian 寫道

spring允許的循環(huán)依賴(只考慮單例和原型Bean): A----B B----A 只有在A和B都不為原型是允許的,即如果A和B都是prototype則會報(bào)錯(cuò)(無法進(jìn)行原型Bean的循環(huán)依賴)。 A(單例)---B(單例) 或 A(原型)---B(單例) 這是可以的,但 A(原型)---B(原型)或 A(原型)---B(單例Lazy)【且context.getBean("A")】時(shí) 這是不允許的。

一、A(原型)---B(原型) A(原型)---B(單例Lazy)【且context.getBean("A")】 會報(bào): Error creating bean with name 'BServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sishuok.issue.AService com.sishuok.issue.impl.BServiceImpl.aService; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AServiceImpl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.sishuok.issue.BService com.sishuok.issue.impl.AServiceImpl.bService; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'BServiceImpl': Requested bean is currently in creation: [color=red]Is there an unresolvable circular reference[/color]?

二、A(原型)---B(單例) 和 A(單例)---B(單例) 這種方式 使用我的 【3.3 通過BeanPostProcessor 在目標(biāo)對象中注入代理對象】 是沒有問題的。

因此【 3.4 改進(jìn)版的InjectBeanSelfProcessor的解決方案 】 可以作為最后的解決方案。

看完上述內(nèi)容,你們掌握如何解決Spring service本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

網(wǎng)站名稱:如何解決Springservice本類中方法調(diào)用另一個(gè)方法事務(wù)不生效問題
文章路徑:http://chinadenli.net/article14/goiege.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)網(wǎng)站策劃企業(yè)建站品牌網(wǎng)站制作品牌網(wǎng)站建設(shè)標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)