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

将Bean放入Spring容器中的五种方式

  我们知道平时在开发中使用Spring的时候,都是将对象交由Spring去管理,那么将一个对象加入到Spring容器中,有哪些方式呢,下面我就来总结一下  1、@Configuration + @Bean
  @Configuration用来声明一个配置类,然后使用 @Bean 注解,用于声明一个bean,将其加入到Spring容器中。具体代码如下:  @Configuration public class MyConfiguration {     @Bean     public Person person() {         Person person = new Person();         person.setName("spring");         return person;     } } 2、@Componet + @ComponentScan
  这种方式也是我们用的比较多的方式,@Componet中文译为组件,放在类名上面,然后@ComponentScan放置在我们的配置类上,然后可以指定一个路径,进行扫描带有@Componet注解的bean,然后加至容器中。具体代码如下:  @Component public class Person {     private String name;      public String getName() {               return name;     }     public void setName(String name) {         this.name = name;     }     @Override     public String toString() {         return "Person{" +                 "name="" + name + """ +                 "}";     } }  @ComponentScan(basePackages = "com.springboot.initbean.*") public class Demo1 {     public static void main(String[] args) {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);         Person bean = applicationContext.getBean(Person.class);         System.out.println(bean);     } }
  结果输出:  Person{name="null"}
  表示成功将Person放置在了IOC容器中。  3、@Import注解导入
  前两种方式,大家用的可能比较多,也是平时开发中必须要知道的,@Import注解用的可能不是特别多了,但是也是非常重要的,在进行Spring扩展时经常会用到,它经常搭配自定义注解进行使用,然后往容器中导入一个配置文件。关于@Import注解,我会多介绍一点,它有四种使用方式。这是@Import注解的源码,表示只能放置在类上。  @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Import {      /**    * 用于导入一个class文件      * {@link Configuration @Configuration}, {@link ImportSelector},      * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.      */      Class<?>[] value();  } 3.1 @Import直接导入类
  代码示例如下:  public class Person {     private String name;      public String getName() {               return name;     }           public void setName(String name) {         this.name = name;     }           @Override     public String toString() {         return "Person{" +                 "name="" + name + """ +                 "}";     } } /** * 直接使用@Import导入person类,然后尝试从applicationContext中取,成功拿到 **/ @Import(Person.class) public class Demo1 {      public static void main(String[] args) {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);         Person bean = applicationContext.getBean(Person.class);         System.out.println(bean);     } }
  上述代码直接使用@Import导入了一个类,然后自动的就被放置在IOC容器中了。注意 我们的Person类上 就不需要任何的注解了,直接导入即可。  3.2 @Import + ImportSelector
  其实在@Import注解的源码中,说的已经很清楚了,感兴趣的可以看下,我们实现一个ImportSelector的接口,然后实现其中的方法,进行导入。
  代码如下:  @Import(MyImportSelector.class) public class Demo1 {      public static void main(String[] args) {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);         Person bean = applicationContext.getBean(Person.class);         System.out.println(bean);     } }  class MyImportSelector implements ImportSelector {     @Override     public String[] selectImports(AnnotationMetadata importingClassMetadata) {         return new String[]{"com.springboot.pojo.Person"};     } }
  我自定义了一个 MyImportSelector 实现了 ImportSelector 接口,重写selectImports 方法,然后将我们要导入的类的全限定名写在里面即可,实现起来也是非常简单。  3.3 @Import + ImportBeanDefinitionRegistrar
  这种方式也需要我们实现 ImportBeanDefinitionRegistrar 接口中的方法,具体代码如下:  @Import(MyImportBeanDefinitionRegistrar.class) public class Demo1 {      public static void main(String[] args) {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);         Person bean = applicationContext.getBean(Person.class);         System.out.println(bean);     } }  class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {      @Override     public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {         // 构建一个beanDefinition, 关于beanDefinition我后续会介绍,可以简单理解为bean的定义.         AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();         // 将beanDefinition注册到Ioc容器中.         registry.registerBeanDefinition("person", beanDefinition);     } }
  上述实现其实和Import的第二种方式差不多,都需要去实现接口,然后进行导入。接触到了一个新的概念,BeanDefinition,可以简单理解为bean的定义(bean的元数据),也是需要放在IOC容器中进行管理的,先有bean的元数据,applicationContext再根据bean的元数据去创建Bean。  3.4 @Import + DeferredImportSelector
  这种方式也需要我们进行实现接口,其实它和@Import的第二种方式差不多,DeferredImportSelector 它是 ImportSelector 的子接口,所以实现的方法和第二种无异。只是Spring的处理方式不同,它和Spring Boot中的自动导入配置文件 延迟导入有关,非常重要。使用方式如下:  @Import(MyDeferredImportSelector.class) public class Demo1 {     public static void main(String[] args) {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);         Person bean = applicationContext.getBean(Person.class);         System.out.println(bean);     } } class MyDeferredImportSelector implements DeferredImportSelector {     @Override     public String[] selectImports(AnnotationMetadata importingClassMetadata) {         // 也是直接将Person的全限定名放进去         return new String[]{Person.class.getName()};     } }
  关于@Import注解的使用方式,大概就以上三种,当然它还可以搭配@Configuration注解使用,用于导入一个配置类。  4、使用FactoryBean接口
  FactoryBean接口和BeanFactory千万不要弄混了,从名字其实可以大概的区分开,FactoryBean, 后缀为bean,那么它其实就是一个bean, BeanFactory,顾名思义 bean工厂,它是IOC容器的顶级接口,这俩接口都很重要。代码示例:  @Configuration public class Demo1 {     @Bean     public PersonFactoryBean personFactoryBean() {         return new PersonFactoryBean();     }      public static void main(String[] args) {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Demo1.class);         Person bean = applicationContext.getBean(Person.class);         System.out.println(bean);     } }  class PersonFactoryBean implements FactoryBean {      /**      *  直接new出来Person进行返回.      */     @Override     public Person getObject() throws Exception {         return new Person();     }     /**      *  指定返回bean的类型.      */     @Override     public Class<?> getObjectType() {         return Person.class;     } }
  上述代码,我使用@Configuration + @Bean的方式将 PersonFactoryBean 加入到容器中,注意,我没有向容器中注入 Person, 而是直接注入的 PersonFactoryBean 然后从容器中拿Person这个类型的bean,成功运行。  5、使用 BeanDefinitionRegistryPostProcessor
  其实这种方式也是利用到了 BeanDefinitionRegistry,在Spring容器启动的时候会执行 BeanDefinitionRegistryPostProcessor 的 postProcessBeanDefinitionRegistry 方法,大概意思就是等beanDefinition加载完毕之后,对beanDefinition进行后置处理,可以在此进行调整IOC容器中的beanDefinition,从而干扰到后面进行初始化bean。
  具体代码如下:  public class Demo1 {     public static void main(String[] args) {         AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();         MyBeanDefinitionRegistryPostProcessor beanDefinitionRegistryPostProcessor = new MyBeanDefinitionRegistryPostProcessor();         applicationContext.addBeanFactoryPostProcessor(beanDefinitionRegistryPostProcessor);         applicationContext.refresh();         Person bean = applicationContext.getBean(Person.class);         System.out.println(bean);     } }  class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {      @Override     public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {         AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.rootBeanDefinition(Person.class).getBeanDefinition();         registry.registerBeanDefinition("person", beanDefinition);     }     @Override     public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {           } }
  上述代码中,我们手动向beanDefinitionRegistry中注册了person的BeanDefinition。最终成功将person加入到applicationContext中,上述的几种方式的具体原理,我后面会进行介绍。  小结
  向spring容器中加入bean的几种方式.
  @Configuration + @Bean
  @ComponentScan + @Component
  @Import 配合接口进行导入
  使用FactoryBean。
  实现BeanDefinitionRegistryPostProcessor进行后置处理。

苹果6sp是不是目前苹果手机中续航最好的?感谢邀请。iPhone6sPlus不是苹果手机中续航最好的,正确答案是iPhone8Plus。数据如图以上是知名手机站点PhoneArena测评数据中库中的数据,续航时间方面,iP助听器的耳印坏了,在哪里可以修呢?就看是那种的耳印模,要是软耳模就只有重新取耳印制作,要是硬耳模看具体坏的情况,有的是可以维修的,有的也只有重新取耳印制作。你好,耳印坏了建议重新做,可以到专业听力中心取耳印重新制作苹果手机有什么缺陷?耐用,缺陷是太耐用。一点都不给人换新手机的机会。苹果手机缺陷太多,下面细数。1,信号太弱。楼上用的华为手机都能连接我家wifi,苹果手机在我家卧室都连接不到。必须到客厅才能连上无线能否晒晒你用华为手机拍的照片?和水果机比一下,看看谁的好?华为nova3i拍摄,看看和卡片机拍的,有什么不同。一直用华为手机,mate8mate10mate20都用过,的确可以晒几张,不过从来没用过水果机,因为不喜欢。一mate8拍的云南怎么讲好ppt?做好一次成功的PPT演讲,基本就6步,大致如下STEP1分析演讲主题拿到演讲主题之后,我会先对它做个分析,想清楚听众想听什么,自己能讲什么,取其中的交集,确定演讲的核心目标。STE在中国移动工作,前景怎么样?我在某富裕省份的移动工作,从事linux平台和虚拟化方面的工作,收入所有全加起来连补贴连发票报销连实物连公积金企业年金都算上连杂七杂八的全加上大概到手20万一年。其实我觉得这收入还如果说IPV4地址资源短缺,为什么IPV6也不给公网IP?只要是正规的运营商都是给的公网IPv6地址。通常电信给的是240e开头,联通是2408开头,移动是2409开头。如果是fe80开头的,那不是运营商给的,只要网卡开启了ipv6都会自什么信号?高瓴美股持仓大曝光!清仓阿里B站,大幅减持拼多多,增持理想小鹏点蓝字关注,不迷路北京时间2月15日,高瓴公布其2021年四季度美股持仓数据。截至四季度末,HHLR在美股市场持有76只股票,前十大重仓股为百济神州On昂跑传奇生物赛富时天境生物京五种并发包总结1常用的五种并发包ConcurrentHashMapCopyOnWriteArrayListCopyOnWriteArraySetArrayBlockingQueueLinkedB全方位多方面逼着升级啊昨天,老同事家里的老电脑说央视影音升级后没法用了,让我去帮他整下!本以为是个很简单的事情,10分钟的事,结果,却让我花了3个小时也没整好!他的电脑是个联想的一体机,已经用了有10年golang学习笔记golang学习笔记说明表示需要重点关注的的地方包packagemain导入包import(fmtmathrand)funcmain()fmt。Println(Myfavorite
推荐一个计算机电子书免费下载开源项目一个整理了各种计算机类电子书免费下载资源的开源项目,目前已持续整理了1500多本。包括C,C,Docker,Elasticsearch,Git,Hadoop,HeadFirst,J三星S20显示屏问题再度曝光,三星S21让路新机跌至白菜价三星手机通常具有出色的屏幕,但这并不意味着它们是完美的。据安卓警方称,去年的GalaxyS20屏幕被爆出一个又一个破屏,手机会出现绿色,屏幕上有明显的线条,现在GalaxyS20的戴助听器好多年还是听不清楚,怎么回事?如果已经定性有了听力损失,不是说戴上助听器就能恢复到原来听力的,因为助听器只是一种听力辅助工具,是没有治疗效果的,所以不能期望戴了助听器以后听力会变好。不过正确佩戴经过科学验配的助华为发布2021年报显示整体经营状况符合预期视频加载中新华社深圳3月28日电(记者王攀陈宇轩)华为公司28日发布的2021年年度报告显示,2021年华为实现收入6368亿元,净利润1137亿元,同比增长75。9,经营现金流快240Hz电视来了,4999元,瞬时感觉索尼电视不香了?相信大家买电视的时候都会考虑一个很重要的指标,那就是电视的刷新率,市面上绝大多数的电视刷新率都是60Hz和120Hz这两种,除此之外,144Hz电视都比较少了,那么高刷新率到底有没用树莓派打造你的手持Linux电脑Penkesu电脑一个自制的复古式手持Linux电脑。你是否曾希望有一台适合你手持的带有键盘的Linux笔记本电脑?如果是这样,那么你幸运了。一位硬件设计师创造了这样一个设备,并将空气净化器哪个牌子好,解决室内甲醛问题冰尊空气净化器是国际空气净化器十大排名龙头品牌。很多家庭都面临过这样的问题,装修完的房子里面的异味都或多或少会产生甲醛,一旦暴露在这样环境下面时间过久,对人体的危害是很大的。那么怎荣耀Magic4首销好评跌至97,用户评价很真实,两大缺点不吐不快作为荣耀面向2022年打造的旗舰手机,荣耀Magic4系列之前在海外巴塞罗那发布就吸引了不少用户,而后在国内发布,热度也不低。与前代机型相比,荣耀Magic4系列外观并没有太大的变分析师进入工程验证测试阶段,iPhone15将具有5倍光变一份新的报告显示,2023年的iPhone系列将采用传闻已久的5倍光学变焦系统。海通国际证券分析师杰夫浦(JeffPu)在一份报告中表示,根据他的供应链调查,iPhone14目前处360老板娘突查打卡小鹅拼拼补偿方案改了美团暂停全集团招聘1今天下午,多位厂友私信厂哥开水厂目前已全集团暂停招聘。2360够狠的!老板娘带着行政和HR查考勤,只要查到有1次代打卡的,都要被无赔偿被开!听说本次突查,老员工是主要目标,如果一微信支付分700分,分付有多少额度?我的支付分743分,分付9800,蚂蚁小备57000,微粒贷46000,那么你的多少了呢?说起微信支付分,大家都很熟悉,因为人人都有,但是说起分付,很多人就不知道了,因为分付是微信