基于Spring的事务单元测试方法_第1页
基于Spring的事务单元测试方法_第2页
基于Spring的事务单元测试方法_第3页
基于Spring的事务单元测试方法_第4页
基于Spring的事务单元测试方法_第5页
已阅读5页,还剩21页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1/1基于Spring的事务单元测试方法第一部分事务注解在单元测试中的应用 2第二部分Spring事务管理器的类型 5第三部分测试方法中事务的回滚机制 8第四部分使用@Rollback注解实现事务回滚 11第五部分事务传播行为对单元测试的影响 14第六部分嵌套事务的处理方式 16第七部分事务隔离级别的选择 19第八部分mockito框架在事务测试中的使用 22

第一部分事务注解在单元测试中的应用事务注解在单元测试中的应用

在Spring测试框架中,使用事务注解可以轻松地管理测试方法中的事务行为。这对于确保测试的隔离性至关重要,防止数据污染和干扰其他测试。

1.`@Transactional`注解

`@Transactional`注解用于在测试方法上声明事务行为。它具有以下功能:

*开启一个新事务:在方法开始时开启一个新的数据库事务。

*在方法结束时回滚事务:默认情况下,事务在方法结束时回滚。

*配置事务属性:可以通过`@Transactional`注解的属性来配置事务的属性,例如传播行为和隔离级别。

2.事务传播行为

`@Transactional`注解的`propagation`属性指定事务传播行为,它定义了测试方法如何处理当前事务。支持的传播行为包括:

*REQUIRED:如果存在当前事务,则加入该事务;否则,创建一个新事务。

*REQUIRES_NEW:无论是否存在当前事务,都创建一个新事务。

*SUPPORTS:如果存在当前事务,则加入该事务;否则,在非事务性环境中运行。

*NOT_SUPPORTED:在非事务性环境中运行,即使存在当前事务。

*NEVER:不允许在事务性环境中运行,如果存在当前事务则抛出异常。

*MANDATORY:如果不存在当前事务,则抛出异常。

3.事务隔离级别

`@Transactional`注解的`isolation`属性指定事务隔离级别,它定义了事务在并发环境中的行为。支持的隔离级别包括:

*DEFAULT:使用数据库的默认隔离级别。

*READ_COMMITTED:确保一个事务提交后才能被其他事务读取。

*READ_UNCOMMITTED:允许一个事务读取其他事务未提交的数据。

*REPEATABLE_READ:确保一个事务在执行期间不会出现幻读(即其他事务插入或删除的数据)。

*SERIALIZABLE:提供最高级别的隔离,确保事务顺序执行,不会出现任何并发性问题。

4.使用示例

下面是一个简单的示例,展示了如何使用`@Transactional`注解在单元测试中管理事务:

```java

@ExtendWith(SpringExtension.class)

@DataJpaTest

@Autowired

privateUserRepositoryuserRepository;

@Test

@Transactional

Useruser=newUser();

user.setName("JohnDoe");

userRepository.save(user);

//断言数据库中存在已保存的用户

assertThat(userRepository.findById(user.getId()).isPresent()).isTrue();

}

}

```

在这个示例中,`@Transactional`注解用于在`testSaveUser`测试方法上开启一个新事务。测试方法保存一个新的用户实体,并断言它已成功保存到数据库中。由于事务在方法结束时回滚,因此用户在其他测试中不会可见。

5.注意提示

使用事务注解时,需要注意以下几点:

*确保在测试方法中正确使用`@Transactional`注解,以实现所需的隔离和传播行为。

*避免在测试方法中混合使用事务和非事务操作,因为这可能导致不可预知的行为。

*考虑使用Spring的`@DirtiesContext`注解来显式地将数据库状态恢复到测试前的干净状态,确保测试之间的隔离。第二部分Spring事务管理器的类型关键词关键要点声明式事务管理

1.通过在方法或类上添加注解(如`@Transactional`)来声明事务行为。

2.注解可以配置事务属性,如传播行为、隔离级别、超时和回滚规则。

3.优点:简洁、易用,无需手动管理事务。

编程式事务管理

1.使用`TransactionTemplate`或`PlatformTransactionManager`手动管理事务。

