一、@Configuration的作用
@Configuration通常用于定义配置类,代替老式XML配置文件。@Configuration修饰在类名的上方,并且在类的内部,通常用@Bean修饰方法,该方法的返回值默认为Spring容器中的一个单例。
二、@Configuration的使用
1. @Configuration+@Bean注册Bean
创建Bean类
public class PiggRedisInfo {
private String url;
private int port;
private String userName;
private String password;
public PiggRedisInfo() {
System.out.println("调用了PiggRedisInfo()");
}
//省略其它代码
}
创建配置类
@Configuration
public class PiggRedisConfig {
//1.方法名作为组件的ID
//2.返回的值就是容器中的实例
//3.默认是单实例
@Bean
public PiggRedisInfo redisInfo(){
return new PiggRedisInfo();
}
}
在启动类里测试
@SpringBootApplication
public class DictApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(DictApplication.class, args);
PiggRedisInfo redisInfo1 = run.getBean("redisInfo", PiggRedisInfo.class);
PiggRedisInfo redisInfo2 = run.getBean("redisInfo", PiggRedisInfo.class);
System.out.println("redisInfo1 == redisInfo2 : " + (redisInfo1 == redisInfo2));
}
运行结果显示redisInfo是一个单实例
调用了PiggRedisInfo()
redisInfo1 == redisInfo2 : true
2. @Bean+@Scope(“prototype”)修改Bean作用域
@Scope(“prototype”)指定Bean不是单例,而是原型多实例。
对于原型,Spring启动时,不会加载Bean到容器中,当代码每次创建Bean时,都会创建一个新的Bean对象。
@Configuration
public class PiggRedisConfig {
//1.方法名作为组件的ID
//2.返回的值就是容器中的实例
//3.默认是单实例
@Bean
@Scope("prototype")
public PiggRedisInfo redisInfo(){
return new PiggRedisInfo();
}
}
运行结果调用了两次构造方法
调用了PiggRedisInfo()
调用了PiggRedisInfo()
redisInfo1 == redisInfo2 : false
3. @Bean的使用细节
@Bean的value和name是一样的,如果不指定value或者name,那么Bean的实例名称是方法名,
但是Java的方法是可以重载的,方法名可以一样,参数和返回结果可以不同。这个时候Spring默认加载最后面一个方法。
所以在真实项目里,如果要用@Bean,最好指定value或者name的值,Spring会使用它们作为Bean的标识。
三、总结
@Configuration定义在类上,它初始化的Bean实例默认是单例,调用多次依旧是一个对象。