• 使用Spring基础组件导入、注册bean实例


    向IOC容器中注入bean的方式

    @Import:是导入组件的一种注解,是选择性的注入。

    • @Bean 注解
    1. @Configuration
    2. public class MainConfig {
    3. // @Bean 注解默认可以不指定bean的名称,IOC实例化后的实例名称就是这个方法名
    4. @Bean("person")
    5. // @Bean
    6. public Person person() {
    7. return new Person("老大", "30");
    8. }
    9. }
    • @Import 注解 导入
    1. @Configuration
    2. //@Import(Dog.class)
    3. @Import({Dog.class, Cat.class})
    4. public class MainConfig {
    5. @Bean("person")
    6. public Person person() {
    7. return new Person("小二", "28");
    8. }
    9. }
    • @Import 注解 + ImportSelector 
    1. public class TestImportSelector implements ImportSelector {
    2. @Override
    3. public String[] selectImports(AnnotationMetadata annotationMetadata) {
    4. // 方法不要返回null
    5. return new String[]{"org.xiaobuisme.example.cap6.Fish", "org.xiaobuisme.example.cap6.Tiger"};
    6. }
    7. }
    1. @Configuration
    2. //@Import(Dog.class)
    3. //@Import({Dog.class, Cat.class})
    4. @Import({Dog.class, Cat.class, TestImportSelector.class})
    5. public class MainConfig {
    6. @Bean("person")
    7. public Person person() {
    8. return new Person("老3", "20");
    9. }
    10. }
    • @Import + ImportBeanDefinitionRegistrar
    1. /**
    2. * ImportBeanDefinitionRegistrar:
    3. */
    4. public class TestImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    5. /**
    6. * containsBeanDefinition(): 是否存在某个类的定义
    7. * registerBeanDefinition(): 注册实例bean
    8. *
    9. * @param annotationMetadata 注解类信息
    10. * @param registry bean注册器
    11. */
    12. @Override
    13. public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry registry) {
    14. boolean beanDefinition1 = registry.containsBeanDefinition("org.xiaobuisme.example.cap6.Dog");
    15. boolean beanDefinition2 = registry.containsBeanDefinition("org.xiaobuisme.example.cap6.Cat");
    16. if (beanDefinition1 && beanDefinition2) {
    17. RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
    18. registry.registerBeanDefinition("pig", beanDefinition);
    19. }
    20. }
    21. }
    1. @Configuration
    2. //@Import(Dog.class)
    3. //@Import({Dog.class, Cat.class})
    4. @Import({Dog.class, Cat.class, TestImportSelector.class, TestImportBeanDefinitionRegistrar.class})
    5. public class MainConfig {
    6. @Bean("person")
    7. public Person person() {
    8. return new Person("小4", "20");
    9. }
    10. }
    验证 以上方式是否可以成功注入实例bean
    1. import org.springframework.context.ApplicationContext;
    2. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    3. import org.xiaobuisme.example.cap6.MainConfig;
    4. import org.xiaobuisme.example.cap6.Fish;
    5. import org.xiaobuisme.example.cap6.Pig;
    6. public class Test {
    7. public static void main(String[] args) {
    8. ApplicationContext anno = new AnnotationConfigApplicationContext(MainConfig.class);
    9. String[] beanNames = anno.getBeanDefinitionNames();
    10. for (String beanName : beanNames) {
    11. System.out.println(beanName);
    12. }
    13. // 验证通过导入组件工具TestImportSelector导入的类实例是否存在
    14. Fish fish = anno.getBean(Fish.class);
    15. System.out.println(fish);
    16. // 验证通过ImportBeanDefinitionRegistrar 工具导入的类实例是否导入成功
    17. Pig pig = anno.getBean(Pig.class);
    18. System.out.println(pig);
    19. }
    20. }

  • 相关阅读:
    『PyQt5-Qt Designer篇』| 08 Qt Designer中容器布局和绝对布局的使用
    Vue3调用钉钉api,内嵌H5微应用单点登录对接
    博客停更,已开公众号-《GIS杂谈》,之后会在公众号持续更新相关知识,敬请关注,欢迎讨论~
    历时30天的腾讯软件测试岗面试血泪史,最终拿到offer25K+16薪
    超级实用!React-Router v6实现页面级按钮权限
    小样本相关论文复现—2-全局印象
    【Python 千题 —— 基础篇】分句成词
    阿里云效和阿里在线idea使用
    【Leetcode】236. 二叉树的最近公共祖先
    java计算机毕业设计咖啡屋订单系统源码+mysql数据库+系统+lw文档+部署
  • 原文地址:https://blog.csdn.net/u011672034/article/details/132739373