当前位置: 首页 > news >正文

外汇申报在哪个网站上做河南省建筑网官网

外汇申报在哪个网站上做,河南省建筑网官网,wordpress 主机,北京木马工业设计1、简介 Transactional是spring中定义的事务注解#xff0c;在方法或类上加该注解开启事务。主要是通过反射获取bean的注解信息#xff0c;利用AOP对编程式事务进行封装实现。(spring-5.1.8.RELEASE) Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionP…1、简介 Transactional是spring中定义的事务注解在方法或类上加该注解开启事务。主要是通过反射获取bean的注解信息利用AOP对编程式事务进行封装实现。(spring-5.1.8.RELEASE) Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface Transactional {AliasFor(transactionManager)String value() default ;AliasFor(value)String transactionManager() default ;Propagation propagation() default Propagation.REQUIRED;Isolation isolation() default Isolation.DEFAULT;int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;boolean readOnly() default false;Class? extends Throwable[] rollbackFor() default {};String[] rollbackForClassName() default {};Class? extends Throwable[] noRollbackFor() default {};String[] noRollbackForClassName() default {}; }2、自定义注解 2.1 定义 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface MyAnnotation {//自定义注解的属性int id() default 0;String name() default 默认名称;String[]arrays();String title() default 默认标题; }2.2 测试 public class App {MyAnnotation(name wqd, arrays {2, 3})public void aMethod() {}public void bMethod() {}public static void main(String[] args) throws ClassNotFoundException {// 反射获取到类的信息Class? clazz Class.forName(com.wyq.App);// 获取当前类不包括继承所有方法Method[] methods clazz.getDeclaredMethods();// 遍历每个方法的信息for (Method method : methods) {System.out.println(方法名称 method.getName());// 获取方法上面的注解MyAnnotation annotation method.getDeclaredAnnotation(MyAnnotation.class);if (annotation null) {System.out.println(该方法上没有加注解...);} else {System.out.println(Id : annotation.id());System.out.println(Name : annotation.name());System.out.println(Title : annotation.title());System.out.println(Arrays : annotation.arrays());}System.out.println(--------------------------);}} }控制台信息方法名称main 该方法上没有加注解... -------------------------- 方法名称aMethod Id : 0 Name : wqd Title : 默认标题 Arrays : [Ljava.lang.String;24d46ca6 -------------------------- 方法名称bMethod 该方法上没有加注解... --------------------------2.3 总结 通过上面这么一个小demo我们就能发现反射获取到每一个方法的注解信息然后进行判断如果这是Transactional注解spring就会开启事务。接下来我们可以按照这种思路自己实现一个事务注解。 3、手写事务注解 3.1 maven依赖 dependencies!-- 引入Spring-AOP等相关Jar --dependencygroupIdorg.springframework/groupIdartifactIdspring-core/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-aop/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-orm/artifactIdversion${spring.version}/version/dependencydependencygroupIdorg.aspectj/groupIdartifactIdaspectjrt/artifactIdversion1.9.4/version/dependencydependencygroupIdaspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.5.4/version/dependencydependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version/dependencydependencygroupIdcom.mchange/groupIdartifactIdc3p0/artifactIdversion0.9.5.2/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.37/version/dependency/dependencies3.2 配置spring.xml文件 ?xml version1.0 encodingUTF-8? beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd!--扫描指定路径--context:component-scan base-packagecom.wyq /!--开启切面代理--aop:aspectj-autoproxy /!--数据源对象C3P0 连接池--bean iddataSource classcom.mchange.v2.c3p0.ComboPooledDataSourceproperty namedriverClass valuecom.mysql.jdbc.Driver/property namejdbcUrl valuejdbc:mysql://localhost:3306/test/property nameuser valueroot/property namepassword value123456//bean!--JdbcTemplate 工具类实例--bean idjdbcTemplate classorg.springframework.jdbc.core.JdbcTemplateproperty namedataSource refdataSource//bean!--配置事务--bean iddataSoutceTransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/bean /beans3.3 自定义事务注解 (通过反射解析方法上的注解如果有这个注解就执行事务逻辑) Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface MyAnnotation {//自定义注解的属性int id() default 0;String name() default 默认名称;String[] arrays() default {};String title() default 默认标题; }3.4 封装编程式事务 Component Scope(prototype) public class TransactionUtil {// 全局接受事务状态private TransactionStatus transactionStatus;// 获取事务原Autowiredprivate DataSourceTransactionManager dataSourceTransactionManager;// 开启事务public TransactionStatus begin() {System.out.println(开启事务);transactionStatus dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());return transactionStatus;}// 提交事务public void commit(TransactionStatus transaction) {System.out.println(提交事务);if (dataSourceTransactionManager ! null) {dataSourceTransactionManager.commit(transaction);}}public void rollback(TransactionStatus transaction) {System.out.println(回滚事务);if (dataSourceTransactionManager ! null) {dataSourceTransactionManager.rollback(transaction);}} }3.5 通过AOP封装事务工具类, 基于环绕通知和异常通知来触发事务 Component Aspect public class AopTransaction {Autowiredprivate TransactionUtil transactionUtil;private TransactionStatus transactionStatus;/*** 环绕通知在方法 前---后 处理事情** param pjp 切入点*/Around(execution(* com.wyq.service.*.*(..)))public void around(ProceedingJoinPoint pjp) throws Throwable {// 获取方法的注解MyAnnotation annotation this.getMethodMyAnnotation(pjp);// 判断是否需要开启事务transactionStatus begin(annotation);// 调用目标代理对象方法pjp.proceed();// 判断关闭事务commit(transactionStatus);}/*** 获取代理方法上的事务注解** param pjp* return* throws Exception*/private MyAnnotation getMethodMyAnnotation(ProceedingJoinPoint pjp) throws Exception {// 获取代理对象的方法String methodName pjp.getSignature().getName();// 获取目标对象Class? classTarget pjp.getTarget().getClass();// 获取目标对象类型Class?[] par ((MethodSignature) pjp.getSignature()).getParameterTypes();// 获取目标对象方法Method objMethod classTarget.getMethod(methodName, par);// 获取该方法上的事务注解MyAnnotation annotation objMethod.getDeclaredAnnotation(MyAnnotation.class);return annotation;}/*** 开启事务** param annotation* return*/private TransactionStatus begin(MyAnnotation annotation) {if (annotation null) {return null;}return transactionUtil.begin();}/*** 提交事务** param transactionStatus*/private void commit(TransactionStatus transactionStatus) {if (transactionStatus ! null) {transactionUtil.commit(transactionStatus);}}/*** 异常通知进行 回滚事务*/AfterThrowing(execution(* com.wyq.service.*.*(..)))public void afterThrowing() {// 获取当前事务 直接回滚if (transactionStatus ! null) {transactionUtil.rollback(transactionStatus);}} }3.6 dao 层 /* CREATE TABLE t_user0 (name varchar(20) NOT NULL,age int(5) DEFAULT NULL,PRIMARY KEY (name) ) ENGINEInnoDB DEFAULT CHARSETutf8; */ Repository public class UserDao {Autowiredprivate JdbcTemplate jdbcTemplate;public int add(String name, Integer age) {String sql INSERT INTO t_user0(NAME, age) VALUES(?,?);;int result jdbcTemplate.update(sql, name, age);System.out.println(插入成功);return result;} }3.7 service 层 Service public class UserService {Autowiredprivate UserDao userDao;// 加上事务注解MyAnnotationpublic void add() {userDao.add(test001, 20);int i 1 / 0; //设置异常检查事务的正确性userDao.add(test002, 21); // // 如果非要try,那么出现异常不会被aop的异常通知监测到,必须手动在catch里面回滚事务。 // try { // userDao.add(test001, 20); // int i 1 / 0; // userDao.add(test002, 21); // } catch (Exception e) { // // 回滚当前事务 // System.out.println(回滚); // TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); // }}public void del() {System.out.println(del...);} }3.8 测试 public class Test {public static void main(String[] args) {ClassPathXmlApplicationContext applicationContext new ClassPathXmlApplicationContext(spring.xml);UserService userService (UserService) applicationContext.getBean(userService);// aop()对userService类进行了拦截,添加自定义事务注解的方法会触发事务逻辑userService.add();// del()方法没有加注解则什么也不会触发。//userService.del();} }
http://wiki.neutronadmin.com/news/303843/

