简介
@Configuration
注解用于标识一个类作为Spring的配置类,从而允许使用纯Java代码的方式来定义Bean和Bean之间的依赖关系。
@Configuration
注解是Spring框架中非常核心的一个功能,它提供了一种替代XML配置文件的方法。通过该注解,开发人员可以在Java类中通过方法级别的@Bean
注解来创建和配置Bean定义。这样做的好处是可以提高代码的可读性和维护性,同时也使得配置更加灵活。
当一个类被@Configuration
注解标记时,这个类会被视为一个Bean定义的来源,并且可以包含一个或多个@Bean
方法。这些方法将会在应用启动时由Spring容器调用,以便生成相应的Bean定义,并管理它们的生命周期。
@Configuration
注解的类通常与@Bean
注解的方法一起使用,其中@Bean
注解用于实例化和配置具体的Bean。@Configuration
类本身也可以被Spring容器视为一个普通的Bean进行管理,因为它本质上也是一个由Spring管理的组件。
总的来说,@Configuration
注解是Spring框架实现基于Java的配置的核心,它使得开发者能够以类型安全且重构友好的方式编写Spring应用的配置代码。
例如,一个简单的@Configuration类:
@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}
这个例子中,AppConfig
类被标记为一个配置类,它包含一个方法myService()
,该方法创建一个MyService
类型的对象并返回,这个对象随后会被注册到Spring容器中。
源码:
@Component
public @interface Configuration {@AliasFor(annotation = Component.class)String value() default "";boolean proxyBeanMethods() default true; //默认为ture Spring会保证多次调用@Bean标注的工厂方法,不会重复产生新的对象,始终是同一个
}
@Configuration与XML配置的对比:
XML配置
<bean id="myService" class="com.example.MyServiceImpl"/>
对应的@Configuration类
@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}
作用域与生命周期:
如果我们想让MyService
成为一个原型作用域的Bean,我们可以这样配置:
@Configuration
public class AppConfig {@Bean(scope = "prototype")public MyService myService() {return new MyServiceImpl();}
}
这样每次从Spring容器中获取myService
时,都会得到一个新的实例。
继承与组合:
如果我们有两个配置类并且想要在一个配置类中重用另一个配置类的Beans,可以使用@Import注解:
@Configuration
public class AppConfig {@Import(OtherConfig.class)// ... 其他Bean定义
}
在这个例子中,AppConfig
通过@Import注解引入了OtherConfig
类定义的Beans。
条件化配置:
假设我们只想在开发环境中创建某个Bean,可以使用@Conditional注解:
@Configuration
public class DevConfig {@Bean@Conditional(DevCondition.class)public DevService devService() {return new DevServiceImpl();}
}
在这个例子中,devService
Bean只会在满足DevCondition
条件时被创建。
提别注意避免在@Configuration类中使用静态字段,因为这样会使得Spring容器无法管理这些字段;确保配置类之间的依赖关系清晰,避免循环依赖等。