关于 @Import 注解

本文深入解析Spring框架中的@Import注解,介绍其功能、使用方法及与@Service、@Configuration和@Bean等注解的区别。通过实例演示如何将类注入到Spring的IOC容器中,并对比直接使用@Import和通过@Bean方式注入的不同。

@Import 注解

主要是记录一些学习的东西,记性不好, 怕忘了,如果有错误的地方,欢迎大家指出,一起进步~

1 什么是@Import

是Spring框架提供的一个注解,主要作用是将对象手动注入到 Spring 的 IOC 容器中进行管理,默认的bean的name是类的全限定名,即包含完整的包名。

2 怎么用

(1)直接将要注入到容器的类加到@Import注解中

先看一个简单的实例,如下 Person 类:

package com.example.demo.testimport;

/**
 * @author Jason
 * @version V1.0
 */
public class Person {

    private String name;

    private String age;

}

再写一个测试用的类,使用@Import注解来注入上面的 Person 类:

package com.example.demo.testimport;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Import;

/**
 * @author Jason
 * @version V1.0
 */
@Import({Person.class})
public class TestImport {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext
                = new AnnotationConfigApplicationContext(TestImport.class);
        // 获取已注入到容器中的Bean
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

}

可以在控制台中看到:

testImport
com.example.demo.testimport.Person

说明 Person 类已经被注入进去了。

(2)将需要注册的类放到同一个类中再统一注入

与(1)不同,这次通过@Bean将Person类放到MyConfig.class中:

package com.example.demo.testimport;

import org.springframework.context.annotation.Bean;

/**
 * @author Jason
 * @version V1.0
 * @Date 2019/7/3 20:54
 */
public class MyConfig {

    @Bean
    public Person person() {
        return new Person();
    }

}

然后再将MyConfig类用@Import手动注入到容器中:

package com.example.demo.testimport;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Import;

/**
 * @author Jason
 * @version V1.0
 */
@Import({MyConfig.class})
public class TestImport {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext
                = new AnnotationConfigApplicationContext(TestImport.class);
        // 获取已注册到容器中的Bean
        String[] names = applicationContext.getBeanDefinitionNames();
        for (String name : names) {
            System.out.println(name);
        }
    }

}

可以从控制台看到:

testImport
com.example.demo.testimport.MyConfig
person

3 两种方式的区别

从控制台输出的信息可以发现,直接用@Import引入的类它的beanName是它的包全路径+类名,而通过@Bean方式注入的话它的beanName是方法名。

4 与@Service、@Configuration和@Bean注解的区别

个人的理解,一个是注入的方式不同,@Service是直接就可以说明被标注的类需要纳入容器管理,而@Import还需要将类放到value中;还有一个是用途的区别,@Import 注解的最主要功能就是导入额外的配置信息,而@Service更多是用于业务层的标注,@Configuration和@Bean也经常用来导入一些额外配置,但是当配置一多写法就比较麻烦。

[1]: @Import注解——导入资源
[2]: Spring Boot 自动配置之@Enable* 与@Import注解

`@Import`注解可以通过快速导入的方式将实例加入Spring的容器中,其有三种使用方法,且该注解只能作用在类上[^1]。以下为你详细介绍其使用方法: ### 直接导入类 这种方式直接将指定的类注入到Spring容器中。示例代码如下: ```java import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; // 定义一个需要注入的类 class Test { // 类的具体内容 } // 使用@Import注解将Test类注入到Spring容器 @Import({Test.class}) @Configuration public class Myclass2 { // 类的具体内容 } ``` 上述代码通过`@Import({Test.class})`将`Test`类注入到Spring容器中,`@Configuration`表明这是一个配置类[^5]。 ### 导入`ImportSelector`实现类 `ImportSelector`是一个接口,实现该接口并重写`selectImports`方法,可动态选择需要导入的类。示例代码如下: ```java import org.springframework.context.annotation.ImportSelector; import org.springframework.core.type.AnnotationMetadata; // 实现ImportSelector接口 class MyImportSelector implements ImportSelector { @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { // 返回需要导入的类的全限定名 return new String[]{"com.example.Test"}; } } import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; // 使用@Import导入MyImportSelector @Import(MyImportSelector.class) @Configuration public class MyConfig { // 类的具体内容 } ``` 在上述代码中,`MyImportSelector`实现了`ImportSelector`接口,并重写`selectImports`方法返回需要导入的类的全限定名。`@Import(MyImportSelector.class)`将`MyImportSelector`导入,Spring会根据`selectImports`方法的返回值来注入相应的类。 ### 导入`ImportBeanDefinitionRegistrar`实现类 `ImportBeanDefinitionRegistrar`接口允许手动注册`BeanDefinition`。示例代码如下: ```java 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; // 实现ImportBeanDefinitionRegistrar接口 class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { // 创建一个BeanDefinition RootBeanDefinition beanDefinition = new RootBeanDefinition(Test.class); // 注册BeanDefinition registry.registerBeanDefinition("test", beanDefinition); } } import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; // 使用@Import导入MyImportBeanDefinitionRegistrar @Import(MyImportBeanDefinitionRegistrar.class) @Configuration public class MyConfig2 { // 类的具体内容 } ``` 在上述代码中,`MyImportBeanDefinitionRegistrar`实现了`ImportBeanDefinitionRegistrar`接口,并重写`registerBeanDefinitions`方法手动注册`BeanDefinition`。`@Import(MyImportBeanDefinitionRegistrar.class)`将`MyImportBeanDefinitionRegistrar`导入,Spring会调用`registerBeanDefinitions`方法来注册相应的`Bean`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值