范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring中EnableXXX注解的套路

  前言
  在 Spring 框架中有很多实用的功能,不需要写大量的配置代码,只需添加几个注解即可开启。 其中一个重要原因是那些 @EnableXXX 注解,它可以让你通过在配置类加上简单的注解来快速地开启诸如事务管理(@EnableTransactionManagement)、Spring MVC(@EnableWebMvc)或定时任务(@EnableScheduling)等功能。这些看起来简单的注解语句提供了很多功能,但它们的内部机制从表面上看却不太明显。 一方面,对于使用者来说用这么少的代码获得这么多实用的功能是很好的,但另一方面,如果你不了解某个东西的内部是如何工作的,就会使调试和解决问题更加困难。 设计目标
  Spring 框架中那些 @EnableXXX 注解的设计目标是允许用户用最少的代码来开启复杂使用的功能。 此外,用户必须能够使用简单的默认值,或者允许手动配置该代码。最后,代码的复杂性要向框架使用者隐藏掉。 简而言之,让使用者设置大量的 Bean,并选择性地配置它们,而不必知道这些 Bean 的细节(或真正被设置的内容)。下面来看看具体的几个例子: @EnableScheduling (导入一个 @Configuration 类)
  首先要知道的是,@EnableXXX 注解并不神奇。实际上在 BeanFactory 中并不知道这些注解的具体内容,而且在 BeanFactory 类中,核心功能和特定注解(如 @EnableWebMvc)或它们所存放的 jar 包(如 spring-web)之间没有任何依赖关系。 让我们看一下 @EnableScheduling,下面看看它是如何工作的。 定义一个 SchedulingConfig 配置类,如下所示: @Configuration @EnableScheduling public class SchedulingConfig {   // some bean in here }
  上面的内容没有什么特别之处。只是一个用 @EnableScheduling 注释的标准 Java 配置。@EnableScheduling 让你以设定的频率执行某些方法。例如,你可以每 10 分钟运行 BankService.transferMoneyToMghio()。 @EnableScheduling 注解源码如下: @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(SchedulingConfiguration.class) @Documented public @interface EnableScheduling {  }
  上面的 EnableScheduling 注解,我们可以看到它只是一个标准的类级注解(@Target/@Retention),应该包含在 JavaDocs 中(@Documented),但是它有一个 Spring 特有的注解(@Import)。 @Import 是将一切联系起来的关键。 在这种情况下,由于我们的 SchedulingConfig 被注解为 @EnableScheduling,当 BeanFactory 解析文件时(内部是ConfigurationClassPostProcessor 在解析它),它也会发现 @Import(SchedulingConfiguration.class) 注解,它将导入该值中定义的类。 在这个注解中,就是 SchedulingConfiguration。
  这里 导入 是什么意思呢?在这种情况下,它只是被当作另一个 Spring Bean。 SchedulingConfiguration 实际上被注解为@Configuration,所以 BeanFactory 会把它看作是另一个配置类,所有在该类中定义的 Bean 都会被拉入你的应用上下文,就像你自己定义了另一个 @Configuration 类一样。 如果我们检查 SchedulingConfiguration,我们可以看到它只定义了一个Bean(一个Post Processor),它负责我们上面描述的调度工作,源码如下: @Configuration @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public class SchedulingConfiguration {  	@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) 	@Role(BeanDefinition.ROLE_INFRASTRUCTURE) 	public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() { 		return new ScheduledAnnotationBeanPostProcessor(); 	}  }
  也许你会问,如果想配置 SchedulingConfiguration 中定义的 bean 呢? 这里也只是在处理普通的Bean。 所以你对其它 Bean 所使用的机制也适用于此。 在这种情况下,ScheduledAnnotationBeanPostProcessor 使用一个标准的 Spring Bean 生命周期(postProcessAfterInitialization)来发现应用程序上下文何时被刷新。 当符合条件时,它会检查是否有任何 Bean 实现了 SchedulingConfigurer,如果有,就使用这些 Bean 来配置自己。 其实这一点并不明细(在 IDE 中也不太容易找到),但它与 BeanFactory 是完全分离的,而且是一个相当常见的模式,一个 Bean 被用来配置另一个 Bean。 而现在我们可以把所有的点连接起来,它(在某种程度上)很容易找到(你可以 Google 一下文档或阅读一下 JavaDocs)。 @EnableTransactionManagement(导入一个 ImportSelector)
  在上一个示例中,我们讨论了像 @EnableScheduling 这样的注解如何使用 @Import 来导入另一个 @Configuration 类并使其所有的 Bean 对你的应用程序可用(和可配置)。但是如果你想根据某些配置加载不同的 Bean 集,会发生什么呢? @EnableTransactionManagement 就是一个很好的例子。TransactioConfig 定义如下: @Configuration @EnableTransactionManagement(mode = AdviceMode.ASPECTJ) public class TransactioConfig {     // some bean in here }
  再一次,上面没有什么特别之处。只是一个用@EnableTransactionManagement注释的标准Java配置。唯一与之前的例子有些不同的是,用户为注释指定了一个参数(mode=AdviceMode.ASPECTJ)。 @EnableTransactionManagement注解本身看起来像这样。 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(TransactionManagementConfigurationSelector.class) public @interface EnableTransactionManagement {  	boolean proxyTargetClass() default false;  	AdviceMode mode() default AdviceMode.PROXY;  	int order() default Ordered.LOWEST_PRECEDENCE; }
  和前面一样,一个相当标准的注解,尽管这次它有一些参数。 然而,正如前文提到,@Import 注解是将一切联系在一起的关键,这一点再次得到证实。 但区别在于,这次我们导入的是 TransactionManagementConfigurationSelector 这个类,通过源码可以发现,其实它不是一个被 @Configuration 注解的类。 TransactionManagementConfigurationSelector 是一个实现ImportSelector 的类。 ImportSelector 的目的是让你的代码选择在运行时加载哪些配置类。 它有一个方法,接收关于注解的一些元数据,并返回一个类名数组。 在这种情况下,TransactionManagementConfigurationSelector 会查看模式并根据模式返回一些类。其中的 selectImports 方法源码如下: @Override protected String[] selectImports(AdviceMode adviceMode) {  switch (adviceMode) {    case PROXY:      return new String[] {AutoProxyRegistrar.class.getName(),                           ProxyTransactionManagementConfiguration.class.getName()};    case ASPECTJ:      return new String[] {determineTransactionAspectClass()};    default:      return null;  } }
  这些类中的大多数是 @Configuration(例如 ProxyTransactionManagementConfiguration),通过前文介绍我们知道它们会像前面一样工作。 对于 @Configuration 类,它们被加载和配置的方式与我们之前看到的完全一样。 所以简而言之,我们可以使用 @Import 和 @Configuration 类来加载一套标准的 Bean,或者使用 @Import 和 ImportSelector 来加载一套在运行时决定的 Bean。 @EnableAspectJAutoProxy (在 Bean 定义层导入)
  @Import 支持的最后一种情况,即当你想直接处理 BeanRegistry(工厂)时。如果你需要操作Bean Factory或者在Bean定义层处理Bean,那么这种情况就适合你,它与上面的情况非常相似。 你的 AspectJProxyConfig 可能看起来像。 @Configuration @EnableAspectJAutoProxy  public class AspectJProxyConfig {   // some bean in here }
  再一次,上面定义没有什么特别的东西。只是一个用 @EnableAspectJAutoProxy 注释的标准 Java 配置。 下面是@EnableAspectJAutoProxy 的源代码。 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AspectJAutoProxyRegistrar.class) public @interface EnableAspectJAutoProxy {  	boolean proxyTargetClass() default false;  	boolean exposeProxy() default false; }
  和前面一样,@Import 是关键,但这次它指向 AspectJAutoProxyRegistrar,它既没有 @Configuration 注解,也没有实现 ImportSelector 接口。 这次使用的是实现了 ImportBeanDefinitionRegistrar。 这个接口提供了对 Bean 注册中心(Bean Registry)和注解元数据的访问,因此我们可以在运行时根据注解中的参数来操作 Bean 注册表。 如果你仔细看过前面的示例,你可以看到我们忽略的类也是 ImportBeanDefinitionRegistrar。 在 @Configuration 类不够用的时候,这些类会直接操作 BeanFactory。
  所以现在我们已经涵盖了 @EnableXXX 注解使用 @Import 将各种 Bean 引入你的应用上下文的所有不同方式。 它们要么直接引入一组 @Configuration 类,这些类中的所有 Bean 都被导入到你的应用上下文中。 或者它们引入一个 ImportSelector 接口实现类,在运行时选择一组 @Configuration 类并将这些 Bean 导入到你的应用上下文中。 最后,他们引入一个ImportBeanDefinitionRegistrars,可以直接与 BeanFactory 在 BeanDefinition 级别上合作。 结论
  总的来说,个人认为这种将 Bean 导入应用上下文的方法很好,因为它使框架使用者的使用某个功能非常容易。不幸的是,它模糊了如何找到可用的选项以及如何配置它们。 此外,它没有直接利用 IDE 的优势,所以很难知道哪些 Bean 正在被创建(以及为什么)。 然而,现在我们知道了 @Import 注解,我们可以使用 IDE 来挖掘一下每个注解及其相关的配置类,并了解哪些 Bean 正在被创建,它们如何被添加到你的应用上下文中,以及如何配置它们。 希望对你有帮助~
  文章来自https://www.cnblogs.com/mghio/p/16297637.html

Steam游戏掌机硬件更新,升级CPU,优化散热,扩大SSDGPDWIN2游戏掌机是目前市面上唯一能玩AAA大作的PC游戏掌机,而处理器最近也升级到了酷睿m38100y,很多人问GPDWIN2提升的一些细节,是否仅仅升级了处理器,其它方面是别再选巨无霸了,8。9寸电脑了解一下,这才是大小最合适的笔记本笔记本电脑应该怎么选?有些人更注重性能,有些人更喜欢便携,这就涉及到一个问题,究竟多大尺寸的笔记本电脑,才能既能够便携,又能满足人们对于性能的需要?15。6寸的笔记本,处理器的性能8。9寸超极本开始发货,玩家光速晒机,没参加的人大呼后悔8。9寸超极本GPDP2Max已开启发货模式,经过上周的第一波发货之后,已经有不少用户收到了机器,让我们来看一下收到机器的人晒机吧。运送GPDP2Max的快递还是很给力的,广东省内全金属8。9寸笔记本银色版到货体验,坐高铁出差的神器有一些人抱怨GPDP2Max的预售时间太长,等货的时间太久,但是要知道这是全球第一台8。9寸的超极本,全镁铝合金一体化成型外观,参加预售的用户是第一批到手体验的,并且还能享受预售价6寸PC掌机更换2T固态硬盘,想装下整个Steam游戏库吗?用过PC游戏掌机GPDWIN2的都知道,GPDWIN2可以玩各种各样的Steam大型游戏,机身自带的容量是128G和256G的,如果安装的游戏多了,那么自然会产生不够用的情况,不过重量级性能怪兽8寸掌机WINMax内测体验,既是掌机又是游戏本GPDWINMAX是一台8寸屏幕的小型笔记本电脑,其基础配置为8寸1280800分辨率屏幕,i51035G7处理器,16GBLPDDR43733Mhz双通道内存,IrisPlus9决策参考快手2019年总收入500亿元阿里发布告商家书1快手2019年总收入500亿元直播收入接近300亿元事件2月10日晚间,界面新闻记者从知情人士处获悉,2019年快手总收入为500亿元左右,其中直播收入接近300亿元,游戏电商等新时代旧思维是提升治理能力现代化的核心障碍党的十九大指出,我们已经进入新时代,在新时代理应具备治国理政的新思维。党的十九届四中全会又进一步指出,到2035年,各方面制度更加完善,基本实现国家治理体系和治理能力现代化。而反观关于she的一些事晚上想起了一些大学里的事,突然就想起了she这首歌,毕竟这首歌作为我的手机铃声,基本上陪我度过了整个大学,我都忘记了是何时把它换掉的。第一次知道这首歌是在大一,那时一个部门的大二师内心上演了一出又一出的大戏中午和同事一起去吃饭,选好菜后,直接端着餐盘去打饭,跟着同事找位置去了。到位置后,才反应过来,刚才自己忘记去称菜了,忘记付钱了(我们吃的是大米先生有很多种菜放在那里,自由选择,选好Redmi将推出智能电视X2022款10月18日,小米表示,Redmi智能电视X2022款将于10月20日正式发布。据悉,这款电视将具有4K分辨率和120Hz刷新率,成为了微软Xbox中国推荐优质游戏显示设备。小米官
最高法到2025年建成互通共享的司法区块链联盟中新网5月25日电据最高人民法院微信公众号消息,5月25日,最高人民法院发布最高人民法院关于加强区块链司法应用的意见(以下简称意见)。意见提出到2025年,建成人民法院与社会各行各曝鸿蒙系统华为Mate50mini,华为Mate40彻底失宠,价格被迫爆降纵观华为所有机型,很少见到小屏旗舰。现在5G手机壳可以量产了,华为会逐步扩大机型的覆盖范围,进一步提高市场份额。华为Mate50mini将再次惊艳众人,6。1英寸0屏幕,骁龙8Ge购机不用等618这几款888旗舰闭眼入真香作为上一代顶级旗舰处理器,骁龙888的性能放到现在依然属于第一梯队,实际体验和新款处理器并没有明显劣势。搭载该处理器的手机降价幅度非常大,即便新上市的新机价格也很实惠,如果最近想要1699!红米Note系列发布,搭载天玑8100,支持耳机口,友商麻了一年两更的红米Note系列终于发布了,这次的命名有点奇怪,叫红米Note11TPro和红米Note11TPro。红米Note11TPro起售价为1699,红米Note11TPro的集邦咨询邱宇彬MiniLED有望带动新一波电视换屏潮,但在笔记本和平板领域面临压力每经记者安宇飞每经编辑董兴生5月24日,集邦咨询主办的2022新型显示产业研讨会在深圳召开。会上,集邦咨询研究部副总邱宇彬表示,MiniLED相较于OLED未来将有价格上的优势。在2998元起,中兴首款1亿像素手机Axon40Pro今日开售IT之家5月25日消息,中兴Axon40Pro于5月9日发布,售价2998元起,将于今日上午1000全渠道开售。8GB256GB版本售价2998元12GB256GB版本售价3298荣耀三款4nm新机,12512G高至7999,100倍变焦,能接受吗?在目前的国内手机市场销量中,荣耀这个品牌是最厉害的,荣耀CEO赵明已经表示,荣耀60荣耀X30等成为了市场爆款,在不久的将来,荣耀Magic系列也会成为高端机中销量冠军。听到这里后小米12Pro与vivoX80Pro全面对比有哪些优缺点?恰逢618大促活动,想买手机的朋友应该出手了。这两天,有几位朋友一直问我同样的一个问题,小米12Pro和vivoX80Pro应该买哪个比较好?对于这个问题,由于每个人的需求不同,所OPPOReno8系列售价及处理器配置哈喽,铁铁们,OPPOReno8系列已经发布,最终价格也是公布了,这里我给大家罗列出来,省的铁铁们一个一个对比。OPPOReno8售价及处理器配置此次OPPOReno8有三个型号,3款超值的天玑8100手机,618价格不到2000元,性能强悍可以闭眼买作为当前炙手可热的处理器天玑8100,在发布之初就深受消费者的关注,很多手机厂商都发布了搭载天玑8100芯片的手机。虽然天玑8100芯片性能强悍,但是各大手机厂商对待这款芯片的态度黑科技成吸粉密码人工智能自动驾驶智能交互5G技术运用在新能源汽车智能网联技术的发展下,智能化已经成为汽车市场消费趋势之一。消费者对于智能化产品需求不断提升,智能化体验成为重要的购车考虑因素,黑科技