相关文章:

  • wordpress全站cdn sslwordpress 后门检测
  • 网站搜索引擎优化方案论文网站项目报价单模板免费下载
  • 怎样做网站收录做百度网站每年的费用多少钱
  • python网页制作项目seo招聘信息
  • 学网站开发有前途吗高端建筑
  • 湖州做网站推广的公司wordpress easydigital
  • 重庆网站建站建设免费网页作业设计报告
  • 温州市营销网站建设网络营销中网站的目的是
  • 湖南建设网站获客系统衡水网站建设培训学校
  • 中国山东网站建设中国企业商铺网
  • 太原网站优化哪家专业百度上首页
  • 做木工的网站自助建站系统怎么用
  • 哪些作弊网站泰安电脑网站建设电话
  • 网站开发的思维导图工商年报网上怎么申报
  • 专门做产品定制的网站根据网站做app
  • 湖南网站营销推广设计贺兰县住房城乡建设局网站
  • 商务网站需求说明书深圳品牌网站策划
  • 网站开发主要任务电子商务网站的建设费用
  • wix建站教程东莞市植选网络科技有限公司
  • 做wish选品网站 数据网站深圳宝安区什么时候解封
  • wordpress搭建站点哪家竞价托管专业
  • 沈阳网站建设沈阳网站建设域名怎么用
  • 上海网站备案一家做运动鞋的网站
  • 竞价单页网站模板做网站首页文字排版技巧
  • 义乌做站外推广的公司手机凡客网
  • 网站申请微信登录wordpress 评论回信
  • 免费的网站托管商城网站 免费开源
  • 网站后台登入模板做网站 sql 用哪种
  • discuz论坛应用中心阳江seo网站推广
  • 个人备案网站类型wordpress建网站详细教程