zoukankan      html  css  js  c++  java
  • Spring注解驱动第六讲--@Import注解

    在以前的博客中介绍了两种让容器自动装配bean的方法:

      1,使用@Bean注解进行装配

      2,使用@ComponentScan进行包扫描,扫描带有@Controller,@Service,@Repository,@Component注解的类即可装载bean

    还有一种方式,使用@Import注解进行对引用第三方类时使用

    用法:

    一,直接在主配置类上添加@Import注解,注解的值赋值上要创建的类型即可

    首先创建一个要加载进来的外部类

    public class Color {
        ...
    }

    可以看到此类没有添加任何可以让包扫描到的注解,在容器创建是也不会加载到容器中

    然后在主配置类上添加@Import注解

    @Configuration
    @Import({Color.class})//注解里面的值为需要IOC加载的类的类型
    public class MainConfig2 {
    
    }

    测试类和返回结果:

    public class IOCTest {
        @Test
        public void test4() {
            ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);
            String[] names = applicationContext.getBeanDefinitionNames();//返回容器中所有bean的名字
            for (String name : names) {
                System.out.println(name);
            }
        }
    }

    运行结果:

    mainConfig2
    com.wxj.bean.Color

    观察可得,使用@Import导入的组件在ioc容器中默认的id为全类名

    二,实现ImportSelector接口方式

    1,创建一个一个方法来实现ImportSelector接口()

    public class MyImportSelector implements ImportSelector {
        /**
         * AnnotationMetadata类中可以获得注解名字,等注解信息
         * 
         * 返回的String数组为要让@Import注解加载的类的全类名
         */
        public String[] selectImports(AnnotationMetadata importingClassMetadata) {
            
            return new String[] {"com.wxj.bean.Color"};//需要ioc容器管理的全类名,多个类可以由,分隔
        }
    
    }

    2,更改主配置类的@Import注解中的value值

    @Configuration
    @Import({MyImportSelector.class})
    public class MainConfig2 {
      
    }

    3,再次运行

    mainConfig2
    com.wxj.bean.Color

    三,实现ImportBeanDefinitionRegistrar接口(手工的自定义bean)

    1,实现ImportBeanDefinitionRegistrar,代码如下:

    public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
        /**
         * importingClassMetadata:当前类的直接信息
         * registry:bean定义的注册类,通过使用它来为容器中注册bean
         *         把所有需要加到容器中的bean通过手工注册,调用BeanDefinitionRegistry的registerBeanDefinition方法进行手工注册
         *         
         */
        public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
            //指定bean的定义信息...
            RootBeanDefinition beanDefinition = new RootBeanDefinition(Color.class);
            //给容器中的bean自定义id
            registry.registerBeanDefinition("Color", beanDefinition);
        }
    
    }

    2,更改主配置类

    @Configuration
    @Import({MyImportBeanDefinitionRegistrar.class})
    public class MainConfig2 {
    }

    3,运行结果

    mainConfig2
    Color

    注:在以后阅读SpringBoot源码时,第二种方法应用的极为广泛

  • 相关阅读:
    30 Day Challenge Day 20 | Leetcode 938. Range Sum of BST
    30 Day Challenge Day 20 | Leetcode 124. Binary Tree Maximum Path Sum
    30 Day Challenge Day 20 | Leetcode 94. Binary Tree Inorder Traversal
    idea2019版本破解
    xml文件时第一行无缘无故报错
    activeMQ的基本使用
    activeMQ的安装(Linux下)
    redis的基本用法
    redis安装(Linux下)
    redis安装(window下)
  • 原文地址:https://www.cnblogs.com/xingjia/p/11209557.html
Copyright © 2011-2022 走看看