@Import注释的用例是什么?

enz*_*nzo 11 java spring spring-mvc

根据官方文件:

注释类型配置

表示一个类声明了一个或多个@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[] { "/" };
    }

 }
Run Code Online (Sandbox Code Playgroud)

WebMvcConfigurerAdapter

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

OptionalConfig

@Configuration
public class OptionalConfig {

    @Bean(name = "myClass")
    public MyClass myClass() {
        return new MyClass();
    }
}
Run Code Online (Sandbox Code Playgroud)

服务

@Service
public class MyServiceImpl implements MyService {

    @Autowired
    private MyClass myClass;    // yes, it works

    // ...
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*cel 18

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

@Import注释就提供了这种支持,而且它是直接等同<import/>于Spring bean的XML文件中找到的元素.

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


PA *_*ire 14

一个典型的用例@Import是团队开发 REST 服务并意识到他们需要一些通用配置。

每个服务都有自己的命名空间,即org.mybusiness.specific,并且其@SpringBootApplication(以及组件扫描根)从此包开始。

另一方面,公共库将其命名空间设置为org.mybusiness.common,因此将无法进行组件扫描。

因此需要使用引用公共配置类@Import(CommonConfig.class)


yix*_*ang 13

如果启用了组件扫描,则可以在不使用@Import的情况下在多个@Configuration类中拆分bean定义.您不需要将所有这些提供给应用程序上下文构造函数.我认为@Import的主要目的是为您提供一种简化多配置注册的方法,如果您想避免组件扫描(从Spring Framework 4.2开始,每个参考手册).

有关@Import用法的春季参考文档中有一个注释:

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


And*_*own 12

启用组件扫描后,@Import如果您对世界的看法仅限于您自己的应用程序及其包,则很难立即看到可以增加价值的地方。如果您要导入具有自己的包结构且不想组件扫描的 bean 库,那么它可以提供帮助。

您可以将此类库放在类路径中,并用于从其中@Import挑选@Configuration类。这就是为什么它通常被称为组合,因为您正在@Configuration从多个来源组合您的类。


ric*_*din 8

我找到使用@Import注释用途。我不认为这是用例。如果您正在使用 Spring 开发一组库,那么您可能没有SpringBootApplication. 因此,您尚未启用任何自动扫描来解析 bean。

如果在库中的配置文件中声明的 beanlibrary-a是通过依赖注入引用的,则library-b需要使用它@Import来告诉 Spring 如何解析该 bean。

正如我们所说,library-a你有这个配置文件。

@Configuration
public class ConfigurationA {
    @Bean
    public BeanA beanA() {
       return new BeanA();
    }
}
Run Code Online (Sandbox Code Playgroud)

library-b如果你想使用你必须有这个配置文件BeanA

@Configuration
@Import(ConfigurationA.class)
public class ConfigurationB {
    @Bean
    public BeanB beanB(BeanA beanA) {
       return new BeanB(beanA);
    }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你。