2.提供了对事务生命周期的更精细控制。

3.缺点:代码更复杂,需要手动处理异常情况。

声明式事务管理与编程式事务管理比较

1.声明式事务管理更简单、更方便,适用于大多数情况。

2.编程式事务管理提供更精细的控制,适用于需要自定义事务行为的场景。

3.两种方法可以结合使用,发挥各自的优势。

Spring事务传播行为

1.传播行为决定了事务如何在嵌套方法调用中传播。

2.主要传播行为包括:REQUIRED、REQUIRES_NEW、NESTED、SUPPORTS和NEVER。

3.了解不同的传播行为对于确保事务的一致性至关重要。

Spring事务隔离级别

1.隔离级别定义了并发事务之间的隔离程度。

2.主要隔离级别包括:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。

3.选择合适的隔离级别有助于防止脏读、不可重复读和幻读等并发问题。

Spring事务超时和回滚规则

1.超时设置了事务可以执行的最大时间,超过时间后事务会被回滚。

2.回滚规则定义了事务在遇到异常时回滚的条件。

3.正确配置超时和回滚规则有助于防止死锁和保持数据一致性。Spring事务管理器类型

Spring提供了多种事务管理器类型,以满足不同应用程序场景的需求。每种类型的管理器都提供不同的特性和功能。

平台事务管理器

*DataSourceTransactionManager:用于使用JDBC的应用程序。它使用底层数据库提供的原生事务支持。

*JpaTransactionManager:用于使用JavaPersistenceAPI(JPA)的应用程序。它封装了持久性提供程序的事务管理功能。

*HibernateTransactionManager:用于使用Hibernate的应用程序。它提供了Hibernate特定的事务管理功能。

容器事务管理器

*JtaTransactionManager:在使用Java事务API(JTA)的分布式环境中使用。它允许应用程序与其他资源管理器(如消息队列)进行事务协调。

*BitronixTransactionManager:基于开源Bitronix框架的JTA事务管理器。它提供高性能和可靠的事务管理。

基于代理的事务管理器

*ProxyTransactionManager:使用JDK动态代理机制实现事务管理。它使用通知来拦截和管理事务。

模板事务管理器

*TransactionTemplate:在开发事务块时提供便捷的方法。它简化了事务管理,允许开发人员专注于业务逻辑。

选择合适的事务管理器

选择合适的Spring事务管理器取决于应用程序的具体要求。以下是一些指导方针:

*如果应用程序使用JDBC,则使用DataSourceTransactionManager。

*如果应用程序使用JPA,则使用JpaTransactionManager。

*如果应用程序使用Hibernate,则使用HibernateTransactionManager。

*如果应用程序需要分布式事务支持,则使用JtaTransactionManager。

*如果应用程序需要高性能事务管理,则使用BitronixTransactionManager。

*如果应用程序希望使用代理机制进行事务管理,则使用ProxyTransactionManager。

*如果应用程序需要简化的事务管理,则使用TransactionTemplate。

配置Spring事务管理器

Spring事务管理器可以通过以下方式进行配置:

*XML配置:在Spring配置文件中声明bean元素并设置所需的属性。

*Java配置:使用`@Configuration`注释和`@Bean`方法在Java中创建和配置事务管理器。

示例配置

以下是使用DataSourceTransactionManager的XML配置示例:

```xml

<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<propertyname="dataSource"ref="dataSource"/>

</bean>

```

以下是使用ProxyTransactionManager的Java配置示例:

```java

@Configuration

@Bean

returnnewProxyTransactionManager();

}

}

```

通过选择和配置合适的Spring事务管理器,开发人员可以确保应用程序中的事务管理得到有效且可靠地处理。第三部分测试方法中事务的回滚机制关键词关键要点【测试方法中事务的回滚机制】:

1.测试方法中的事务默认会自动回滚,从而保证测试代码不会对数据库造成永久性修改。

2.通过使用`@Transactional`注解并指定`rollbackFor`属性,可以指定在发生特定异常时回滚事务。

3.回滚机制对于确保测试代码的隔离性和可重复性至关重要,防止在运行其他测试时出现意外数据修改。

【测试方法中手动回滚事务】:

测试方法中事务的回滚机制

