使用场景:
1.bean的定义和注册:
每个方法创建返回一个对象,这些对象交由spirng容器管理
@Configuration
public class AppConfig {
@Bean
public MyBean1 myBean1() {
return new MyBean1();
}
@Bean
public MyBean2 myBean2() {
return new MyBean2();
}
}
2.组件配置和高级集成:
例如在使用springmvc的拦截器,需要将拦截器注册为spring的组件,通常实现WebMvcConfigurer接口并添加@Configuration注解
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
使用说明:
注解的作用仅仅是进行声明,不能确保标记了@Configuration的类的配置会自动应用,这些类需要被sping容器识别并加载才会生效,以下是三种方式:
1.组件扫描--@ComponentScan:
spring应用的启动类上添加的@SpringBootApplication注解中包含的@ComponentScan注解会扫描当前包(启动类所在包)及其子包下所有带有 @Component
、@Service
、@Repository
、@Controller
和 @Configuration
等注解的类,并注册为 Spring 容器中的 beans。
如果配置类不在扫描包的范围内,即所在包名不同,可以在主模块启动类或者默认扫描包下的任意配置类中添加@ComponentScan注解
注意在启动类上添加扫描注解时要主动声明启动类所在包,原扫描包此时相当于被重写
@SpringBootApplication
@ComponentScan(basePackages = {"com.example.mainapp", "com.example.module"})
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
@Configuration
@ComponentScan(basePackages = "com.example.module")
public class MainAppConfig {
}
2.显示声明--@Import:
@Import
主要用于显式地声明要导入的配置或组件,无论这些类是否有 @Component
或其他相关注解。导入配置时同ComponentScan注解,可以加在启动类上,也可以加在能被扫描到的配置类中
@SpringBootApplication
@Import({ServiceConfig.class, RepositoryConfig.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@Configuration
@Import({ServiceConfig.class, RepositoryConfig.class})
public class MainConfig {
}
3.自动配置--spring.factories
Spring Boot 的自动配置机制允许开发者通过 spring.factories
文件来指定配置类,这些配置类在应用启动时自动加载。
在 src/main/resources/META-INF
目录下创建或修改 spring.factories
文件,添加创建的配置类。
# src/main/resources/META-INF/spring.factories
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfig.MyServiceAutoConfiguration
-
目的和适用性:
@ComponentScan
和@Import
主要用于应用开发中,当开发者需要控制具体哪些类被 Spring 管理时使用。spring.factories
中的自动配置则主要用于库或框架开发,使得库的使用者可以获得基于条件的自动配置能力,这在开发通用库或 Spring Boot Starter 时非常有用。
-
灵活性和控制:
@ComponentScan
提供基于路径的自动扫描,适合于大量组件需要被注册的情况。@Import
提供了显式的控制,允许开发者精确地选择哪些配置或类需要注册。spring.factories
提供了基于条件的自动配置,允许在不同的环境下应用不同的配置,极大地增强了配置的灵活性。