@Import注释的用例是什么?

2022-09-01 04:55:47

根据官方文件

注释类型配置

指示类声明一个或多个@Bean方法,并且可以由Spring容器处理以生成bean定义...

@Configuration类可以使用@Import注释进行组合,这与Spring XML中的工作方式没有什么不同。因为@Configuration对象在容器中作为 Spring Bean 进行管理。

但我也可以使用@Configuration注释而不@Import。我已经测试了下面列出的代码,它按预期工作。那么使用@Import的目的是什么呢?

调度程序服务器初始化程序

public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { WebConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    
 }

WebMvcConfigurerAdapter

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "package.name" })
// @Import(OptionalConfig.class) 
public class WebConfig extends WebMvcConfigurerAdapter {
    // ...
}

可选配置

@Configuration
public class OptionalConfig {
    
    @Bean(name = "myClass")
    public MyClass myClass() {
        return new MyClass();
    }
}

服务

@Service
public class MyServiceImpl implements MyService {
    
    @Autowired
    private MyClass myClass;    // yes, it works

    // ...
}

答案 1

如果启用了组件扫描,则可以在不使用 的情况下拆分多个类中的 Bean 定义。而且,您不需要将它们全部提供给应用程序上下文构造函数。@Configuration@Import

我认为主要目的是为您提供一种简化多个配置注册的方法,如果您想避免组件扫描(从Spring Framework 4.2开始,每个参考手册)。@Import

春季参考文档中有一个关于@Import用法的说明:

从Spring Framework 4.2开始,还支持对常规组件类的引用,类似于该方法。如果要避免组件扫描,使用几个配置类作为显式定义所有组件的入口点,这将特别有用。@ImportAnnotationConfigApplicationContext.register


答案 2

到目前为止,我们已经看到了如何将bean定义分解为多个类,以及如何跨边界引用这些bean。这些场景需要向 的构造函数提供所有类,这并不总是理想的。通常最好使用聚合方法,其中一个类在逻辑上导入另一个类定义的 Bean 定义。@Configuration@Configuration@ConfigurationJavaConfigApplicationContext@Configuration

注释提供了这种支持,它直接等同于在Spring beans XML文件中找到的元素。@Import<import/>

http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch04s03.html


推荐