在基于Spring的单元测试中,事务的回滚机制至关重要,它确保在测试期间对数据库所做的任何更改在测试完成后都将撤消。这对于确保测试的隔离性并防止数据污染非常重要。

Spring提供了两种主要机制来实现事务的回滚:

1.@Transactional注解

@Transactional注解用于声明测试方法应在事务上下文中执行。它有几个关键属性,包括:

*propagation:指定事务的传播行为,决定事务是否创建新的事务或加入现有事务。

*isolation:指定事务的隔离级别,决定事务提交之前对其他并发事务的影响程度。

*rollbackFor:指定哪些异常应该触发事务回滚。

2.TransactionalTestExecutionListener

TransactionalTestExecutionListener是一个Spring测试监听器,它在每个测试方法的执行前后管理事务。它使用@Transactional注解的属性配置事务上下文。

回滚的实现

当测试方法抛出由@Transactional注解中指定的rollbackFor特性定义的异常时,Spring会自动回滚事务。此外,当@Transactional注解的propagation属性设置为PROPAGATION_REQUIRED或PROPAGATION_REQUIRES_NEW时,Spring也会在测试方法正常返回后回滚事务。

回滚的好处

事务回滚有几个主要好处:

*隔离性:它确保每个测试都在一个隔离的环境中执行,不会受到其他测试或外部因素的影响。

*数据完整性:它防止在测试期间对数据库进行意外或不需要的更改,从而确保数据完整性。

*可重复性:它确保在相同条件下重复运行测试时,结果是一致的。

注意事项

在使用事务回滚机制时,需要考虑以下注意事项:

*性能开销:事务回滚需要额外的处理和资源开销,因此在测试大量数据时可能会影响性能。

*方法级事务:@Transactional注解仅适用于测试方法,因此在测试方法内部调用其他方法时,事务回滚机制可能不会生效。

*嵌套事务:在测试方法中嵌套其他事务时,需要仔细处理事务的传播和回滚设置,以确保预期的事务行为。

最佳实践

为了确保事务回滚机制在单元测试中有效,建议遵循以下最佳实践:

*在所有测试方法上使用@Transactional注解,并正确配置rollbackFor属性。

*在测试方法内部避免直接访问数据库连接或会话。

*在测试方法中使用Spring测试框架提供的Repository和Service层,以充分利用事务管理功能。

*使用assertThat()或其他断言方法来验证测试方法的结果,而不要直接查询数据库。

*根据需要使用@Rollback(false)注解来禁用特定方法或类的回滚。第四部分使用@Rollback注解实现事务回滚关键词关键要点【使用@Rollback注解实现事务回滚】:

1.@Rollback注解用于显式指定测试方法执行后应回滚事务。

2.在JUnit测试类中使用@Rollback注解,可以确保测试方法执行期间对数据库所做的任何更改在方法执行后被回滚。

3.使用@Rollback注解可以简化事务单元测试,因为它避免了手动回滚事务的需要。

【事务回滚和数据一致性】:

使用`@Rollback`注解实现事务回滚

简介

`@Rollback`注解是一种Spring测试框架提供的注解,用于在单元测试方法执行后自动回滚未提交的事务。它通过覆盖Spring测试上下文中的默认行为来实现,默认情况下,未提交的事务会在测试方法执行后自动提交。

使用方式

使用`@Rollback`注解非常简单,只需在测试方法上添加该注解即可:

```java

@Rollback

@Test

//测试代码

}

```

原理

`@Rollback`注解的工作原理是通过修改Spring测试上下文的默认事务管理机制。Spring测试框架使用`TransactionManager`类来管理事务。当应用`@Rollback`注解时,Spring将使用一个特殊的`TransactionManager`实现,该实现会在测试方法执行后自动回滚事务。

好处

使用`@Rollback`注解具有以下好处:

*确保事务完整性:通过在测试方法后回滚事务,可以确保对数据库所做的任何更改不会持久化,从而确保事务的完整性。

*简化测试:通过自动回滚事务,可以简化单元测试的编写,无需显式回滚事务或使用断言来验证事务回滚。

*提高测试效率:自动回滚事务可以提高测试效率,因为它消除了在每个测试方法后显式提交或回滚事务的开销。

