在Spring开发中,一般情况下,我们都是使用XML的方式进行Bean的配置。
在基于Java配置的方法下,可以不用对XML进行配置,也能在Spring容器中进行Bean的注册和管理。
Java配置类,通过@Configuration 和 @Bean 注解来完成。
@Configuration是类级别的注解,带有 @Configuration 的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源
@Bean 是方法级别的注解,同样支持标签支持的属性,像是 init-method, destroy-method, autowiring。
@Bean注解中表达依赖性
在@Bean注解中表达依赖性,十分的简单,通过方法的参数来构成依赖,也即是一个bean方法,调用另一个bean方法。
如下所示:
public classAppConfig{
@Bean public Foo foo(){
return new Foo(bar());//只需要在Foo类的构造方法中,声明 Bar类型的参数,就可以传入,注入依赖。
}
@Bean public Bar bar(){
return new Bar();
}
}
Foo类中的构造方法如下:
private Bar bar;
public void Foo(Bar bar){
this.bar = bar;
}
生命周期的回调
同时,@Bean注解也接受生命周期的回调,同时也支持特定的初始化方法和销毁方法,类似于XML-Based中的init-method方法和Destory-method中的bean属性,如下所示:
@Configuration
public class AppConfig{//Bean注解的初始化方法和销毁方法
@Bean(initMethod ="init" , destroyMethod = "cleanup")
public BeanOne beanOne(){
return new BeanOne();
}
}
class BeanOne{
public void init() {}
public void cleanup() {}
}
Bean的作用范围
对于Bean的作用范围,可以使用@Scope注解来指定他的作用范围,和XML-Base中的scope属性是类似的。
默认的作用范围是单例模式的,我们可以通过如下方式进行修改:
@Configuration
public class OtherConfig{
@Bean
@Scope("prototype")//修改为多例模式
public Dependency1 dependency1 (){
return new Dependency1();
}
}
自定义Bean的名称和别名
默认的情况下,配置类通过@Bean配置的默认名称进行注册和使用,也就是默认为方法名。
但是我们也可以修改@Bean的name属性,更换为我们指定的名称。
@Bean(name ="default")
public Dependency2 dependency2() {
return new Dependency2();
}
在有的时候,我们会需要为单例的Bean提供多个名称,这个时候就需要用到Bean的别名,同样也是通过@Bean的name属性来实现。
向@Bean的name中传入一个Array数组。
@Bean({"dataSource","dataSourceA","dataSourceB"})
public DataSource dataSource(){
return null;
}