尽管在大部分场景下通过组件扫描和自动装配实现Bean自动化配置是更为推荐的方式,但是也存在无法使用自动化装配的场景,例如当你需要为一些第三方库中的组件类创建Bean装配到你的应用中,这时候是无法在类代码中添加注解因此也就无法使用自动化配置方案了。在这种情况下可以推荐使用JavaConfig的方式进行显示装配,相比XML它是更好的解决方案,更安全且容易重构。JavaConfig类通常应该作为配置类放在单独的包中与处理程序逻辑的类区分开。使用JavaConfig装配Bean包括如下步骤:
1 - 创建配置类,为其添加@Configuration注解
@Configuration
public class MemcachedConfig {
}
2 - 声明简单的Bean
@Configuration
public class MemcachedConfig {
@Bean
public MemcachedService memcacheService(){
return new MemcachedService();
}
}
要在JavaConfig中声明Bean,我们需要编写一个方法,该方法会创建所需类型的实例,然后为该方法添加@Bean注解。@Bean注解会告诉Spring该方法将会返回一个对象,该对象会注册为Spring上下文中的Bean,默认情况下,Spring容器中本方法创建的Bean的ID与方法名相同,如果想修改Bean的名称既可以通过修改方法名也可以通过@Bean注解的name属性指定
3 - 借助JavaConfig实现依赖注入
在JavaConfig中装配有依赖关系的Bean的方法有以下几种:
1)方法1,引用依赖Bean的创建方法
@Configuration
public class MemcachedConfig {
@Bean
public MemcachedClient memcachedClient(){
return new MemcachedClient();
}
@Bean
public MemcachedService memcacheService(){
return new MemcachedService(memcachedClient());
}
}
注意这里memcachedClient的实例Bean并不是通过调用memcachedClient()方法获取的,因为在memcachedClient()方法被@Bean注解修饰,Spring在第一次调用该方法加载Bean之后会拦截所有对该方法的调用并直接返回返回该方法所创建的Bean
2)方法2,将依赖Bean作为方法参数传入
@Configuration
public class MemcachedConfig {
@Bean
public MemcachedClient memcachedClient(){
return new MemcachedClient();
}
@Bean
public MemcachedService memcacheService(Memcached memcachedClient){
return new MemcachedService(memcachedClient);
}
}
这种方式引用依赖Bean通常是我们推荐的方式他不要求依赖Bean与该类的声明放在同一个配置类中,甚至不要求依赖Bean必须采用JavaConfig声明
基于JavaConfig装配Bean可以组合使用@Bean和@Qualifier、@Primary或自定义注解处理歧义Bean