注意事项

使用`@Rollback`注解需要注意以下几点:

*仅适用于未提交的事务:`@Rollback`注解仅适用于未提交的事务。如果在测试方法执行期间显式提交事务,则该注解将不起作用。

*不适用于测试类:`@Rollback`注解不能应用于测试类本身。它只能应用于测试方法。

*与`@Transactional`注解一起使用:要使用`@Rollback`注解,测试方法还必须使用`@Transactional`注解,以指示Spring管理事务。

*使用嵌套事务:如果测试方法使用嵌套事务,`@Rollback`注解仅适用于最外层的父事务。内部嵌套事务将按照其自己的规则提交或回滚。

*使用基于XML的事务:如果使用基于XML的事务配置,则可能需要在`applicationContext.xml`文件中显式配置`@Rollback`注解的支持。

结论

`@Rollback`注解是一种方便且有效的方法,用于在Spring单元测试中实现事务回滚。它确保事务完整性,简化测试编写,并提高测试效率。通过理解和正确使用`@Rollback`注解,开发人员可以创建更可靠和维护良好的单元测试。第五部分事务传播行为对单元测试的影响关键词关键要点【事务隔离级别对单元测试的影响】:

1.事务隔离级别会影响单元测试结果的可靠性。在隔离级别较低的情况下,可能发生脏读、幻读和不可重复读等问题,导致单元测试失败。因此,在单元测试时,需要设置适当的事务隔离级别,以保证测试结果的准确性。

2.不同的事务隔离级别会对性能产生不同的影响。在隔离级别较高的情况下,并发性会降低,性能也会下降。因此,在选择事务隔离级别时,需要考虑性能和可靠性的权衡。

3.Spring框架提供了灵活的事务隔离级别配置。可以通过注解或XML配置的方式,为每个事务方法设置特定的隔离级别。这提供了对事务行为的细粒度控制,可以根据单元测试的具体需求进行调整。

【事务传播行为对单元测试的影响】:

事务传播行为对单元测试的影响

在Spring单元测试中,事务传播行为决定了测试方法中执行的代码是否在一个事务中运行,以及该事务的特性。

REQUIRES_NEW

*新事务:在方法执行前创建新事务,无论父级事务是否正在运行。

*单元测试影响:这是单元测试的首选传播行为,因为它确保测试方法内的代码在一个干净的事务中运行,不受父级事务的影响。此行为允许对数据库进行更改而不会影响其他测试或应用程序中的代码。

REQUIRED

*现有事务:如果父级事务正在运行,则加入该事务。如果没有父级事务,则创建新事务。

*单元测试影响:通常不建议在单元测试中使用REQUIRED。如果父级事务正在运行,则测试方法内的代码将受父级事务的影响。这可能导致不确定的测试结果,因为父级事务可能已对数据库进行了更改。

SUPPORTS

*支持事务:如果父级事务正在运行,则加入该事务。如果没有父级事务,则不创建事务。

*单元测试影响:不建议在单元测试中使用SUPPORTS。此行为可能会导致测试方法中的代码在没有事务的情况下执行,从而导致不确定的结果。

NOT_SUPPORTED

*不支持事务:无论父级事务是否正在运行,都禁用事务。

*单元测试影响:使用NOT_SUPPORTED对于不需要事务的测试方法很有用。它确保测试方法中的代码在没有事务的情况下执行,从而避免了不必要的开销。

NEVER

*从不:如果父级事务正在运行,则抛出异常。如果没有父级事务,则不创建事务。

*单元测试影响:NEVER通常不建议在单元测试中使用。如果父级事务正在运行,则它将导致测试失败。此行为仅适用于不需要事务并且可能会因事务存在而失败的测试方法。

MANDATORY

*必须事务:如果父级事务正在运行,则加入该事务。如果没有父级事务,则抛出异常。

*单元测试影响:MANDATORY在单元测试中很少使用。它类似于REQUIRED,但在没有父级事务的情况下抛出异常。此行为适用于要求事务才能执行的测试方法。

选择适当的事务传播行为

在单元测试中选择适当的事务传播行为非常重要,以确保测试结果的可靠性和一致性。

