从Spring4开始可以通过Java配置方式取代XML配置,这也是SpringBoot配置的方式
Java配置方式是通过@Configuration和@Bean这两个注解实现:
1、@Configuration作用于类上,相当于一个XML配置文件
@Bean作用于方法上,相当于XML配置文件中的<bean>
@Configuration和@Bean
@Configuration注解的类会被AnnotationConfigApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。也可以使用AnnotationConfigWebApplicationContext类进行扫描
@Bean作用于方法上,相当于XML配置文件中的<bean>
@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里
注意:1、@Configuration修饰的类不可以是final类型
2、@Configuration修饰的类不可以是匿名类
@Configuration的内部实现
Target(ElementType.TYPE)
Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public@interface Configuration{....}
@Bean
一、定义:@Bean注释被用于只是一个方法实例,配置和初始化为通过Spring Ioc容器进行管理的新对象。
对于那些熟悉Spring的<beans/>XML配置的人来说,@Bean注解与<baen/>元素扮演的角色相同
二、bean的依赖
@bean也可以依赖其他任意数量的bean,如果 TransService 依赖AccountRepository,我们可以通过方法参数实现这个依赖
@Configuration
public class AppConfig{@Beanpublic TransferService transferService(AccountRepository accountRepository){return new TransferServiceImpl(accountRepository);}
}
三、接受生命周期的回调
任何使用@Bean定义的bean,也可以执行生命周期的回调函数,类似@PostConstruct and @PreDestroy的方法
默认使用JavaConfig配置的bean,如果存在close或者shutdown方法,则在bean销毁时会自动执行该方法,如果不想执行该方法,则添加@Bean(destroyMethod="")来防止出发销毁方法。
四、指定 bean的 scope
1.使用@Scope注解来指定使用@Bean定义的bean。
@Configuration
pub1ic class MyConfiguration(@Bean@Scope("prototype")public Encryptor encryptor(){}
}
2. @Scope and scoped-proxy
Spring提供了scope的代理,可以设置@Scope的属性proxyMode来指定。
@Bean
@SessionScope
public UserPreferences userPreferences(){return new UserPreferences();
}
@Bean
public Service userService(){UserService service = new SimpleUserService(); service.setUserPreferences(userPreferences()); return service;
}
五、自定义bean的命名
默认情况下bean的名称和方法名称相同,也可以使用name属性来指定。
@Configuration
public class AppConfig {@Bean(name =“myFoo")
public Foo foo(){
return new Foo();}
}
给bean的进行别名命名
@Confiquration
public class AppConfig {
@Bean(name =“dataSource" subsystemA-dataSource","subsystemB-dataSource"))
public DataSource dataSource(){}
}
六、Bean的描述
有时候提供Bean的详细信息也是很有用的,使用@Description来提供Bean的描述。@Configuration
@Configuration
public class AppConfig{
@Bean
@Description(”这里是一个示例“)
public Foo foo(){
return new Foo();}
}