@EnableAsync源码注释翻译

如果翻译的有问题,请在留言指出,不胜感激!!!

 类上方注释

  启用Spring的异步方法执行能力,类似于Spring的<task:*> XML命名空间中的功能。
与@Configuration类一起使用,如下所示,为整个Spring应用程序上下文启用注解驱动的异步处理功能。
1 @Configuration
2 @EnableAsync
3  public class AppConfig {
4  }

   MyAsyncBean是一个用户定义的类,它有一个或多个方法,使用Spring的@Async注解、EJB 3.1的@Asynchronous注解或通过annotation属性指定的任何自定义注解。切面是显示地添加到任何注册的bean,例如通过以下配置:

1 @Configuration
2   public class AnotherAppConfig {
3       @Bean
4       public MyAsyncBean asyncBean() {
5           return new MyAsyncBean();
6       }
7 }

  默认情况下,Spring将搜索关联的线程池定义:要么是上下文中唯一的TaskExecutor bean,要么是名为“TaskExecutor”的Executor bean。如果两者都不可解析,则将使用SimpleAsyncTaskExecutor来处理异步方法调用。此外,具有void返回类型的注释方法不能将任何异常传回调用方。默认情况下,这种未捕获的异常只记录日志。
  如果要定制所有这些,需要实现AsyncConfigurer并提供:
您自己的Executor通过(重写)AsyncConfigurer#getAsyncExecutor()方法
您自己的AsyncUncaughtExceptionHandler通(重写)AsyncConfigurer#getAsyncUncaughtExceptionHandler()方法

 

  注意:AsyncConfigurer配置类在应用程序上下文引导的早期被初始化。如果您需要对其他bean的任何依赖,请确保尽可能地将它们声明为“lazy”,以便让它们也通过其他后置处理器。

@Configuration
@EnableAsync
 public class AppConfig implements AsyncConfigurer {
     @Override
      public Executor getAsyncExecutor() {
          ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
          executor.setCorePoolSize(7);
          executor.setMaxPoolSize(42);
          executor.setQueueCapacity(11);
          executor.setThreadNamePrefix("MyExecutor-");
          executor.initialize();
          return executor;
      }
      @Override
      public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
          return new MyAsyncUncaughtExceptionHandler();
      }
  }

  如果只需要定制一项,则可以返回null以保持默认设置。如果可能的话,也考虑从AsyncConfigurerSupport扩展。
       注意:在上面的例子中,ThreadPoolTaskExecutor不是一个完全托管的Spring bean。如果您想要一个完全托管的bean,则将@Bean注解添加到getAsyncExecutor()方法中。在这种情况下,不再需要手动调用executor.initialize()方法,因为它将在bean初始化时自动调用。
       作为参考,上面的例子可以与下面的Spring XML配置进行比较:

1 <bean>
2 <task:annotation-driven executor="myExecutor" exception-handler="exceptionHandler"/>;
3 <task:executor id="myExecutor" pool-size="7-42" queue-capacity="11"/>;
4 <bean id="asyncBean" class="com.foo.MyAsyncBean"/>
5 <bean id="exceptionHandler" class="com.foo.MyAsyncUncaughtExceptionHandler"/>
6 </bean>

  上述基于xml和基于javaconfig的示例是等价的,除了设置Executor的线程名前缀之外;这是因为<task:executor>元素不公开这样的属性。这演示了基于javaconfig的方法如何通过直接访问实际组件来实现最大的可配置性。

  EnableAsync注解类的属性mode,控制着通知advice是如何被应用的:如果mode是 AdviceMode中的PROXY (默认值),那么其他属性控制代理的行  为。
  请注意,代理模式只允许通过代理拦截调用;同一类中的本地调用不能以这种方式被拦截。

 方法上方注释

annotation()

  指示要在类或方法级别检测的'async'注释类型。
       默认情况下,将检测到Spring的@Async注解和EJB 3.1 @Asynchronous注解。此属性的存在是为了让开发人员能够提供他们自己的自定义注释类型,以指示应该异步调用一个方法(或给定类的所有方法)。

proxyTargetClass()

  指示是否要创建基于子类(CGLIB)的代理,而不是标准的基于Java接口的代理。

  仅当模式设置为AdviceMode#PROXY时有效。

  默认是 false。

  注意,将该属性设置为true将影响所有需要代理的spring管理bean,而不仅仅是那些标记为@Async的bean。

例如,用Spring的@Transactional注释标记的其他bean将同时升级为子类代理。这种方法在实践中没有负面影响,除非明确地期望一种类型的代理与另一种 —例如,在测试中。

mode()

 

  指出应该如何应用异步通知。
  默认值是AdviceMode#PROXY。
  请注意,代理模式只允许通过代理拦截调用。同一类内的本地调用不能以这种方式被拦截;在本地调用中对这样的方法的Async注解将被忽略,因为Spring的拦截器甚至没有为这样的运行时场景启动。对于更高级的拦截模式,考虑将其切换到AdviceMode#ASPECTJ。

order()

  指示应该应用AsyncAnnotationBeanPostProcessor的顺序。

  默认值是Ordered#LOWEST_PRECEDENCE,以便在所有其他后处理器之后运行,这样它就可以向现有代理添加一个advisor,而不是双代理。

posted @ 2022-12-05 15:49  JustJavaIt  阅读(163)  评论(0编辑  收藏  举报