Spring实战随笔(二)装配Bean
之前学习了Spring的核心概念,其中DI是spring最基本要素,因为在Spring中随时都在使用。DI创建了对象之间的协作关系,称之为装配,Spring中装配bean就是配置Spring容器的过程。
有三种方式配置容器:
1.隐式的bean发现机制和自动配置
2.在JAVA中显式配置
3.在XML中显式配置
根据项目需要来选择相应的配置方案。
- 自动化装配Bean
Why:方便
Spring从两个角度实现自动化装配:
-
组件扫描: Spring自动发现ApplicationContext中创建的bean
@Component: Spring寻找带该注解的类,并为其创建bean,这个注解不会开启组件扫描。
@ComponentScan: 这个注解会扫描当前类包+子包下所有带@Component注解的类创建bean,并且它会开启组件扫描。效果等同于用XML的<context:component-scan>.
Spring自动创建的bean id默认为class名,可以自己@Component("tricker")来命名。 -
自动装配: Spring自动满足bean之间的依赖
@Autowired: 该注解能放在类中任一方法上,会自动装配需要的所有bean,如果找不到匹配的会自动抛出异常,如果找到多个也会抛出异常需要明确指定是哪个。
-显式配置Bean
Why: 有时候自动化配置行不通,譬如使用了第三方库,不可能在第三方库类上加注解
- 在JAVA中显式配置Bean
JavaConfig方式,通过@Configuration @Bean显式配置。
@Configuration
public class PaymentJavaConfig {
@Bean
public ILogger getIlogger() {
return new ConsoleLogger();
}
@Bean
public PaymentActionMixed getPaymentActionMixed(ILogger logger) {
return new PaymentActionMixed(logger);
}
}
- 在XML中显式配置Bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context">
<!-- configuration details go here -->
<bean class="soundsystem.SgtPeppers" />
<!-- 构造器注入 -->
<constructor-arg value="Sgt. Pepper's Lonely Hearts Club Band" />
</bean>
<bean id="cdPlayer" class="soundsystem.CDPlayer">
<!-- 属性注入 -->
<property name="compactDisc" ref="compactDisc" />
</bean>
</beans>
还有些c命名空间(c:cd-ref)、p命名空间(p:compactDisc-ref)、util命名空间<util:list>
缺点:无法校验,安全性太差,不会在编译期就检查该类是否存在(不过如果用Spring Tool Suite的话可以);而且比JAVA Config方式要麻烦很多,还需要声明XSD
- JAVA Config和XML混合使用
- JavaConfig中引用XML声明的bean
@Configuration
// 导入通过JAVAConfig声明的bean:CDPlayerConfig
@Import(CDPlayerConfig.class)
// 导入cd-config.xml中声明的bean
@ImportResource("classpath:cd-config.xml")
public class SoundSystemConfig {
}
- XML中引用JavaConfig声明的bean
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- XML中声明bean -->
<bean id="cdPlayer" class="soundsystem.CDPlayer" c:cd-ref="compactDisc" />
<!-- 导入JAVAConfig中声明的bean -->
<bean class="soundsystem.CDConfig" />
<!-- 导入其他XML文件中声明的bean -->
<import resource="cdplayer-config.xml" />
</beans>
- Summary
尽量用自动化配置bean,避免显示配置带来的代码和维护成本。如果一定要显示,JAVAConfig优于XML。这里学习了Spring的集中装配方式,但是Spring还有更高的装配的需求,接下来继续学习Spring高级装配。