*对于需要干净事务的测试方法,REQUIRES_NEW是首选行为。

*对于需要加入父级事务的方法,REQUIRED可以接受,但应谨慎使用。

*对于不需要事务或可能因事务存在而失败的方法,NOT_SUPPORTED是一个不错的选择。

通过仔细考虑事务传播行为,可以编写出稳健、可重复的Spring单元测试,有助于提高应用程序的整体质量和可靠性。第六部分嵌套事务的处理方式关键词关键要点【嵌套事务的处理】

1.父事务提交成功后,子事务自动提交;父事务回滚后,子事务会被强制回滚。

2.子事务回滚后,父事务可以继续执行;子事务过程中若出现异常,不会影响父事务的执行。

3.嵌套事务的处理,保证了数据一致性的同时,提高了事务处理的灵活性。

【嵌套事务的隔离级别】

嵌套事务的处理方式

在Spring事务管理中,嵌套事务是指在一个事务范围内开启另一个事务的情况。嵌套事务的处理方式受以下因素影响:

传播行为

Spring提供了多种传播行为来控制嵌套事务的行为:

*PROPAGATION_REQUIRED:如果存在外部事务,则加入该事务;否则,创建一个新事务。

*PROPAGATION_REQUIRES_NEW:总是创建一个新事务,即使存在外部事务。

*PROPAGATION_NESTED:创建一个嵌套事务,共享外部事务的连接和事务状态。

*PROPAGATION_MANDATORY:必须存在外部事务,否则抛出异常。

*PROPAGATION_NEVER:不能存在外部事务,否则抛出异常。

*PROPAGATION_NOT_SUPPORTED:禁用事务支持,无论外部事务是否存在。

回滚规则

除了传播行为之外,回滚规则也影响嵌套事务的处理方式:

*ISOLATION_DEFAULT:嵌套事务中的异常不会导致外部事务回滚。

*ISOLATION_READ_COMMITTED:如果嵌套事务中发生可序列化异常,则外部事务将回滚。

处理嵌套事务

Spring通过`@Transactional`注解和`PlatformTransactionManager`类提供对嵌套事务的支持。

*`@Transactional`注解的`propagation`属性用于指定传播行为。

*`PlatformTransactionManager`类负责创建和管理事务,包括嵌套事务。

示例

以下示例演示了嵌套事务的处理方式:

```java

@Transactional(propagation=Propagation.REQUIRED)

//执行外部事务

innerTransaction();

//处理嵌套事务异常

}

}

@Transactional(propagation=Propagation.NESTED)

//执行嵌套事务

}

```

在该示例中,`outerTransaction`方法开启了一个`REQUIRED`传播行为的事务,而`innerTransaction`方法开启了一个`NESTED`传播行为的嵌套事务。如果`innerTransaction`方法抛出异常,则嵌套事务将回滚,但外部事务将继续执行。

优点

嵌套事务为事务处理提供了以下优点:

*隔离性:嵌套事务可以保证操作的隔离性,即使外部事务正在执行。

*细粒度控制:它允许对事务进行更细粒度的控制,使开发人员可以为不同的操作设置不同的传播行为和回滚规则。

*避免死锁:通过使用`NESTED`传播行为,可以避免由多个线程争夺同一连接而导致的死锁。

缺点

嵌套事务也有一些缺点:

*复杂性:嵌套事务的管理比非嵌套事务更复杂,需要对Spring事务模型有深入的理解。

*性能开销:创建和管理嵌套事务会带来额外的性能开销。

*回滚问题:外部事务和嵌套事务之间的回滚规则可能会导致意外的行为。

最佳实践

为了有效地使用嵌套事务,建议遵循以下最佳实践:

*使用`NESTED`传播行为以避免死锁。

*仔细考虑回滚规则,以确保回滚的行为符合预期。

*避免过度嵌套事务,因为它会增加复杂性和降低性能。

*使用`@Transactional`注解来明确事务边界。第七部分事务隔离级别的选择关键词关键要点【事务隔离级别选择】:

1.串行化(SERIALIZABLE):最高隔离级别,严格保证同一事务内所有操作的顺序,避免脏读、幻读、不可重复读等问题,但并发性能较低。

