专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

扒一扒Bean注入到Spring的那些姿势,你会几种?

  大家好,我是三友
  这篇文章我准备来扒一扒Bean注入到Spring的那些姿势。
  其实关于Bean注入Spring容器的方式网上也有很多相关文章,但是很多文章可能会存在以下常见的问题注入方式总结的不全没有分析可以使用这些注入方式背后的原因没有这些注入方式在源码中的应用示例。。。
  所以本文就带着解决上述的问题的目的来重新梳理一下Bean注入到Spring的那些姿势。配置文件
  配置文件的方式就是以外部化的配置方式来声明SpringBean,在Spring容器启动时指定配置文件。配置文件方式现在用的不多了,但是为了文章的完整性和连续性,这里我还是列出来了,知道的小伙伴可以自行跳过这节。
  配置文件的类型Spring主要支持xml和properties两种类型。xml
  在XmlBeanInjectionDemo。xml文件中声明一个class为类型为User的Beanlt;?xmlversion1。0encodingUTF8?beansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexmlnshttp:www。springframework。orgschemabeansxsi:schemaLocationhttp:www。springframework。orgschemabeanshttp:www。springframework。orgschemabeansspringbeans。xsdbeanclasscom。sanyou。spring。bean。injection。Userbeans复制代码
  UserDataToStringpublicclassUser{privateStringusername;}复制代码
  测试:publicclassXmlBeanInjectionDemo{publicstaticvoidmain(String〔〕args){ClassPathXmlApplicationContextapplicationContextnewClassPathXmlApplicationContext(classpath:XmlBeanInjectionDemo。xml);applicationContext。refresh();UseruserapplicationContext。getBean(User。class);System。out。println(user);}}复制代码
  结果:User(usernamenull)复制代码
  可以看出成功将User注入到Spring中,由于没有设置username属性值,所以是null。properties
  除了xml,spring还支持properties配置文件声明Bean的方式。
  如下,在PropertiesBeanInjectionDemo。properties文件中声明了class类型为User的Bean,并且设置User的username属性为sanyou。user。(class)com。sanyou。spring。bean。injection。Useruser。usernamesanyou复制代码
  测试:publicclassPropertiesBeanInjectionDemo{publicstaticvoidmain(String〔〕args){GenericApplicationContextapplicationContextnewGenericApplicationContext();创建一个PropertiesBeanDefinitionReader,可以从properties读取Bean的信息,将读到的Bean信息放到applicationContext中PropertiesBeanDefinitionReaderpropReadernewPropertiesBeanDefinitionReader(applicationContext);创建一个properties文件对应的Resource对象ResourceclassPathResourcenewClassPathResource(PropertiesBeanInjectionDemo。properties);加载配置文件propReader。loadBeanDefinitions(classPathResource);applicationContext。refresh();UseruserapplicationContext。getBean(User。class);System。out。println(user);}}复制代码
  结果:User(usernamesanyou)复制代码
  成功获取到User对象,并且username的属性为properties设置的sanyou。
  除了可以配置属性之外还支持其它的配置,如何配置可以查看PropertiesBeanDefinitionReader类上的注释。
  注解声明
  上一节介绍了通过配置文件的方式来声明Bean,但是配置文件这种方式最大的缺点就是不方便,因为随着项目的不断扩大,可能会产生大量的配置文件。为了解决这个问题,Spring在2。x的版本中开始支持注解的方式来声明Bean。ComponentComponentScan
  这种方式其实就不用多说,在项目中自定义的业务类就是通过Component及其派生注解(Service、Controller等)来注入到Spring容器中的。
  在SpringBoot环境底下,一般情况下不需要我们主动调用ComponentScan注解,因为SpringBootApplication会调用ComponentScan注解,扫描启动引导类(加了SpringBootApplication注解的类)所在的包及其子包下所有加了Component注解及其派生注解的类,注入到Spring容器中。
  Bean
  虽然上面ComponentComponentScan的这种方式可以将Bean注入到Spring中,但是有个问题那就是对于第三方jar包来说,如果这个类没加Component注解,那么ComponentScan就扫不到,这样就无法注入到Spring容器中,所以Spring提供了一种Bean的方式来声明Bean。
  比如,在使用MybatisPlus的分页插件的时候,就可以按如下方式这么来声明。BeanpublicMybatisPlusInterceptormybatisPlusInterceptor(){MybatisPlusInterceptorinterceptornewMybatisPlusInterceptor();interceptor。addInnerInterceptor(newPaginationInnerInterceptor(DbType。MYSQL));returninterceptor;}复制代码
  此时就能将MybatisPlusInterceptor这个Bean注入到Spring容器中。Import
  Import注解也可以用来将Bean注入到Spring容器中,Import注解导入的类可以分为三种情况:普通类类实现了ImportSelector接口类实现了ImportBeanDefinitionRegistrar接口普通类
  普通类其实就很简单,就是将Import导入的类注入到Spring容器中,这没什么好说的。类实现了ImportSelector接口publicinterfaceImportSelector{String〔〕selectImports(AnnotationMetadataimportingClassMetadata);NullabledefaultPredicateStringgetExclusionFilter(){returnnull;}}复制代码
  当Import导入的类实现了ImportSelector接口的时候,Spring就会调用selectImports方法的实现,获取一批类的全限定名,最终这些类就会被注册到Spring容器中。
  比如如下代码中,UserImportSelector实现了ImportSelector,selectImports方法返回User的全限定名publicclassUserImportSelectorimplementsImportSelector{OverridepublicString〔〕selectImports(AnnotationMetadataimportingClassMetadata){System。out。println(调用UserImportSelector的selectImports方法获取一批类限定名);returnnewString〔〕{com。sanyou。spring。bean。injection。User};}}复制代码
  当使用Import注解导入UserImportSelector这个类的时候,其实最终就会把User注入到Spring容器中,如下测试Import(UserImportSelector。class)publicclassImportSelectorDemo{publicstaticvoidmain(String〔〕args){AnnotationConfigApplicationContextapplicationContextnewAnnotationConfigApplicationContext();将ImportSelectorDemo注册到容器中applicationContext。register(ImportSelectorDemo。class);applicationContext。refresh();UseruserapplicationContext。getBean(User。class);System。out。println(user);}}复制代码
  运行结果User(usernamenull)复制代码
  对于类实现了ImportBeanDefinitionRegistrar接口的情况,这个后面说。
  一般来说,Import都是配合EnableXX这类注解来使用的,比如常见的EnableScheduling、EnableAsync注解等,其实最终都是靠Import来实现的。
  EnableScheduling
  EnableAsync
  讲完通过注解的方式来声明Bean之后,可以来思考一个问题,那就是既然注解方式这么简单,为什么Spring还写一堆代码来支持配置文件这种声明的方式?
  其实答案很简单,跟Spring的发展历程有关。Spring在创建之初Java还不支持注解,所以只能通过配置文件的方式来声明Bean,在Java1。5版本开始支持注解之后,Spring才开始支持通过注解的方式来声明Bean。注册BeanDefinition
  在说注册BeanDefinition之前,先来聊聊什么是BeanDefinition?
  BeanDefinition是SpringBean创建环节中很重要的一个东西,它封装了Bean创建过程中所需要的元信息。publicinterfaceBeanDefinitionextendsAttributeAccessor,BeanMetadataElement{设置BeanclassNamevoidsetBeanClassName(NullableStringbeanClassName);获取BeanclassNameNullableStringgetBeanClassName();设置是否是懒加载voidsetLazyInit(booleanlazyInit);判断是否是懒加载booleanisLazyInit();判断是否是单例booleanisSingleton();}复制代码
  如上代码是BeanDefinition接口的部分方法,从这方法的定义名称可以看出,一个Bean所创建过程中所需要的一些信息都可以从BeanDefinition中获取,比如这个Bean的class类型,这个Bean是否是懒加载,这个Bean是否是单例的等等,因为有了这些信息,Spring才知道要创建一个什么样的Bean。
  有了BeanDefinition这个概念之后,再来看一下配置文件和注解声明这些方式往Spring容器注入Bean的原理。
  Bean注入到Spring原理
  如图为Bean注入到Spring大致原理图,整个过程大致分为以下几个步骤通过BeanDefinitionReader组件读取配置文件或者注解的信息,为每一个Bean生成一个BeanDefinitionBeanDefinition生成之后,添加到BeanDefinitionRegistry中,BeanDefinitionRegistry就是用来保存BeanDefinition当需要创建Bean对象时,会从BeanDefinitionRegistry中拿出需要创建的Bean对应的BeanDefinition,根据BeanDefinition的信息来生成Bean当生成的Bean是单例的时候,Spring会将Bean保存到SingletonBeanRegistry中,也就是平时说的三级缓存中的第一级缓存中,以免重复创建,需要使用的时候直接从SingletonBeanRegistry中查找
  好了,通过以上分析我们知道,配置文件和注解声明的方式其实都是声明Bean的一种方式,最终都会转换成BeanDefinition,Spring是基于BeanDefinition的信息来创建Bean。
  既然Spring最终是基于BeanDefinition的信息来创建Bean,那么我们是不是可以跳过配置文件和注解声明的方式,直接通过手动创建和注册BeanDefinition的方式实现往Spring容器中注入呢?
  答案是可以的。
  前面说过,BeanDefinition最终会被注册到BeanDefinitionRegistry中,那么如何拿到BeanDefinitionRegistry呢?主要有以下两种方式:ImportBeanDefinitionRegistrarBeanDefinitionRegistryPostProcessorImportBeanDefinitionRegistrar
  上面在说Import的时候,关于导入的类实现了ImportBeanDefinitionRegistrar接口的情况没有说,主要是因为在这里说比较合适publicinterfaceImportBeanDefinitionRegistrar{defaultvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry,BeanNameGeneratorimportBeanNameGenerator){registerBeanDefinitions(importingClassMetadata,registry);}defaultvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){}}复制代码
  ImportBeanDefinitionRegistrar中有两个方法,方法的参数就是BeanDefinitionRegistry。当Import导入的类实现了ImportBeanDefinitionRegistrar接口之后,Spring就会调用registerBeanDefinitions方法,传入BeanDefinitionRegistry。
  来个Demo
  UserImportBeanDefinitionRegistrar实现ImportBeanDefinitionRegistrarpublicclassUserImportBeanDefinitionRegistrarimplementsImportBeanDefinitionRegistrar{OverridepublicvoidregisterBeanDefinitions(AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry,BeanNameGeneratorimportBeanNameGenerator){构建一个BeanDefinition,Bean的类型为UserAbstractBeanDefinitionbeanDefinitionBeanDefinitionBuilder。rootBeanDefinition(User。class)设置User这个Bean的属性username的值为三友的java日记。addPropertyValue(username,三友的java日记)。getBeanDefinition();把User的BeanDefinition注入到BeanDefinitionRegistry中registry。registerBeanDefinition(user,beanDefinition);}}复制代码
  测试类Import(UserImportBeanDefinitionRegistrar。class)publicclassUserImportBeanDefinitionRegistrarDemo{publicstaticvoidmain(String〔〕args){AnnotationConfigApplicationContextapplicationContextnewAnnotationConfigApplicationContext();applicationContext。register(UserImportBeanDefinitionRegistrarDemo。class);applicationContext。refresh();UseruserapplicationContext。getBean(User。class);System。out。println(user);}}复制代码
  结果User(username三友的java日记)复制代码
  从结果可以看出,成功将User注入到了Spring容器中。
  上面的例子中有行代码applicationContext。register(UserImportBeanDefinitionRegistrarDemo。class);复制代码
  这行代码的意思就是把UserImportBeanDefinitionRegistrarDemo这个Bean注册到Spring容器中,所以这里其实也算一种将Bean注入到Spring的方式,原理也跟上面一样,会为UserImportBeanDefinitionRegistrarDemo生成一个BeanDefinition注册到Spring容器中。BeanDefinitionRegistryPostProcessor
  除了ImportBeanDefinitionRegistrar可以拿到BeanDefinitionRegistry之外,还可以通过BeanDefinitionRegistryPostProcessor拿到BeanDefinitionRegistry
  BeanDefinitionRegistryPostProcessor
  这种方式就不演示了。
  手动注册BeanDefinition这种方式还是比较常见的。就比如说OpenFeign在启用过程中,会为每个标注了FeignClient注解的接口创建一个BeanDefinition,然后再往Spring中的注册的,如下是OpenFeign注册FeignClient的部分代码classFeignClientsRegistrarimplementsImportBeanDefinitionRegistrar,ResourceLoaderAware,EnvironmentAware{privatevoidregisterFeignClient(BeanDefinitionRegistryregistry,AnnotationMetadataannotationMetadata,MapString,Objectattributes){构建BeanDefinition,class类型为FeignClientFactoryBeanBeanDefinitionBuilderdefinitionBeanDefinitionBuilder。genericBeanDefinition(FeignClientFactoryBean。class);StringaliascontextIdFeignClient;AbstractBeanDefinitionbeanDefinitiondefinition。getBeanDefinition();BeanDefinitionHolderholdernewBeanDefinitionHolder(beanDefinition,className,newString〔〕{alias});注册BeanDefinitionBeanDefinitionReaderUtils。registerBeanDefinition(holder,registry);}}复制代码注册创建完成的Bean
  上一节说可以跳过配置文件或者是注解,直接通过注册BeanDefinition以达到将Bean注入到Spring中的目的。
  既然已经可以跳过配置文件或者是注解,那么我们可不可以更激进一步,跳过注册BeanDefinition这一步,直接往Spring中注册一个已经创建好的Bean呢?
  答案依然是可以的。
  因为上面在提到当创建的Bean是单例的时候,会将这个创建完成的Bean保存到SingletonBeanRegistry中,需要用到直接从SingletonBeanRegistry中查找。既然最终是从SingletonBeanRegistry中查找的Bean,那么直接注入一个创建好的Bean有什么不可以呢?
  既然可以,那么如何拿到SingletonBeanRegistry呢?
  其实拿到SingletonBeanRegistry的方法其实很多,因为ConfigurableListableBeanFactory就继承了SingletonBeanRegistry接口,所以只要能拿到ConfigurableListableBeanFactory就相当于拿到了SingletonBeanRegistry。
  ConfigurableListableBeanFactory类图
  而ConfigurableListableBeanFactory可以通过BeanFactoryPostProcessor来获取
  BeanFactoryPostProcessor
  来个Demo
  RegisterUserBeanFactoryPostProcessor实现BeanFactoryPostProcessor,往Spring容器中添加一个手动创建的User对象publicclassRegisterUserBeanFactoryPostProcessorimplementsBeanFactoryPostProcessor{OverridepublicvoidpostProcessBeanFactory(ConfigurableListableBeanFactorybeanFactory)throwsBeansException{创建一个User对象UserusernewUser();user。setUsername(三友的java日记);将这个User对象注入到Spring容器中beanFactory。registerSingleton(user,user);}}复制代码
  测试publicclassRegisterUserDemo{publicstaticvoidmain(String〔〕args){AnnotationConfigApplicationContextapplicationContextnewAnnotationConfigApplicationContext();applicationContext。register(RegisterUserBeanFactoryPostProcessor。class);applicationContext。refresh();UseruserapplicationContext。getBean(User。class);System。out。println(user);}}复制代码
  结果User(username三友的java日记)复制代码
  从结果还是可以看出,成功从Spring容器中获取到了User对象。
  这种直接将创建好的Bean注入到Spring容器中在Spring框架内部使用的还是比较多的,Spring的一些内建的Bean就是通过这个方式注入到Spring中的。
  如上图,在SpringBoot项目启动的过程中会往Spring容器中添加两个创建好的Bean,如果你的程序需要使用到这些Bean,就可以通过依赖注入的方式获取到。
  虽然基于这种方式可以将Bean注入到Spring容器,但是这种方式注入的Bean是不经过Bean的生命周期的,也就是说这个Bean中诸如Autowired等注解和Bean生命周期相关的回调都不会生效的,注入到Spring时Bean是什么样就是什么样,Spring不做处理,仅仅只是做一个保存作用。FactoryBean
  FactoryBean是一种特殊的Bean的类型,通过FactoryBean也可以将Bean注入到Spring容器中。
  FactoryBean
  当我们通过配置文件、注解声明或者是注册BeanDenifition的方式,往Spring容器中注入了一个class类型为FactoryBean类型的Bean时候,其实真正注入的Bean类型为getObjectType方法返回的类型,并且Bean的对象是通过getObject方法返回的。
  来个Demo
  UserFactoryBean实现了FactoryBean,getObjectType返回了User类型,所以这个UserFactoryBean会往Spring容器中注入User这个Bean,并且User对象是通过getObject()方法的实现返回的。publicclassUserFactoryBeanimplementsFactoryBeanUser{OverridepublicUsergetObject()throwsException{UserusernewUser();user。setUsername(三友的java日记);returnuser;}OverridepublicClasslt;?getObjectType(){returnUser。class;}}复制代码
  测试publicclassUserFactoryBeanDemo{publicstaticvoidmain(String〔〕args){AnnotationConfigApplicationContextapplicationContextnewAnnotationConfigApplicationContext();将UserFactoryBean注入到Spring容器中applicationContext。register(UserFactoryBean。class);applicationContext。refresh();UseruserapplicationContext。getBean(User。class);System。out。println(user);}}复制代码
  结果User(username三友的java日记)复制代码
  成功通过UserFactoryBean将User这个Bean注入到Spring容器中了。
  FactoryBean这中注入的方式使用也是非常多的,就拿上面举例的OpenFeign来说,OpenFeign为每个FeignClient的接口创建的BeanDefinition的Bean的class类型FeignClientFactoryBean就是FactoryBean的实现。classFeignClientFactoryBeanimplementsFactoryBeanObject,InitializingBean,ApplicationContextAware{FeignClient接口类型privateClasslt;?type;OverridepublicObjectgetObject()throwsException{returngetTarget();}OverridepublicClasslt;?getObjectType(){returntype;}}复制代码
  getObject()方法就会返回接口的动态代理的对象,并且这个代理对象是由Feign创建的,这也就实现了Feign和Spring的整合。总结
  通过以上分析可以看出,将Bean注入到Spring容器中大致可以分为5类:配置文件注解声明注册BeanDefinition注册创建完成的BeanFactoryBean
  以上几种注入的方式,在日常业务开发中,基本上都是使用注解声明的方式注入Spring中的;在第三方框架在和Spring整合时,注册BeanDefinition和FactoryBean这些注入方式也会使用的比较多;至于配置文件和注册创建完成的Bean的方式,有但是不多。
  最后,本文所有的示例代码地址:
  github。comsanyou3spr
  最后,如果本篇文章对你有点帮助,还请帮忙点赞、在看、转发、非常感谢。

