`

Spring 2.5 和 Hibernate 3 基于Annotation的集成

    博客分类:
  • SSH
阅读更多

网上的例子不少,但没有一个是说的很清楚的,而且有的例子和我的目标不同,于是自己尝试着配了一下~

目标:尽量多的使用Annotation,完成事务自动管理
版本:Spring-2.5.6 Hibernate-3.3.1及相关的包

首先定义Spring配置文件(也是最主要的一块),内容如下:
//spring.xml

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans  
  3.     xmlns="http://www.springframework.org/schema/beans"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xmlns:context="http://www.springframework.org/schema/context"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="   
  8.         http://www.springframework.org/schema/beans   
  9.         http://www.springframework.org/schema/beans/spring-beans-2.5.xsd   
  10.         http://www.springframework.org/schema/context   
  11.         http://www.springframework.org/schema/context/spring-context-2.5.xsd   
  12.         http://www.springframework.org/schema/tx   
  13.         http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"   
  14.     default-autowire="autodetect"  
  15. >  
  16.   
  17.     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">  
  18.         <property name="driverClassName" value="org.postgresql.Driver"/>  
  19.         <property name="url" value="jdbc:postgresql://localhost/demo"/>  
  20.         <property name="username" value="demo"/>  
  21.         <property name="password" value="demo"/>  
  22.     </bean>  
  23.        
  24.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  25.         <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />  
  26.         <property name="configLocations" value="hibernate.model.xml" />  
  27.         <property name="hibernateProperties">  
  28.             <props>  
  29.                 <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>  
  30.                 <prop key="hibernate.show_sql">true</prop>  
  31.                 <prop key="hibernate.hbm2ddl.auto">update</prop>  
  32.             </props>  
  33.         </property>  
  34.     </bean>  
  35.        
  36.     <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />  
  37.        
  38.     <context:component-scan base-package="com.itone.spring.demo.service">  
  39.         <context:include-filter type="regex" expression=".*ServiceImpl" />    
  40.     </context:component-scan>  
  41.        
  42.     <tx:annotation-driven transaction-manager="txManager"/>  
  43.        
  44. </beans>  
<?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:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-2.5.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
	default-autowire="autodetect"
>

	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="org.postgresql.Driver"/>
		<property name="url" value="jdbc:postgresql://localhost/demo"/>
		<property name="username" value="demo"/>
		<property name="password" value="demo"/>
	</bean>
	
	<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration" />
		<property name="configLocations" value="hibernate.model.xml" />
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>
	</bean>
	
	<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" />
	
	<context:component-scan base-package="com.itone.spring.demo.service">
		<context:include-filter type="regex" expression=".*ServiceImpl" /> 
	</context:component-scan>
	
	<tx:annotation-driven transaction-manager="txManager"/>
	
</beans>



由于Hibernate model的定义一般会很多(本例不多,呵呵),所以我把它放到另一个文件中,代码如下:
//hibernate.model.xml

Xml代码 复制代码
  1. <?xml version="1.0"?>  
  2. <!DOCTYPE hibernate-configuration PUBLIC   
  3.     "-//Hibernate/Hibernate Configuration DTD 3.0//EN"   
  4.     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">  
  5.   
  6. <hibernate-configuration>  
  7.     <session-factory>  
  8.         <mapping class="com.itone.spring.demo.model.Book"/>  
  9.     </session-factory>  
  10. </hibernate-configuration>  
<?xml version="1.0"?>
<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<mapping class="com.itone.spring.demo.model.Book"/>
	</session-factory>
</hibernate-configuration>



这里需要注意的几点:
1、是要加上命名空间tx,因为我们用到了tx:annotation-driven;
2、default-autowire="autodetect"或default-autowire="byName",因为我不知道怎么将sessionFactory或hibernateTemplate annotate到我的ServiceImpl中;
3、要用接口/实现的方式来做Service。

看一下我们的Hibernate model代码吧,很简单,代码如下:
//Book.java

Java代码 复制代码
  1. package com.itone.spring.demo.model;   
  2.   
  3. import java.io.Serializable;   
  4.   
  5. import javax.persistence.Entity;   
  6. import javax.persistence.GeneratedValue;   
  7. import javax.persistence.GenerationType;   
  8. import javax.persistence.Id;   
  9.   
  10. import org.hibernate.annotations.Proxy;   
  11.   
  12. @Entity  
  13. @Proxy(lazy = false)   
  14. public class Book implements Serializable {   
  15.   
  16.     private static final long serialVersionUID = 1L;   
  17.   
  18.     @Id  
  19.     @GeneratedValue(strategy = GenerationType.IDENTITY)   
  20.     public int id;   
  21.   
  22.     public String name;   
  23. }  
package com.itone.spring.demo.model;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.hibernate.annotations.Proxy;

@Entity
@Proxy(lazy = false)
public class Book implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public int id;

	public String name;
}



接下来就是服务接口及实现了,只做读和写操作,以验证@Transactional是否起作用。
//BookService.java

Java代码 复制代码
  1. package com.itone.spring.demo.service;   
  2.   
  3. import java.util.List;   
  4.   
  5. import com.itone.spring.demo.model.Book;   
  6.   
  7. public interface BookService {   
  8.   
  9.     public void save(Book book) throws Exception;   
  10.   
  11.     public List<Book> list() throws Exception;   
  12. }  
package com.itone.spring.demo.service;

import java.util.List;

import com.itone.spring.demo.model.Book;

public interface BookService {

	public void save(Book book) throws Exception;

	public List<Book> list() throws Exception;
}



//BookServiceImpl.java

Java代码 复制代码
  1. package com.itone.spring.demo.service;   
  2.   
  3. import java.util.List;   
  4.   
  5. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;   
  6. import org.springframework.stereotype.Service;   
  7. import org.springframework.transaction.annotation.Transactional;   
  8.   
  9. import com.itone.spring.demo.model.Book;   
  10.   
  11. @Service("bookService")   
  12. public class BookServiceImpl extends HibernateDaoSupport implements BookService {   
  13.   
  14.     @Transactional(readOnly = false, rollbackFor = Throwable.class)   
  15.     public void save(Book book) throws Exception {   
  16.         getHibernateTemplate().save(book);   
  17.         //throw new Exception("test exception");这样会回滚   
  18.     }   
  19.   
  20.     @SuppressWarnings("unchecked")   
  21.     @Transactional(readOnly = true, rollbackFor = Throwable.class)   
  22.     public List<Book> list() throws Exception {   
  23.                 //这里如果有写操作也会出异常   
  24.         return getSession().createCriteria(Book.class).list();   
  25.     }   
  26. }  
package com.itone.spring.demo.service;

import java.util.List;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.itone.spring.demo.model.Book;

@Service("bookService")
public class BookServiceImpl extends HibernateDaoSupport implements BookService {

	@Transactional(readOnly = false, rollbackFor = Throwable.class)
	public void save(Book book) throws Exception {
		getHibernateTemplate().save(book);
		//throw new Exception("test exception");这样会回滚
	}

	@SuppressWarnings("unchecked")
	@Transactional(readOnly = true, rollbackFor = Throwable.class)
	public List<Book> list() throws Exception {
                //这里如果有写操作也会出异常
		return getSession().createCriteria(Book.class).list();
	}
}



然后来做个测试吧
//Test.java

Java代码 复制代码
  1. package com.itone.spring.demo;   
  2.   
  3. import java.util.List;   
  4.   
  5. import org.springframework.context.ApplicationContext;   
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;   
  7.   
  8. import com.itone.spring.demo.model.Book;   
  9. import com.itone.spring.demo.service.BookService;   
  10.   
  11. public class Test {   
  12.     public static void main(String[] args) throws Exception {   
  13.         ApplicationContext ctx = new ClassPathXmlApplicationContext(   
  14.                 new String[] { "spring.xml" });   
  15.   
  16.         BookService bookService = (BookService) ctx.getBean("bookService");   
  17.   
  18.         Book book = new Book();   
  19.         book.name = "血色浪漫";   
  20.         bookService.save(book);   
  21.   
  22.         List<Book> books = bookService.list();   
  23.         for (Book b : books) {   
  24.             System.out.println(b.id + ":" + b.name);   
  25.         }   
  26.     }   
  27. }  
package com.itone.spring.demo;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.itone.spring.demo.model.Book;
import com.itone.spring.demo.service.BookService;

public class Test {
	public static void main(String[] args) throws Exception {
		ApplicationContext ctx = new ClassPathXmlApplicationContext(
				new String[] { "spring.xml" });

		BookService bookService = (BookService) ctx.getBean("bookService");

		Book book = new Book();
		book.name = "血色浪漫";
		bookService.save(book);

		List<Book> books = bookService.list();
		for (Book b : books) {
			System.out.println(b.id + ":" + b.name);
		}
	}
}



然后的任务就是来改动BookServiceImpl的Annotation设置及代码,来检验一下是否起作用了,我发现是起作用的。

这里只写了一个简单的模型,对于Spring的Annotation还需要更进一步的学习~~

分享到:
评论

相关推荐

    鸡国大冒险运行程序,点开即用

    基于Python+Flask的安全多方计算的隐私保护系统设计与实现+全部资料齐全+部署文档.zip

    【资源说明】 基于Python+Flask的安全多方计算的隐私保护系统设计与实现+全部资料齐全+部署文档.zip基于Python+Flask的安全多方计算的隐私保护系统设计与实现+全部资料齐全+部署文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    聊天系统(java+applet).zip

    聊天系统(java+applet)

    setuptools-11.0-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip

    基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip基于UCI Heart Disease数据集的心脏病分析python源码+数据集+演示ppt+详细资料.zip

    setuptools-1.3.1-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    setuptools-40.3.0-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    公开整理-各省碳排放数据集(1990-2022年).xlsx

    详细介绍及样例数据:https://blog.csdn.net/li514006030/article/details/138872006

    基于Java的两个通用安全模块的设计与实现.zip

    基于Java的两个通用安全模块的设计与实现

    setuptools-14.1.1-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    华为-智慧园区数字平台技术qytp.pptx

    华为-智慧园区数字平台技术qytp.pptx

    30个Python游戏源码

    30个Python游戏源码

    基于python深度度量学习准确预测蛋白质二级结构源码.zip

    基于python深度度量学习准确预测蛋白质二级结构源码.zip基于python深度度量学习准确预测蛋白质二级结构源码.zip基于python深度度量学习准确预测蛋白质二级结构源码.zip基于python深度度量学习准确预测蛋白质二级结构源码.zip基于python深度度量学习准确预测蛋白质二级结构源码.zip基于python深度度量学习准确预测蛋白质二级结构源码.zip基于python深度度量学习准确预测蛋白质二级结构源码.zip基于python深度度量学习准确预测蛋白质二级结构源码.zip

    基于单片机的语音存储与重放系统.zip

    基于单片机的系统

    Java项目之jspm房屋租赁系统(源码 + 说明文档)

    Java项目之jspm房屋租赁系统(源码 + 说明文档) 2开发技术介绍 6 2.1B/S架构 6 2.2Java技术 6 2.3MySQL介绍 6 2.4MySQL环境配置 7 2.5JSP技术介绍 7 3系统分析 8 3.1可行性分析 8 3.1.1技术可行性 8 3.1.2经济可行性 8 3.1.3操作可行性 8 3.1.4运行可行性 9 3.2系统性能需求分析 9 3.3系统功能分析 9 3.4系统流程的分析 10 3.4.1用户管理的流程 11 3.4.2个人中心管理流程 12 3.4.3登录流程 12 4系统设计 13 4.1软件功能模块设计 13 4.2数据库设计与实现 13 4.2.1概念模型设计 13 4.2.2物理模型设计 15 5系统详细设计 22 5.1系统功能模块 22 5.2管理员功能模块 23 5.3租客功能模块 27 6系统测试 28 7总结与心得体会 29 7.1总结 29 7.2心得体会 29

    小红书-课程网盘链接提取码下载 (2).txt

    小红书-课程网盘链接提取码下载 (2).txt

    setuptools-24.1.1.tar.gz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    c-master (2).zip

    c语言

    setuptools-19.4.1-py2.py3-none-any.whl

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    python企业编码管理的程序(可执行程序+源码).zip

    具体的操作步骤如下: (1)生成6位数字防伪编码。当用户在主程序界面中输入数字“1”菜单项时,将进入“生成6位数字防伪编码 (213563型)”的功能执行任务。此时要求输入生成防伪码的数量,可以根据需要输入生成防伪码的数量,如图2所示。按下<Enter>键,开始批量生成防伪码,生成后系统将提示用户生成了多少个注册码和生成文件的位置信息等,如图3所示。单击“确定”按钮,关闭提示信息。在屏幕上可以看到生成的防伪码信息,如图4所示。生成的文件在程序所在目录下的“codepath”文件夹下,名称为“scode1.txt”,如图5所示。

Global site tag (gtag.js) - Google Analytics