@Import 注解的用例是什么?

新手上路,请多包涵

根据 官方文件

注释类型配置

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

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

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

DispatcherServletInitializer

 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[] { "/" };
    }

 }

WebMvcConfigurer适配器

@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

    // ...
}

原文由 enzo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 603
2 个回答

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

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

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

原文由 Marcel 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

Spring 参考文档中有一条关于 @Import 用法的说明:

从 Spring Framework 4.2 开始, @Import 也支持对常规组件类的引用,类似于 AnnotationConfigApplicationContext.register 方法。如果您想避免组件扫描,使用一些配置类作为显式定义所有组件的入口点,这将特别有用。

原文由 yixiang 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题