这是从IBM developerWork上的一篇文章。 原文:
[url]http://www.ibm.com/developerworks/cn/education/opensource/os-cn-spring-trans/section5.html
[/url]
声明式事务管理
Spring 的声明式事务管理概述
Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过等价的基于标注的方式),便可以将事务规则应用到业务逻辑中。因为事务管理本身就是一个典型的横切逻辑,正是 AOP 的用武之地。Spring 开发团队也意识到了这一点,为声明式事务提供了简单而强大的支持。
声明式事务管理曾经是 EJB 引以为傲的一个亮点,如今 Spring 让 POJO 在事务管理方面也拥有了和 EJB 一样的待遇,让开发人员在 EJB 容器之外也用上了强大的声明式事务管理功能,这主要得益于 Spring 依赖注入容器和 Spring AOP 的支持。依赖注入容器为声明式事务管理提供了基础设施,使得 Bean 对于 Spring 框架而言是可管理的;而 Spring AOP 则是声明式事务管理的直接实现者,这一点通过清单8可以看出来。
通常情况下,笔者强烈建议在开发中使用声明式事务,不仅因为其简单,更主要是因为这样使得纯业务代码不被污染,极大方便后期的代码维护。
和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法等等。
下面就来看看 Spring 为我们提供的声明式事务管理功能。
基于 TransactionInter... 的声明式事务管理
最初,Spring 提供了 TransactionInterceptor 类来实施声明式事务管理功能。先看清单8的配置文件:
清单 8. 基于 TransactionInterceptor 的事务管理示例配置文件
<beans...>
......
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="bankServiceTarget"
class="footmark.spring.core.tx.declare.origin.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<bean id="bankService"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="interceptorNames">
<list>
<idref bean="transactionInterceptor"/>
</list>
</property>
</bean>
......
</beans>
首先,我们配置了一个 TransactionInterceptor 来定义相关的事务规则,他有两个主要的属性:一个是 transactionManager,用来指定一个事务管理器,并将具体事务相关的操作委托给它;另一个是 Properties 类型的 transactionAttributes 属性,它主要用来定义事务规则,该属性的每一个键值对中,键指定的是方法名,方法名可以使用通配符,而值就表示相应方法的所应用的事务属性。
指定事务属性的取值有较复杂的规则,这在 Spring 中算得上是一件让人头疼的事。具体的书写规则如下:
传播行为 [,隔离级别] [,只读属性] [,超时属性] [不影响提交的异常] [,导致回滚的异常]
* 传播行为是唯一必须设置的属性,其他都可以忽略,Spring为我们提供了合理的默认值。
* 传播行为的取值必须以“PROPAGATION_”开头,具体包括:PROPAGATION_MANDATORY、 PROPAGATION_NESTED、PROPAGATION_NEVER、PROPAGATION_NOT_SUPPORTED、 PROPAGATION_REQUIRED、PROPAGATION_REQUIRES_NEW、PROPAGATION_SUPPORTS,共七种取值。
* 隔离级别的取值必须以“ISOLATION_”开头,具体包括:ISOLATION_DEFAULT、 ISOLATION_READ_COMMITTED、ISOLATION_READ_UNCOMMITTED、 ISOLATION_REPEATABLE_READ、ISOLATION_SERIALIZABLE,共五种取值。
* 如果事务是只读的,那么我们可以指定只读属性,使用“readOnly”指定。否则我们不需要设置该属性。
* 超时属性的取值必须以“TIMEOUT_”开头,后面跟一个int类型的值,表示超时时间,单位是秒。
* 不影响提交的异常是指,即使事务中抛出了这些类型的异常,事务任然正常提交。必须在每一个异常的名字前面加上“+”。异常的名字可以是类名的一部分。比如“+RuntimeException”、“+tion”等等。
* 导致回滚的异常是指,当事务中抛出这些类型的异常时,事务将回滚。必须在每一个异常的名字前面加上“-”。异常的名字可以是类名的全部或者部分,比如“-RuntimeException”、“-tion”等等。
以下是两个示例:
<property name="*Service">
PROPAGATION_REQUIRED,ISOLATION_READ_COMMITTED,TIMEOUT_20,
+AbcException,+DefException,-HijException
</property>
以上表达式表示,针对所有方法名以 Service 结尾的方法,使用 PROPAGATION_REQUIRED 事务传播行为,事务的隔离级别是 ISOLATION_READ_COMMITTED,超时时间为20秒,当事务抛出 AbcException 或者 DefException 类型的异常,则仍然提交,当抛出 HijException 类型的异常时必须回滚事务。这里没有指定"readOnly",表示事务不是只读的。
<property name="test">PROPAGATION_REQUIRED,readOnly</property>
以上表达式表示,针对所有方法名为 test 的方法,使用 PROPAGATION_REQUIRED 事务传播行为,并且该事务是只读的。除此之外,其他的属性均使用默认值。比如,隔离级别和超时时间使用底层事务性资源的默认值,并且当发生未检查异常,则回滚事务,发生已检查异常则仍提交事务。
配置好了 TransactionInterceptor,我们还需要配置一个 ProxyFactoryBean 来组装 target 和advice。这也是典型的 Spring AOP 的做法。通过 ProxyFactoryBean 生成的代理类就是织入了事务管理逻辑后的目标类。至此,声明式事务管理就算是实现了。我们没有对业务代码进行任何操作,所有设置均在配置文件中完成,这就是声明式事务的最大优点。
基于 TransactionProxy... 的声明式事务管理
前面的声明式事务虽然好,但是却存在一个非常恼人的问题:配置文件太多。我们必须针对每一个目标对象配置一个 ProxyFactoryBean;另外,虽然可以通过父子 Bean 的方式来复用 TransactionInterceptor 的配置,但是实际的复用几率也不高;这样,加上目标对象本身,每一个业务类可能需要对应三个 <bean/> 配置,随着业务类的增多,配置文件将会变得越来越庞大,管理配置文件又成了问题。
为了缓解这个问题,Spring 为我们提供了 TransactionProxyFactoryBean,用于将TransactionInterceptor 和 ProxyFactoryBean 的配置合二为一。如清单9所示:
清单9. 基于 TransactionProxyFactoryBean 的事务管理示例配置文件
<beans......>
......
<bean id="bankServiceTarget"
class="footmark.spring.core.tx.declare.classic.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<bean id="bankService"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target" ref="bankServiceTarget"/>
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<props>
<prop key="transfer">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
......
</beans>
如此一来,配置文件与先前相比简化了很多。我们把这种配置方式称为 Spring 经典的声明式事务管理。相信在早期使用 Spring 的开发人员对这种配置声明式事务的方式一定非常熟悉。
但是,显式为每一个业务类配置一个 TransactionProxyFactoryBean 的做法将使得代码显得过于刻板,为此我们可以使用自动创建代理的方式来将其简化,使用自动创建代理是纯 AOP 知识,请读者参考相关文档,不在此赘述。
基于 <tx> 命名空间的声明式事务管理
前面两种声明式事务配置方式奠定了 Spring 声明式事务管理的基石。在此基础上,Spring 2.x 引入了 <tx> 命名空间,结合使用 <aop> 命名空间,带给开发人员配置声明式事务的全新体验,配置变得更加简单和灵活。另外,得益于 <aop> 命名空间的切点表达式支持,声明式事务也变得更加强大。
如清单10所示:
清单10. 基于 <tx> 的事务管理示例配置文件
<beans......>
......
<bean id="bankService"
class="footmark.spring.core.tx.declare.namespace.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<tx:advice id="bankAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="transfer" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/>
<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config>
......
</beans>
如果默认的事务属性就能满足要求,那么代码简化为如清单 11 所示:
清单 11. 简化后的基于 <tx> 的事务管理示例配置文件
<beans......>
......
<bean id="bankService"
class="footmark.spring.core.tx.declare.namespace.BankServiceImpl">
<property name="bankDao" ref="bankDao"/>
</bean>
<tx:advice id="bankAdvice" transaction-manager="transactionManager">
<aop:config>
<aop:pointcut id="bankPointcut" expression="execution(**.transfer(..))"/>
<aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/>
</aop:config>
......
</beans>
由于使用了切点表达式,我们就不需要针对每一个业务类创建一个代理对象了。另外,如果配置的事务管理器 Bean 的名字取值为“transactionManager”,则我们可以省略 <tx:advice> 的 transaction-manager 属性,因为该属性的默认值即为“transactionManager”。
基于 @Transactional 的声明式事务管理
除了基于命名空间的事务配置方式,Spring 2.x 还引入了基于 Annotation 的方式,具体主要涉及@Transactional 标注。@Transactional 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。如清单12所示:
清单12. 基于 @Transactional 的事务管理示例配置文件
@Transactional(propagation = Propagation.REQUIRED)
public boolean transfer(Long fromId, Long toId, double amount) {
return bankDao.transfer(fromId, toId, amount);
}
Spring 使用 BeanPostProcessor 来处理 Bean 中的标注,因此我们需要在配置文件中作如下声明来激活该后处理 Bean,如清单13所示:
清单13. 启用后处理Bean的配置
<tx:annotation-driven transaction-manager="transactionManager"/>
与前面相似,transaction-manager 属性的默认值是 transactionManager,如果事务管理器 Bean 的名字即为该值,则可以省略该属性。
虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 小组建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
基于 <tx> 命名空间和基于 @Transactional 的事务声明方式各有优缺点。基于 <tx> 的方式,其优点是与切点表达式结合,功能强大。利用切点表达式,一个配置可以匹配多个方法,而基于 @Transactional 的方式必须在每一个需要使用事务的方法或者类上用 @Transactional 标注,尽管可能大多数事务的规则是一致的,但是对 @Transactional 而言,也无法重用,必须逐个指定。另一方面,基于 @Transactional 的方式使用起来非常简单明了,没有学习成本。开发人员可以根据需要,任选其中一种使用,甚至也可以根据需要混合使用这两种方式。
如果不是对遗留代码进行维护,则不建议再使用基于 TransactionInterceptor 以及基于TransactionProxyFactoryBean 的声明式事务管理方式,但是,学习这两种方式非常有利于对底层实现的理解。
虽然上面共列举了四种声明式事务管理方式,但是这样的划分只是为了便于理解,其实后台的实现方式是一样的,只是用户使用的方式不同而已。
分享到:
相关推荐
Spring 框架中的事务处理方式有两种:编程式事务和申明式事务。优点在于能够实现全局事务的控制,通过 EJB CMT 进行事物的管理;缺点在于事务声明有编程式事物和申明式事物。 10. MyBatis 应用 MyBatis 是一个持久...
内容概要:本文介绍了基于西门子TIA Portal平台和S7-1200控制器的三层电梯PLC程序组态仿真全过程。文中详细描述了不同楼层间电梯响应机制的基本逻辑和复杂逻辑处理方法,以及如何利用梯形图(Ladder Logic)或功能块图(Function Block Diagram)编写程序代码。此外,还涵盖了WinCC软件用于创建仿真界面的具体操作,包括楼层指示器、按钮和呼梯显示器的设计与实现。最后,通过对整个项目的总结,分享了项目实施过程中的关键技术和实践经验。 适合人群:从事工业自动化领域的工程师和技术人员,特别是那些希望深入了解PLC编程及其仿真技术的人群。 使用场景及目标:适用于教学培训、工程项目规划和技术研究等领域。主要目的是帮助读者掌握PLC控制系统的设计思路,提高解决实际工程问题的能力。 其他说明:文中强调了编程技能、逻辑思维能力和对客户需求及设备原理深刻理解的重要性,这些都是成功完成此类项目不可或缺的因素。
K003_调试工具_旧-TcpIpDebug-TCP通讯.zip
基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码,个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+GCN+BERT的中文文本分类Python实现源码基于CNN+RNN+G
机器学习训练数据 真人与机器识别
实训商业源码-最新PHP交友盲盒系统源码-论文模板.zip
玫瑰叶子病害检测数据集VOC+YOLO格式3699张4类别.docx
内容概要:本文详细介绍了基于单矢量及多矢量模型的永磁同步电机电流预测控制仿真模型。首先,通过对永磁同步电机(PMSM)的特性分析,建立了定子电流预测模型,用于预测不同定子电压激励作用下的电流响应。接着,文章阐述了电流环输出的计算方法以及通过价值函数在线优化来选择最优控制结果。此外,还探讨了双矢量、三矢量及改进三矢量模型的应用及其优势,强调了这些模型在提高电流控制精度和适应复杂运行环境方面的潜力。最后,指出预测电流控制的优势在于其实现了解耦控制并能提供最优控制结果。 适合人群:从事电机控制系统研究的技术人员、高校相关专业师生、自动化工程领域的研究人员。 使用场景及目标:适用于希望深入了解永磁同步电机电流控制技术的研究人员和技术开发者,旨在提升电机控制系统的效率和精度。 其他说明:文中不仅提供了理论分析,还包括具体的建模方法和优化策略,有助于读者全面掌握永磁同步电机电流预测控制的关键技术和应用场景。
基于python实现的语音情绪分析+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python实现的语音情绪分析+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档~ 基于python实现的语音情绪分析+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python实现的语音情绪分析+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python实现的语音情绪分析+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python实现的语音情绪分析+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 基于python实现的语音情绪分析+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档
实训商业源码-源码资源站emlog模板-论文模板.zip
Al企联系统去授权版新鲜出炉 授权了一款市面上新出的AI企联系统 整体感觉页面还算不错,功能也还行,没有公众号也可以完美搭建 好像是全开源,可随意二开,我也没太注意。 项目uniapp开发的,支持3.5 4.0 Mj 此套系统5端适配,Web+H5+微信小程序+抖音小程序+双端APP,支持流量主! 好像有能力的快手小程序那些也可以上线。 我没有搭建,只在本地运行了一下,下面的演示站也是官方的 所以凑乎的看吧。自己有能力的可以二开,UI后台也可以自己改。 官方部署文档:https://wisestai.feishu.cn/docx/Ug17d9Iq0o878ax41uDckFbTnxg
内容概要:本文主要介绍了在使用搜索引擎时需要注意的事项,以帮助用户更高效、准确地获取信息。首先强调了关键词的选择与优化,包括使用精准关键词、尝试不同关键词组合以及排除无关词。其次,阐述了搜索引擎功能的利用,如高级搜索选项、语音搜索与图像搜索和垂直搜索引擎的使用。然后,从来源可靠性、内容相关性和信息时效性三个方面讲述了信息评估与筛选的重要性。接着,提醒用户注意隐私与安全,如保护个人信息和防范网络诈骗。最后,鼓励用户持续学习与优化搜索技巧,如学习新的搜索技巧并根据搜索结果反馈及时调整策略。; 适合人群:所有需要使用搜索引擎查找信息的人群,尤其是对搜索技巧有一定需求的学生、研究人员和职场人士。; 使用场景及目标:①提高搜索效率,减少无效信息的干扰;②确保搜索结果的可靠性和时效性;③保护个人隐私和安全;④掌握更多搜索技巧和方法。; 其他说明:本文不仅提供了具体的搜索技巧,还强调了信息评估的重要性,提醒用户在搜索过程中保持批判性思维,确保获取的信息既准确又可靠。同时,鼓励用户不断学习新的搜索技巧,适应搜索引擎的变化和发展。
内容概要:本文介绍了如何使用梯形图编写程序来控制FactoryIO中的十字机械手组装工作站。主要内容涵盖软件环境配置(TIA Portal V16 和 FactoryIO 2.4)、程序逻辑设计以及具体的功能实现,如皮带的防堵、避让、分流等功能。文中还提供了一些简化的梯形图代码示例及其详细注释,帮助初学者更好地理解和掌握编程技巧。 适合人群:对工业自动化感兴趣的初学者,尤其是那些希望快速上手梯形图编程的人群。 使用场景及目标:本教程旨在引导读者从零开始搭建一个完整的十字机械手组装工作站仿真实验系统,使他们能够熟悉工业自动化编程的基本流程和技术要点。 其他说明:文章不仅提供了理论指导,还包括具体的实践操作步骤,鼓励读者亲自动手尝试,从而加深对所学知识的理解。
基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(高分项目)基于知识图谱的电影推荐系统的Python毕业设计项目源码(
本数据集包含:12,500张图像,4种不同的细胞类型,可以用来检测和分类血细胞类型;本数据集包含:12,500张图像,4种不同的细胞类型,可以用来检测和分类血细胞类型
内容概要:本文详细介绍了基于4mos结构的两相交错并联Buck/Boost变换器的仿真研究。首先概述了此类变换器的基本构造和工作原理,接着重点讨论了三种不同的控制方式——开环控制、电压单环控制以及电压电流双闭环控制。文中不仅解释了各控制方式的工作机制,还对其连接方法进行了具体指导。实验结果显示,在这三种控制方式中,双闭环控制模式表现出色,尤其在电感电流均流方面效果显著,从而提高了系统的整体效率和稳定性。此外,文章还简要提及了一种单向结构(含两个MOSFET和两个二极管)的变换器,并将其与4mos结构进行了对比。最后,作者强调了matlab/simulink/plecs等仿真软件对于理解和优化这类变换器的重要价值。 适用人群:从事电力电子相关领域的研究人员和技术人员,尤其是那些希望深入了解Buck-Boost变换器内部运作机制的人士。 使用场景及目标:适用于需要评估不同控制策略对Buck-Boost变换器性能影响的研究项目;旨在帮助工程师选择最适合实际应用需求的设计方案。 其他说明:文中提供的仿真数据和结论有助于推动电力电子技术的发展,为未来更高性能的电源转换设备的研发提供理论依据。
PHP微信抽奖系统源码
基于python实现的对抗性样本攻击与防御+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 该代码探究了一种对于图像的攻击与防御方法。使用多种对抗性样本生成方法,在标准数据集上批量生成对抗性样本,从而达到欺骗神经网络的效果。同时,对于已经生成的对抗性样本做某些图像变换,去除对抗性样本噪声(noise),从而消除对抗性样本的影响,达到防御的效果。 基于python实现的对抗性样本攻击与防御+源码+项目文档,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用,详情见md文档 该代码探究了一种对于图像的攻击与防御方法。使用多种对抗性样本生成方法,在标准数据集上批量生成对抗性样本,从而达到欺骗神经网络的效果。同时,对于已经生成的对抗性样本做某些图像变换,去除对抗性样本噪声(noise),从而消除对抗性样本的影响,达到防御的效果
实训商业源码-信息查询 2.6.2-论文模板.zip
内容概要:本文探讨了将天牛须算法应用于优化模糊PID控制器在风力发电机组变桨距控制系统中的表现。首先介绍了传统PID控制器面对非线性和时变特性时的局限性,然后引入了模糊PID控制器的概念及其简易实现方法,重点在于模糊规则库的构建。接着详细解释了天牛须搜索算法的工作原理,即通过模拟天牛觅食行为,在参数调整量的空间中进行搜索,以达到功率输出最大化和平滑度最佳的目标。最后展示了优化后的系统性能显著提升,如功率提高了约12%,并且在湍流条件下减少了桨距角调节频率,降低了机械磨损。此外还提到了一些注意事项,如避免陷入局部最优以及保持模糊规则库简洁。 适合人群:从事风电技术研发的专业人士,对智能控制理论感兴趣的学者和技术爱好者。 使用场景及目标:适用于希望提高风力发电机效率的研究项目或工业实践中,旨在解决现有控制系统的不足之处,特别是应对复杂多变的实际运行环境。 其他说明:文中提供了部分Python代码片段用于辅助理解算法的具体实现方式。