关于Spring注解@Import


以下内容仅供参考

@Import的用途

@Import通过快速导入的方式实现把实例加入spring的IOC容器中。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {

	/**
	 * {@link Configuration @Configuration}, {@link ImportSelector},
	 * {@link ImportBeanDefinitionRegistrar}, or regular component classes to import.
	 */
	Class<?>[] value();

}

注解用于类上,用于快速导入一个类

@Import的使用方式

1.类字面常量

  1. 直接写类字面常量,可以多个
//实体类1
package bean;

public class Bean01 {

    public Bean01(){
        System.out.println("Bean01构造器被调用");
    }
}

//实体类2
package bean;

public class Bean02 {
    public Bean02(){
        System.out.println("Bean02构造器被调用");
    }
}
  1. 配置类 使用@Import导入Bean01和Bean02
package configuration;


import bean.Bean01;
import bean.Bean02;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import({Bean01.class,Bean02.class})
public class Configuration01 {

    public Configuration01(){
        System.out.println("Configuration01构造器被调用");
    }
}
  1. 测试
package test;

import configuration.Configuration01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test01 {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Configuration01.class);
        for(String s:applicationContext.getBeanDefinitionNames()){
            System.out.println(s);
        }
    }
}
//输出结果
Configuration01构造器被调用
Bean01构造器被调用
Bean02构造器被调用
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
configuration01
bean.Bean01
bean.Bean02

可以看到这样导入成功了,Bean01和Bean02被Spring管理了

2.实现ImportSelector接口导入

  1. 创建一个类实现ImportSelector接口,实现selectImports方法,该方法返回一个字符串数组,当使用@Import导入该类的时候,实际上是注册了这个方法返回字符串的类.
  • ImportSelectorImp01的selectImports方法返回Bean01和Bean02两个类
package bean;

import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;


public class ImportSelectorImp01 implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{"bean.Bean01","bean.Bean02"};
    }

}
  • @Import导入实现类ImportSelector接口的类
package configuration;


import bean.Bean01;
import bean.Bean02;
import bean.ImportSelectorImp01;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(ImportSelectorImp01.class)
public class Configuration01 {

    public Configuration01(){
        System.out.println("Configuration01构造器被调用");
    }

}
  • 测试
package test;

import configuration.Configuration01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test01 {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Configuration01.class);
        for(String s:applicationContext.getBeanDefinitionNames()){
            System.out.println(s);
        }
    }
}
//运行结果
Configuration01构造器被调用
Bean01构造器被调用
Bean02构造器被调用
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
configuration01
bean.Bean01
bean.Bean02

3.实现ImportBeanDefinitionRegistrar接口导入

  1. 创建一个类实现ImportBeanDefinitionRegistrar接口并实现方法registerBeanDefinitions在方法里进行bean注册
package bean;

import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;

public class ImportBeanDefinitionRegistrarImp01 implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Bean01.class);
        registry.registerBeanDefinition("bean01",rootBeanDefinition);
    }
}
package configuration;


import bean.ImportBeanDefinitionRegistrarImp01;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@Import(ImportBeanDefinitionRegistrarImp01.class)
public class Configuration01 {

    public Configuration01(){
        System.out.println("Configuration01构造器被调用");
    }


}
package test;

import configuration.Configuration01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test01 {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new AnnotationConfigApplicationContext(Configuration01.class);
        for(String s:applicationContext.getBeanDefinitionNames()){
            System.out.println(s);
        }
    }
}
//测试结果
Configuration01构造器被调用
Bean01构造器被调用
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
configuration01
bean01
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值