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

GraalVM实践image与springnative

  native-image
  GraalVM是从main方法开始分析,所有可达的类和方法会被记录。
  但是反射、动态代理、资源文件等无法通过简单的静态分析捕获,为了支持这部分代码的行为,GraalVM支持配置文件来支持JIT时常用的做法。
  GraalVM推荐在"META-INF/native-image/"(或子文件夹,如为避免不同jar下的配置冲突,放在"META-INF/native-image/{groupId}/{artifactId}/")下的native-image.properties来形成构建本地代码所需要的命令行参数。native-images.properties一般包含哪些类可以在构建时初始化(--initialize-at-build-time),哪些只能运行时初始化(--initialize-at-run-time)。
  有被JDK动态代理的接口,可以记录到proxy-config.json,比如MyBatis的SqlSession,Spring的Component等注解。
  有JNI调用的类,可以记录到jni-config.json,比如sun.instrument.InstrumentationImpl。
  有要被反射调用的,可以记录到reflect-config.json,比如我们的Mapper要被MyBatis代理,要求Mapper接口的方法可以被反射查询到,参数和返回要被反射调用getter/setter来取值/设置值。
  有资源文件,可以记录到resource-config.json,比如messages.properties这种国际化资源、application.proeprties这种应用配置以及MyBatis的Mapper文件等等。
  还有序列化相关的,可以记录到serialization-config.json。
  这些配置文件可以通过GraalVM提供的native-image-agent来自动生成绝大部分内容:-agentlib:native-image-agent=config-output-dir=path/file
  然而,native-image.properties却不会自动生成,需要我们手动添加。如果不想使用默认的配置文件名,可以在修改文件名后(比如proxy-config.json改成proxy.json,甚至放在子文件夹下),使用参数告知graalvm。native-image.properties示例如下:Args = --allow-incomplete-classpath  --initialize-at-build-time=org.slf4j.Logger,org.slf4j.LoggerFactory,org.slf4j.MDC  -J--add-exports=java.management/sun.management=ALL-UNNAMED  -H:DynamicProxyConfigurationResources=${.}/proxy.json  -H:ReflectionConfigurationResources=${.}/reflect.json  -H:ResourceConfigurationResources=${.}/resource.json  -Dsys.propspring-native
  那么spring-native给我们带来了哪些便利呢?
  spring-native提供了诸多注解,帮助我们生成GraalVM所规范的配置。
  比如InitializationHint注解可以生成native-image.properties里的--initialize-at-build-time"、"--initialize-at-run-time"。
  比如JdkProxyHint注解可以生成proxy-config.json的内容。
  比如ResourceHint注解可以生成resource-config.json内容。
  比如SerializationHint注解生成serialization-config.json需要的序列化/反序列化内容。
  比如TypeHint注解(明细配置可结合FieldHint和MethodHint)生成reflect-config.json需要的哪些字段/方法可被反射调用。
  介绍过开胃菜,接下来就是正式的大餐:IoC和AOP。
  我们知道spring提供了xml、java代码、java注解等多种配置方式,帮助我们生成bean对象、查找并注入依赖、增强bean。而spring-boot提供了自动配置,开启约定大于配置,让我们无需在每次新建系统时重复配置。
  spring-native针对这些功能,结合GraalVM的特点,为我们生成代码,来接好spring/spring-boot的岗位。spring-native会自动为每个存在依赖注入的包生成ContextBootstrapInitializer类,为每个类生成register前缀与类名组合的方法。方法内容大致可表示如下:public final class ContextBootstrapInitializer { 	public static void register${klazz.simpleName}(DefaultListableBeanFactory beanFactory) { 		BeanDefinitionRegistrar.of("${beanName}", ${klazz.simpleName}.class) 			.instanceSupplier((instanceContext) -> { 			${klazz.simpleName} bean = new ${klazz.simpleName}(); 			instanceContext.field("${field.name}", ${field.class.simpleName}.class) 				.invoke(beanFactory, (attributes) -> { 					Field ${field.name}Field = ReflectionUtils.findField(${klazz.simpleName}.class, "${field.name}", ${field.class.simpleName}.class);                 				ReflectionUtils.makeAccessible(${field.name}Field);                 				ReflectionUtils.setField(${field.name}Field, bean, attributes.get(0)); 			}); 			}) 	} }
  对于spring-boot的autoconfiguration,在满足条件时,同样生成ContextBootstrapInitializer。对于各个jar包下的spring.factories文件,在"org.springframework.aot"下生成StaticSpringFactories,将类型和生成对象方式保存,以供后续使用。
  在org.springframework.aot包下还生成了ContextBootstrapInitializer,与应用定义bean的不同之处在于,此类实现了ApplicationContextInitializer。
  在SpringApplication构造时,通过生成的SpringFactoriesLoader加载类型及对应的对象(非AOT模式为加载spring.factories,AOT模式为StaticSpringFactories),引起初始化,大致代码如下:public class ContextBootstrapInitializer implements ApplicationContextInitializer {   private ImportAwareBeanPostProcessor createImportAwareBeanPostProcessor() {     Map mappings = new LinkedHashMap<>();     mappings.put("org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration", "ml.iamwhatiam.baostock.Application");     mappings.put("org.springframework.cache.annotation.ProxyCachingConfiguration", "ml.iamwhatiam.baostock.Application");     return new ImportAwareBeanPostProcessor(mappings);   }    @Override   public void initialize(GenericApplicationContext context) {     // infrastructure     DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory();     beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());     beanFactory.addBeanPostProcessor(createImportAwareBeanPostProcessor());      BeanDefinitionRegistrar.of("${mainClass.name}", ${mainClass.simpleName}.class)         .instanceSupplier(${mainClass.simpleName}::new).register(beanFactory);     ${groupId}.${artifactId}.ContextBootstrapInitializer.register${klazz.simpleName}(beanFactory);     BeanDefinitionRegistrar.of("org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor", ConfigurationPropertiesBindingPostProcessor.class)         .instanceSupplier(ConfigurationPropertiesBindingPostProcessor::new).customize((bd) -> bd.setRole(2)).register(beanFactory);     // other EnableAutoConfiguration bean     org.springframework.boot.autoconfigure.cache.ContextBootstrapInitializer.registerSimpleCacheConfiguration(beanFactory);     } }
  当然,并非所有的自动配置类其类型都是公开的("class XXAutoconfiguration",而不是"public class XXAutoConfiguration"),对于这种情况,spring-native为他们在同包名下生成_FactoryProvider类,该静态方法名为类型名,返回该类型。
  还有些bean的类型,其构造函数是私有的,spring-native为其生成内部类来创建实例。
  至此,当spring-boot的SpringApplication运行时,创建完DefaultBootstrapContext便由"org.springframework.aot"下的ContextBootstrapInitializer进行初始化,此时便会将各种bean及其生成方式注册到spring的上下文。

自动驾驶产业动态高瓴领投仿真软件,宏景智驾完成亿元融资2022年Q1,自动驾驶领域投融资热度不减。本周,智能驾驶企业宏景智驾宣布完成新一轮超亿元融资。沙特阿美旗下的风险投资基金Prosperity7独家投资。宏景智驾成立于2018年5东数西算助推PE投资加码IDC头部企业完成6。2亿美元融资红杉淡马锡等入局科创板日报(记者敖瑾)讯,近日,数据中心运营商和服务商万国数据,宣布定向发行新一轮6。2亿美元的可转换有限债券,由红杉中国新基建基金STTelemediaGlobalDataCen客观讲,麒麟980和骁龙845,哪个性能更好?各有千秋!客观上讲确定不被爱国绑架?抛开爱国情怀高通845直甩麒麟数条街,说了句实话不喜勿喷感谢您的阅读!安兔兔已经修复了华为mate20pro跑分过高的Bug,原本31万左右的跑颜值出众,独特可视化编程,一键连击!PXN莱仕达P50游戏手柄体验导读对笔者而言,每天都离不开的高频游戏设备就是键鼠手柄显示器这些产品。如今玩游戏的方式多种多样,而以手柄来说,它可以大幅提升玩家对于物理控制的感受,良好操控性也是键鼠所不可比拟的,中科大制备出大面积天蓝光钙钛矿LED记者2月23日从中国科学技术大学获悉,该校肖正国教授课题组近期通过刮涂法成功制备出大面积高效率的天蓝光钙钛矿LED,向钙钛矿LED照明的商业应用迈进重要一步。相关成果2月18日发表熵增的世界一地球这个世界是个高度依赖太阳熵增的逆熵湖泊。作为碳基生物的人类,在地球物种中是能够依靠熵增实现熵增定向流动的能力最大的种群。定义为逆熵指数(后面我都会直接写逆熵指数)。每个人的都是突发!世界首富马斯克及兄弟被调查,因高位抛售股票套现数十亿美元中国经济周刊经济网讯据媒体报道,埃隆马斯克及其弟弟金博尔马斯克因可能涉嫌内部交易遭到美国证券交易委员会(SEC)调查。据悉,在马斯克在社交媒体上问计7200万粉丝是否要出售10特斯不小心删除了微信聊天记录,应该怎么恢复?有哪些好用的软件?日常的生活中,我们经常的会选择使用我们的手机微信去进行一些交流,可能由于个人习惯的问题,我们有的时候可能也会在上面讨论一些工作上的事情。技巧一备份恢复我们若是删除了自己的手机微信聊中国电信的网络一年多少钱?哈尔滨安电信光纤必须和手机号强制捆绑要不就安不了而且还必须一次签两年合约合约期不能升网速不能拆机特别的流氓100M每个月129我用的是歌华电信机顶盒,买两年送一年1360,我还是去科技赋能,一起向未来来源人民网人民日报海外版未来感满满的开幕式,科技范十足的竞赛场,黑科技加持的运动装备,新技术带来的全新观赛体验刚刚结束的北京2022年冬奥会,科技点燃冰雪,新技术大放异彩。奔涌的科造车新势力联手扩张理想蔚来共同投了一家电池公司科创板日报(记者陈美)讯,产业资产正不断延伸触角。2月24日,欣旺达发布公告,欣旺达电动汽车电池有限公司增资24。3亿元。其中,车和家蔚瑞投资领投,上汽金石碧桂园创投深圳创新投资等
2021高通XR挑战赛技术分享移动端VR实现高仿真渲染(映维网2021年10月11日)由高通公司(Qualcomm)携手XR产业链众多合作伙伴共同打造的2021高通XR生态合作伙伴大会已于2021年9月23日在青岛金沙滩希尔顿酒店举行建筑公司东急建设用Hololens2Azure远程渲染提高建筑施工生产率查看引用信息源请点击映维网提高质量消除不必要的成本提高生产率,并保持自己在建筑技术方面的领先地位(映维网2021年10月13日)除非你是训练有素的建筑工程师,否则单纯依靠一张二维设苹果前员工被刑事调查!被起诉泄露机密项目ProjectX,传与AR有关查看引用信息源请点击映维网这个ProjectX可能是ARVR硬件(映维网2021年10月11日)苹果最初在今年3月因涉嫌向媒体泄密产品信息而起诉前材料主管西蒙兰卡斯特(SimonL苏宁618快消总榜酒水销售暴增79,生鲜零食销售火爆6月18日准点赴约,苏宁618的火爆局面从凌晨零点的第一秒就开始呈现了。在零点过后的第一个小时里,苏宁酒水销售同比增长达到79,在快消板块中成绩突出。截至18日早晨9点,白酒板块茅鸿蒙OS核试验已经启动,横空出世不再遥远在曾经很长一段时间中,华为打造的鸿蒙OS都被人诟病套娃安卓换汤不换药等等,但随着时间的一步步推进,越来越多的人发现鸿蒙OS与安卓有着本质上的区别。经过了两年多的迭代进化,如今的鸿蒙余承东转行老司机,这车一定不是去幼儿园的大家都熟悉绰号大嘴的余承东了,华为手机的崛起跟他密不可分,也可以说余承东见证了华为手机最辉煌的时代。而最近业内传出爆炸性的大新闻,华为内部重大人事变动之中出现了余承东的名字,这回他璀璨高颜值的Vlog摄影神器荣耀50系列起售价2699元起荣耀50眼下618正在火热举行,诸多上半年旗舰都迎来了价格下调,打算冲击一波销量,但荣耀所走的战略不同,是赶在618之前发布了一款新机荣耀50系列。该机在开始预热时就已经得到了社会苏宁红孩子迎来17岁生日,开启周年大回馈好物低至17元不知不觉间,苏宁红孩子已经17岁了,在这17年里,秉持着全方位可信赖的母婴专家的信念,苏宁红孩子为广大宝妈宝爸们提供了全渠道全品类衣食玩乐购教学一站式服务,也为千万中国家庭解决了各直播行业污秽横流,国家何时对臭鱼烂虾动手?网红直播可以说是冉冉升起的朝阳产业,自大2020年疫情肆虐之初借着宅经济一路蹿红,如今直播行业可以说是遍地开花,不管什么阿猫阿狗都能在直播平台上show一下自己的姿势。当然,越是这6万研究生17万本科生送外卖,文凭是否被辜负?刚看到一张图片,6万研究生17万本科生送外卖,大学生与文凭,到底谁辜负了谁。这数据不是空穴来风,是真有出处。原来的外卖小哥可能还是初高中毕业的农二代为主,现在的小哥平均学历大幅上扬七月,一个做股票配资的跟我聊了一个月最近股市涨涨跌跌的,搞得大家的心情也跌宕起伏,都是小涨几天猛然来个大跌,踩准节拍的一个月赚了一年的薪水,踩不对的新韭菜抑或踏空的老韭菜暗自伤悲。心情基本如下图踩准的在左半边,踩不准