Skip to content

一、为什么使用 @Import 注解 ?

  • 因为在没有使用@Import 注解的时候,我们是通过 @Bean 注解来注入第三方 Jar包, 这样就会产生代码的冗余问题。为了解决这一问题,@Import注解帮助我们解决了注入第三方 Jar包,产生代码冗余的问题。

二、@Import 实例

1. 创建一个 Win10.java 类。

java
package org.example.spring5.domain;

/**
 * @author: Calvin <br>
 * @date: 2020/11/25 17:26 <br>
 * @since: 1.0 <br>
 * @description: Win10 <br>
 */
public class Win10 {
}

2. 在 SpringConfiguration 类, 添加@Import

  • 作用:主要将外包的 jar包注入到 Spring 容器中。
java
package org.example.spring5.config;

import org.example.spring5.condition.OsCondition;
import org.example.spring5.domain.User;
import org.example.spring5.domain.Win10;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * @author: Calvin <br>
 * @date: 2020/11/25 14:18 <br>
 * @since: 1.0 <br>
 * @description: SpringConfig <br>
 */
@Configuration 
@Import(value = Win10.class) // @Import 作用:主要将外包的 jar 包注入到 Spring 容器中。
@ComponentScan(value = "org.example.spring5") 
public class SpringConfiguration {
}

3. 启动程序

java
package org.example.spring5;

import org.example.spring5.config.SpringConfiguration;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * @author: Calvin <br>
 * @date: 2020/11/25 14:27 <br>
 * @since: 1.0 <br>
 * @description: SpringApplication <br>
 */
public class SpringApplication {

    private static AnnotationConfigApplicationContext annotationConfigApplicationContext;

    public static void main(String[] args) {
        annotationConfigApplicationContext  = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        System.out.println("Bean 对象已装配完毕...");
        // 使用@Import 注入的Bean 对象,需要使用对象包的全部路径。
        Win10 win10Bean = (Win10) annotationConfigApplicationContext.getBean("org.example.spring5.domain.Win10");
        System.out.println(win10Bean);
    }
}

4. 测试结果

log
Bean 对象已装配完毕...
org.example.spring5.domain.Win10@16610890

三、@Bean 和 @Import 区别

相同之处:

  • 都是为了注入第三方Jar包需要调用的对象。

不同之处:

  • @Bean 需要通过将new对象出来。这种方式适合一个对象注入。

    java
    @Bean
    @Conditional(value = OsCondition.class)
    public Win10 win10(){
        return new Win10();
    }
  • @Bean 调用过程只需要对象.class 就可以了。

    java
    Win10 win10Bean = annotationConfigApplicationContext.getBean(Win10.class);
  • @Import 需要将对象.class 导入进入。 这种方式适合多个对象注入,解决了@Bean 的冗余问题。

    java
    @Configuration 
    @Import(value = Win10.class) // @Import 作用:主要将外包的jar 包注入到 Spring 容器中。
    @ComponentScan(value = "org.example.spring5") 
    public class SpringConfiguration {
    }
  • @Import 调用过程需要包.对象的全路径。

    java
    Win10 win10Bean = (Win10) annotationConfigApplicationContext.getBean("org.example.spring5.domain.Win10");