`
85977328
  • 浏览: 1899386 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring3.0.5与JPA2.0(hibernate3.6)的集成详细说明

阅读更多
一 前言   
    最近在做个项目,JPA使用了hibernate3.6.后来觉得JPA单独使用不是很给力,于是就想到了和spring集成.刚开始,我是用spring2.5.6和hibernate3.6集成的,屡次不成功.后来研究发现,hibernate3.6的JPA是2.0的.狂晕.下面是spring3.0.5(支持JPA2.0)和hibernate3.6集成,其中源代码在附件里, 只有spring3.0.5的官方标准包,需要大家自己下载了,然后添加到WEB-INF/lib下,因为附件大小限制在了10M,所以除spring3.0.5官方包外其他所有的包以及数据库的SQL语句,都在本例中,若有需要,可以留言.

二 实验环境及公共环境配置
1.准备工具
eclipse3.6.1_javaee
jdk1.6.0.23
tomcat6.0.30
mysql5.1.54


1)mysql
mysql-connector-java-5.1.14-bin.jar

2)log4j
log4j-1.2.16.jar

3)spring3.0.5
org.springframework.aop-3.0.5.RELEASE.jar
org.springframework.asm-3.0.5.RELEASE.jar
org.springframework.beans-3.0.5.RELEASE.jar
org.springframework.context-3.0.5.RELEASE.jar
org.springframework.core-3.0.5.RELEASE.jar
org.springframework.expression-3.0.5.RELEASE.jar
org.springframework.jdbc-3.0.5.RELEASE.jar
org.springframework.orm-3.0.5.RELEASE.jar
org.springframework.transaction-3.0.5.RELEASE.jar
org.springframework.web-3.0.5.RELEASE.jar
自己下载的spring相关包,AOP时候用的
aopalliance.jar
aspectjrt.jar
aspectjweaver.jar
cglib-nodep-2.2.jar
commons-logging-1.1.1.jar

4)hibernate3.6
antlr-2.7.6.jar
commons-collections-3.2.1.jar
dom4j-1.6.1.jar
hibernate-jpa-2.0-api-1.0.0.Final.jar
hibernate3.jar
javassist.jar
jta-1.1.jar
slf4j-api-1.6.1.jar
slf4j-log4j12-1.6.1.jar

2.tomcat数据源
文件位置:WebContent/META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource 
	name="jdbc/test" 
	type="javax.sql.DataSource" 
	username="root" 
	password="147258369" 
	driverClassName="com.mysql.jdbc.Driver" 
	url="jdbc:mysql://127.0.0.l:3306/test?autoReconnect=true" 
	initialSize="1" 
	maxActive="5" 
	minIdle="1" 
	maxIdle="5" 
	validationQuery="select count(*) from dual" 
	testOnBorrow="true" 
	testOnReturnw="true" 
	testWhileIdlew="true" 
	minEvictableIdleTimeMillis="1800000" 
	timeBetweenEvictionRunsMillis="300000" 
	maxWait="1000" 
	removeAbandoned="true"
	removeAbandonedTimeout="180"
/>
</Context>

3.log4j配置
文件位置:src/log4j.properties
log4j.rootLogger=DEBUG,appender1
# org.springframework包下面所有的日志输出的级别设为INFO
log4j.logger.org.springframework=INFO
# 控制台输出
log4j.appender.appender1=org.apache.log4j.ConsoleAppender
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout
log4j.appender.appender1.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss:SSS}[%p]: %m%n
# 立即输出
log4j.appender.appender1.immediateFlush=true

三 搭建hibernate3.6(JPA)环境
利用MySQL5.1.54的test库,前提是test库的编码要是UTF8
test有3个字段
id,name,age

src/META-INF/persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="sh" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<non-jta-data-source>java:comp/env/jdbc/test</non-jta-data-source>
		<class>com.phl.entity.User</class>
		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
			<property name="hibernate.connection.autocommit" value="true" />
		</properties>
	</persistence-unit>
</persistence>

四 搭建spring3.0.5环境
1.web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
	<display-name>sh</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
	<!-- log4j 必须要在最前面 -->
	<context-param>
		<param-name>log4jConfigLocation</param-name>
		<param-value>classpath:log4j.properties</param-value>
	</context-param>
	<context-param>
		<param-name>log4jRefreshInterval</param-name>
		<param-value>60000</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
	</listener>
	<context-param>
		<param-name>webAppRootKey</param-name>
		<param-value>webApp.root</param-value>
	</context-param>
	<!-- Spring初始化 -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/applicationContext.xml</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
</web-app>


2.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/aop  
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	<bean id="user" class="com.phl.entity.manager.UserImpl" />
</beans>

五 搭建hibernate3.6与spring3.0.5集成环境
1.applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-3.0.xsd 
http://www.springframework.org/schema/tx 
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
http://www.springframework.org/schema/aop  
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	<bean id="user" class="com.phl.entity.manager.UserImpl" />
	<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<!-- 此种方式不推荐,对jpa的侵入性太强,除非数据库连接池也在spring中配置 <property name="dataSource" ref="dataSource" /> -->
		<property name="persistenceUnitName" value="sh" />
	</bean>
	<!-- 自动装载EntityManager -->
	<context:annotation-config />
	<!-- 配置事务管理器 -->
	<bean id="myTxManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="myEmf" />
	</bean>
	<!-- 配置切面 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.phl.entity.manager.*.*(..))" id="myTx1"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="myTx1"/>
	</aop:config>
	<!-- 配制具体方法及事务参数 -->
	<tx:advice id="txAdvice" transaction-manager="myTxManager">
		<tx:attributes>
			<tx:method name="*" propagation="REQUIRED" />
		</tx:attributes>
	</tx:advice>
<!-- 
事务传播行为类型

REQUIRED
 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
 
SUPPORTS
 支持当前事务,如果当前没有事务,就以非事务方式执行。
 
MANDATORY
 使用当前的事务,如果当前没有事务,就抛出异常。
 
REQUIRES_NEW
 新建事务,如果当前存在事务,把当前事务挂起。
 
NOT_SUPPORTED
 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
 
NEVER
 以非事务方式执行,如果当前存在事务,则抛出异常。
 
NESTED
 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
-->
</beans>

六 总结
集成的过程看着很乱,其实很简单,初始化环境是首先要配置好log4j和tomcat数据源,如果没有特殊要求,我们一般配在工程下面context,而不是tomcat的全局数据源
1。首先可以独立使用hibernate3.6
2。可以独立使用spring3.0.5
3。可以由spring管理hibernate3.6的EntityManager:好处是不用关闭EntityManager,获得像在ejb3下面使用JPA一样的快感
4。可以由spring来管理事务:好处是不用每提提交事务,由spring帮助完成提交
    最后祝大家开发愉快,如果有任何问题,都可以留言,我会第一时间给大家解答.本文也并不是什么高端的文章,只是给自己当个笔记记录下来.如有不当之处,请各位同仁理解.


版权所有-转载请说明出处.


补充:
1.spring3.0.5的下载地址
http://s3.amazonaws.com/dist.springframework.org/release/SPR/spring-framework-3.0.5.RELEASE-with-docs.zip
2.若干别错字进行了修正
3.标题改了一下,因为只是与jpa2.0集成,没有用到hibernate的专用接口
4.精简spring3.0.5包,同时附件上传必须的spring3.0.5包

作者简介
昵称:澳洲鸟
姓名:朴海林
QQ:85977328
MSN:6301655@163.com
  • sh.zip (8.3 MB)
  • 下载次数: 1989
分享到:
评论
31 楼 85977328 2013-09-25  
huqinyu 写道
楼主 请问下 在你这个工程下,是不是可以把hibernate相关的jar包都去掉了,因为你说的是指集成了jpa,等你的回答啊 呵呵

不可以的,hibernate是jpa的一种实现
不好意思回复晚了
呵呵,好久没来了
30 楼 huqinyu 2013-05-24  
楼主 请问下 在你这个工程下,是不是可以把hibernate相关的jar包都去掉了,因为你说的是指集成了jpa,等你的回答啊 呵呵
29 楼 slendersEye 2012-02-25  
slendersEye 写道

applicationContext中如果给emf配dataSource的话,persistence.xml中应该就不用加
<no-jta-data-source>了吧。
这样配下来之后,启动报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:475)
	... 52 more
Caused by: java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:625)
	at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
	... 62 more


我的版本是spring3.0.0
hibernate3.5.6

换楼主提供的spring3.0.5,成功了!
28 楼 slendersEye 2012-02-25  

applicationContext中如果给emf配dataSource的话,persistence.xml中应该就不用加
<no-jta-data-source>了吧。
这样配下来之后,启动报错:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/classes/applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:820)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:762)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:680)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:475)
	... 52 more
Caused by: java.lang.AbstractMethodError: org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.getValidationMode()Ljavax/persistence/ValidationMode;
	at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:625)
	at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:73)
	at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:225)
	at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:288)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1460)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
	... 62 more


我的版本是spring3.0.0
hibernate3.5.6
27 楼 baitian 2011-06-01  
tomcat-6.0.32 下部署,抛异常:
java.lang.ClassNotFoundException: org.aspectj.weaver.reflect.ReflectionWorld$ReflectionWorldException
26 楼 herecomes 2011-02-20  
下载附件,细心学习了
25 楼 dir_murong 2011-02-18  
lz牛人 学习了  好贴不收藏 上班长痔疮
24 楼 85977328 2011-01-28  
Dony 写道
建议使用maven管理依赖,这样会省不少精力。

恩,感谢你的建议
目前工作中是使用maven了。不过用的不是很深入,所以没用那个写
23 楼 mib168 2011-01-28  
郁闷 竟然没用过spring配置log4j,看来这学的还不够深入,有收获了。
22 楼 Dony 2011-01-27  
建议使用maven管理依赖,这样会省不少精力。
21 楼 wwfengqi 2011-01-27  
你好 我用了你的代码进行了测试,但是报这个错误:
Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
修改的地方:(oracle数据库原因)
1,数据库配置修改了,
2, 主键生成策略改为:strategy=GenerationType.AUTO
3,index.jsp:添加了此行代码:u.setId("5");
20 楼 jajawu 2011-01-26  
EntityManager em = ... ; 
CriteriaBuilder queryBuilder = em.getCriteriaBuilder();

我项目中有导入javax.persistence_2.0.0.jar,hibernate-entitymanager.jar,但却找不到getCriteriaBuilder。
求大牛解答!!!谢谢
19 楼 85977328 2011-01-24  
装个插件就可以了。eclipse官方网站有的
或者是eclipse3.5以后,对应的是eclipse8.0之后的版本
18 楼 grandboy 2011-01-23  
谁知道MyEclipse对Spring 3.0.5及JPA2.0的支持如何? 我主要关心自动生成代码的部分。
17 楼 zhaojun1717 2011-01-21  
下载了 回头研究下 哥们就职百度 做什么职位啊?不错 很好 很理想啊
16 楼 85977328 2011-01-19  
char1st 写道
org.springframework.web.portlet-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
org.springframework.web.struts-3.0.5.RELEASE.jar 

有什么用?

没什么用,就aop,ioc有用,其他包其实可以省略的。
15 楼 char1st 2011-01-19  
org.springframework.web.portlet-3.0.5.RELEASE.jar
org.springframework.web.servlet-3.0.5.RELEASE.jar
org.springframework.web.struts-3.0.5.RELEASE.jar 

有什么用?
14 楼 85977328 2011-01-19  
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webApp.root</param-value>
</context-param>
xieyongwei 写道
引用
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>webApp.root</param-value>
</context-param>



这样写?

这个是位了载log4j种,引用${}地址用的
13 楼 85977328 2011-01-19  
好的,谢谢,,已经修改过来了。希望这个帖子能给大家带来帮助。
12 楼 mlw2000 2011-01-19  
标题有错别字

相关推荐

    CXF2.7+SPRING3.0.5+HIBERNATE3.6final+STRUTS2

    标题中的"CXF2.7+SPRING3.0.5+HIBERNATE3.6final+STRUTS2"代表了一个集成开发环境,其中包含了四个关键的技术框架:Apache CXF 2.7、Spring 3.0.5、Hibernate 3.6 Final以及Struts2。这些框架在Java Web开发中起着...

    ssh(struts2.2.1+_hibernate3.6+spring3.0.5)整合配置

    下面将详细介绍如何整合Struts2.2.1、Hibernate3.6和Spring3.0.5。 首先,确保准备好所有必要的库文件,包括: 1. Struts2的struts2-2.2.1-all.zip 2. Hibernate的hibernate-distribution-3.6.0.Final-dist.zip 3. ...

    WEB最新架构设计开发文档

    【WEB最新架构设计开发文档】主要探讨了在现代WEB开发中的架构设计,特别是Spring 3.0.5与JPA 2.0(基于Hibernate 3.6)的集成。以下将详细介绍相关知识点: 1. **Spring 3.0.5与JPA 2.0的集成** - Spring框架是一...

    struts2.2.3+ hibernate3.6+spring3.0.5

    在这个项目中,使用的是Struts2.2.3、Hibernate3.6和Spring3.0.5的版本,这是一套相对稳定的配置,已经在实际项目中得到了验证,不存在兼容性问题,对于初学者来说是学习和实践的良好平台。 **Struts2** 是一个基于...

    spring2.0升级到spring3.0.5的开发包

    5. **数据访问增强**:Spring 3.0对数据访问层进行了改进,增加了对JPA 2.0、Hibernate 3.6等ORM框架的支持,并且提供了统一的JDBC抽象层,简化了数据访问操作。 6. **Spring Expression Language (SpEL)**:Spring...

    ssh(struts2[1].2.1+_hibernate3.6+spring3.0.5)整合配置.doc

    在本文中,我们将详细介绍如何手动配置SSH(Struts2 2.2.1、Hibernate 3.6和Spring 3.0.5)的整合。 首先,你需要准备好以下软件和库: 1. Struts2的最新版本,这里是Struts2 2.2.1,对应的压缩包为`struts2-2.2.1...

    SSH2_Ajax 的可发布war包和eclipse工程

    SSH2_Ajax是一个基于最新版本的Struts2.2.1.1、Spring3.0.5和Hibernate3.6的整合项目,旨在提供一个可发布的WAR包和Eclipse工程模板,便于开发者快速构建Web应用。这个项目的核心是将这三大流行框架(Struts2、...

    ssh+frameset 简单实例

    这个版本的Hibernate支持JPA 2.0规范,提供了更丰富的查询语言HQL以及更高效的缓存策略。 Struts2作为表现层框架,负责处理HTTP请求并展示视图。Struts2.2.3版本引入了更多的拦截器、插件和模板技术,使开发者能够...

Global site tag (gtag.js) - Google Analytics