2.1 Spring配置的可选方案
- 在xml中显示配置
- 在java中显示配置
- 隐式的bean发现机制和自动装配
尽量使用自动装配,当必须用显式配置时,尽量使用JavaConfig而不用XML,只有当你想使用便利的XML命名空间时,且不能在JavaConfig中实现时,才使用XML
2.2 自动化配置Bean
java从两个角度来实现自动装配
- 组件扫描:Spring会自动发现应用上下文中创建的Bean
- 自动装配:Spring自动满足bean之间的依赖
2.2.1 创建可被发现的Bean
- @component:在具体类上方加上
@Component
即声明该类可以被扫描到并作为组件类 - @ComponentScan:表明启用组件扫描如基于Java的Spring配置:
import ...
@Configuration
@ComponentScan
public class CDPlayerConfig{
}
上诉配置只会扫描配置类所在包或子包的组件类
或者在XML文件中配置:
<context:component-scan base-package="soundsystem" />
2.2.2 为组件扫描的bean命名
Spring应用上下文中所有的bean都会给定一个id,如果我们没有指定,那么一个类的id默认为把首字母换成小写的类名,也可以使用@component(“nameid”)
指定一个类的id,也可以使用@Name(“nameid”)
但一般都是用@component
2.2.3 设置组件扫描的基础包
使用@ComponentScan(“ClassPath”)
可以指定扫描哪个包,默认扫描基础包
也可以扫描多个基础包如:@ComponentScan(“ClassPath1”,"ClassPath2")
也可以使用@ComponentScan(“A.class”,"B.class")
,表示的是扫描该类所在包下的所有组件类
2.2.4 通过为bean添加注解实现自动装配
使用@Autowired
注解声明自动装配,该注解可以放在构造器上,setter()方法上,和声明的局部域上
不管在哪里声明了@AutoWired,Spring都会把这上面的依赖加载进来,如果没有匹配的bean,Spring就会抛出一个异常,为了避免异常的发生可以将@Autowired的required设置为false:@Autowired(required=false)
2.2.5 验证自动装配
2.3 通过Java代码装配Bean
当你是用第三方库中的类时,你并不能自己手动为类加上@component或者@autowired注解,那就必须用显式配置
2.3.1 创建配置类
最简单的JavaConfig类如下:
import ...
@Configuration
public class CDPlayerConfig{
}
2.3.2 声明简单的bean
要在JavaConfig中声明bean:
@Bean
public A class1(){
return new Class1();
}
默认情况下该Bean的id与这个方法的方法名一致
2.3.3 借助javaConfig实现注入
最简单的方法是引用创建bean的方法:
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(class1())//并不是直接调用class1方法,而是由Spring容器返回的实例对象
}
当然也可以这样:
@Bean
public CDPlayer cdPlayer(Class1 class1){
return new CDPlayer(class1)
}
2.4 通过XML装配Bean
尽量使用JavaConfig
2.4.1 创建XML配置规范
2.4.2 声明一个简单的
<bean id="class3" class="security.Class3" />
2.4.3 借助构造器注入初始化bean
XML中声明bean只有一种方法,但是DI却有多种方法:
- 构造器注入bean引用
<bean id="class3" class="security.Class3" >
<constructor-arg ref="compactDisc" />
</bean>
其他不常用
2.4.4 设置属性
<bean id="class3" class="security.Class3" >
<property name="compactDisc" ref="CompactDisc" />
</bean>
2.5 导入和混合配置
2.5.1 在JavaConfig中引用XML配置
我们可以将两个JavaConfig文件合并到一个更大的JavaConfig文件中:
@Configuration
@Import({CDPlayer.class,CDConfig.class})
public class SoundSystemConfig{}
也可以将XML和JavaConfig合并:
@Configuration
@Import(CDPlayer.class)
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig{}
2.5.2 在XML中引用JavaConfig
<import resource="cd-config.xml"
<bean class="soundsystem.CDConfig"
这样就可以在XML文件中使用JavaConfig文件中的配置