2.可重复读(REPEATABLEREAD):保证同一事务内多次读取同一数据时,结果保持一致,避免幻读,但可能出现不可重复读。

3.读已提交(READCOMMITTED):保证同一事务内读取到的数据是已经提交的数据,避免脏读,但可能出现幻读和不可重复读。

4.读未提交(READUNCOMMITTED):最低隔离级别,同一事务内可以读取未提交的数据,存在脏读、幻读、不可重复读等问题,并发性能最高。

【事务传播机制选择】:

事务隔离级别的选择

事务隔离级别决定了在并发环境中,不同事务之间如何隔离和保护数据完整性。在Spring事务单元测试中,选择适当的隔离级别对于确保测试的准确性和可靠性至关重要。

隔离级别

Spring支持以下隔离级别:

*SERIALIZABLE:最高级别,确保事务之间的串行化执行,没有并发访问。

*REPEATABLEREAD:保护当前事务免受其他事务对已读数据的修改。

*READCOMMITTED:保护当前事务免受其他事务已提交数据的修改。

*READUNCOMMITTED:最低级别,允许当前事务读取其他事务未提交的数据,可能导致脏读。

选择标准

选择隔离级别的标准包括:

*并发级别:预期的并发访问水平。

*数据完整性:要求的事务隔离程度。

*性能:不同隔离级别的性能影响。

隔离级别与性能

隔离级别越高,事务执行越慢:

*SERIALIZABLE:最慢,因为所有事务都串行执行。

*REPEATABLEREAD:比SERIALIZABLE快,但仍需要使用锁。

*READCOMMITTED:比REPEATABLEREAD快,但可能导致不可重复读。

*READUNCOMMITTED:最快,但可能导致脏读。

使用指南

一般情况下,推荐使用以下隔离级别:

*并发性低:使用READCOMMITTED或REPEATABLEREAD,平衡性能和数据完整性。

*并发性高:使用SERIALIZABLE,确保最高程度的隔离。

*需要避免脏读:使用REPEATABLEREAD或SERIALIZABLE。

Spring框架集成

在Spring事务单元测试中,可以通过设置`@Transactional`注释的`isolation`属性来指定隔离级别:

```java

@Transactional(isolation=Isolation.READ_COMMITTED)

//...

}

```

总结

选择适当的事务隔离级别对于Spring事务单元测试至关重要。隔离级别越高,数据完整性越强,但性能越差。通过考虑并发级别、数据完整性要求和性能影响,可以为特定测试用例选择最佳隔离级别。第八部分mockito框架在事务测试中的使用关键词关键要点Mockito框架在事务测试中的使用

【Mockito的Spring集成】

-使用SpringBoot的@MockTransaction注解集成Mockito

-将@MockBeans注解与@SpringBootTest结合使用创建Mockito模拟对象

-利用嵌套@Transactional注解执行事务测试

【模拟数据库行为】

Mockito框架在事务测试中的使用

Mockito是一个Java单元测试框架,提供了一个丰富的模拟API,可以轻松地模拟对象和交互。在事务测试中,Mockito可以用于模拟各种事务行为,例如:

隔离事务:

*使用`@Mock`注解创建`DataSource`和`TransactionManager`的模拟对象。

*在测试方法中,使用`when().thenReturn()`桩`DataSource`以返回预期的`Connection`实例。

*使用`doNothing()`桩`TransactionManager`以避免实际提交或回滚事务。

验证事务行为:

*使用`verify()`方法验证事务的行为,例如:

*断言`DataSource`被调用了正确的次数来获取连接。

*断言`TransactionManager`被调用了正确的次数来开启和关闭事务。

回滚事务:

*如果需要测试事务回滚,可以使用`when().thenThrow()`桩`DataSource`或`TransactionManager`以在执行特定操作时抛出异常。

*这样,事务将回滚,并且可以验证回滚的行为。

使用示例:

```java

importorg.junit.Before;

importorg.junit.Test;

importorg.mockito.Mock;

importorg.mockito.MockitoAnnotations;

importjavax.sql.DataSource;

importjavax.transaction.TransactionManager;

@Mock

privateDataSourcedataSource;

@Mo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论