一位退休老领导向我谈起了李少莉副局长风波,让人佩服得五体投地一位老领导已经退休五年了,逢年过节我都会去看望他。就在今天中午,我正在吃饭的时候,突然接到他的电话,我匆匆放下碗筷,还以为他有什么紧急事情,结果不为别的,向我聊起了副局长李少莉的事新时代中的李少莉穿着打扮,对于普通人来说,并不讲究,因人而异。对于一些职业来说,有基本的要求,但对于公职人员来说,穿着有时候过于敏感。因为他们是人民的代表,朴素些较好,朴素代表节俭,代表一种精神!税务总局加大留底退税力度重拳打击骗税行为今年,国家税务总局推出了新的组合式税费支持政策,可分为减税退税缓税三个方面。减税方面,包括支持中小微企业发展企业创新发展民生发展保障疫情防控生态文明建设五类政策退税方面,主要是将先深圳600元廉租房里最难堪的一幕,炸出了多少伪穷人01hr前段时间,广东深圳,一位房产中介发出的租房视频引起了热议。这是位于城中村的一个小小单间,进门后需要架上一个梯子才能爬上去。房间里有一张床,床的旁边就是马桶和淋浴区,墙上安装第23个中国记者节河南日报社与中国记协推出联名海报大河网讯(记者祝传鹏)千里江山图将新时代的出彩成就幸福图景红色传承等巧妙嵌入串珠成链,展现了一幅千里江山新画图。顶瞰河南为你戴上河南一号同款卫星眼镜,从太空俯瞰奋进中的河南,直观感时报观察丨北证50指数渐近,北交所改革蹄疾步稳点蓝字关注,不迷路北交所开市即将满一周年,按惯例,北证50指数也将上线。北证50指数样本股名单日前已公布,实时行情则将于11月21日正式发布。该指数的推出,将为市场引入更多增量资金中国足球的悲哀!中甲一俱乐部因拖欠赛区费用而被停止伙食供应由于赛区欠费用,淄博蹴鞠被停止伙食近日,中国联赛俱乐部欠薪问题愈演愈烈,河北队球队赛场公开讨薪,足协为督促俱乐部偿还欠薪已对中超河北队武汉长江队以及中乙的湖南湘涛进行了联赛扣分,可南方路机上市首日换手率5成募资6。4亿兴业证券保荐中国经济网北京11月8日讯南方路机(603280。SH)今日上市,盘中巨量换手,最低报28。50元。截至收盘,南方路机涨停,报34。20元,涨幅44。00,成交额4。56亿元,换手喜报!湖南在第二届全国退役军人创业创新大赛决赛中再获佳绩第二届全国退役军人创业创新大赛决赛在四川成都举办。红网时刻新闻11月8日讯(通讯员李桂林)11月4日,第二届全国退役军人创业创新大赛决赛在四川成都落下帷幕。湖南省退役军人事务厅喜获美国中期选举是全世界最烧钱游戏,索罗斯以1。285亿捐助拔得头筹头条创作挑战赛根据美国政治捐献数据库无党派机构OpenSecrets预测,本次中期选举的竞选总花费将超过167亿美元,称得上全世界最烧钱的游戏。而世界银行统计的去年阿富汗全年GDP商务部中国将继续坚持开放的能源发展道路新华社北京11月8日电(记者谢希瑶邹多为)商务部副部长盛秋平8日表示,党的二十大报告强调坚持高水平对外开放不断以中国新发展为世界提供新机遇。中国将继续坚持开放的能源发展道路,中国能
华为双11诚意给足了,六颗镜头100W快充,已从3499元降到2149元对于现在喜欢华为手机的用户来讲,可以选择的机型虽然不多,但也不是没得选,这其中也不乏一些优质手机,有精力的可以试着抢购一下华为Mate50Pro,预算不足的也可以体验一下华为nov秋韵张掖中院干警镜头里的诗和远方秋天是一个充满诗意的季节一到秋天,淡淡的金黄,满满的丰收,都是秋的味道。张掖中院的干警们,工作时都是满脸严肃的汉子,但闲暇之时,脱下笔挺的制服,放下手中的纸笔,拿起相机和手机,玩起深圳的秋日浪漫,她们占了一半秋风有信花开有期深圳的浪漫还在继续看过粉色的格桑金色的向日葵秋日的心动还有簕杜鹃看到大片的花海只会对准镜头拍拍拍?快来和奥一君一起get这些机位记录秋日美好吧01。盐田区政府公交站浙江财经大学考研怎么样?浙江财经大学是一所经济学科和管理学科特色明显,办学优势突出的多科性教学研究型省属财经大学。学校坐落在浙江省会城市杭州市,前身是创建于1974年的浙江财政银行学校,1987年经原国家审核为违规的作品有三种处理方式第一是先修改,有些字是违规的,如白日依山近,黄河入海流里日入都是诱导色情的,另外死亡等也是违规的,尽量不写,写日时可写太阳,写入可用进去替代。第二是申请人工复核,一般是真没违规会人早上好图片正能量语录用今天的酣畅淋漓,换明天的美好际遇只有不断攀登,才能刷新新的高度。周末,早上好!做最单纯的人吧,走最幸福的路。相信追逐阳光的人,总会收获到满满的阳光追逐快乐的人,将会开启满满正能量的一天。周末,早上好!当你把安全感中国的宝贵经验为其他国家提供重要借鉴中共二十大不仅是中国和中国人民的大事,也备受世界瞩目。中国取得的成功进一步彰显了社会主义道路的正确性和社会主义制度的优越性。中国的宝贵经验为其他国家提供重要借鉴,尤其是那些正在寻找中国产粮第一大省秋粮收购有序展开中国产粮第一大省秋粮收购有序展开新华网10月28日,在中央储备粮哈尔滨直属库有限公司,工作人员用扦样器对新收购入库的水稻进行取样,以便后续检测以了解其水分杂质以及虫害等情况。10月中国平安稳步提升股东回报中期派息约98亿元近10年分红2383。72亿元中证网讯(记者齐金钊)日前,中国平安派发中期现金红利,本次每股派发现金红利0。92元(含税,人民币),参与分配的A股股份数约106。60亿股,合计派发股息累计约98亿元。近年来,由外籍专家眼中的二十大报告丨英文语言专家肖恩对中国未来充满期待参与二十大报告翻译润色工作的外籍专家,也是报告的第一读者。来自爱尔兰的英文语言专家肖恩表示,通过此次翻译工作,他对中国共产党的理念有了更深入的理解,对中国未来的发展充满期待。对于首俄寻求稳生产促能源贸易来源经济日报俄罗斯能源周国际论坛日前在俄首都莫斯科举行。本届论坛主题为多极世界中的全球能源,来自80多个国家的3000多名代表参会。在乌克兰危机和欧洲能源危机背景下,本届论坛更受关
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网