Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系。当描述bean如何进行装配时,Spring具有非常大的灵活性,它提供了三种主要的装配机制:
- 在XML中进行显示配置
- 在Java中进行显示配置
- 隐式的bean发现机制和自动装配
1.自动化装配bean
Spring从两个角度来实现自动化装配:
- 组件扫描:Spring会自动发现应用上下文中所创建的bean
- 自动装配:Spring自动满足bean之间的依赖
组件扫描和自动装配组合在一起就能发挥出强大的威力,它们能够将你的显式配置降低到最少。
组件扫描:使用@ComponentScan注解会自动扫描包下所有使用@Service、@Component、@Repository、@Controller类并注册成为Bean(可以更改包的名称)。
自动装配:@Autowired可以对成员变量、方法、构造函数进行注释(默认按照类型进行装配)。
2.通过Java代码装配bean
有些场景是没有办法使用自动化装配的,如要将第三方库中的组件装配到你的应用中(这种没有办法对类使用注解,不能够更改源代码),可以使用显示装配的方式。显示装配又分为XML和Java。我们先来介绍一下Java代码装配的方式。
步骤:
(1)创建配置类
新建一个配置类,使用@Configuration注解。(相当于XML方法中对应的xml文件)
(2)声明简单的bean
在配置类的中的方法上使用@Bean注解,告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的bean。方法体中包含了最终产生bean实例的逻辑。(相当于xml文件中的bean标签)
(3)借助JavaConfig实现注入
在JavaConfig中装配bean的最简单的方式就是引入创建bean的方法。如:
@Configuration
public class CDPlayerConfig(){
@Bean
public CompactDisc compactDisc(){
return new CompactDisc();
}
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(compactDisc());
}
}
3.使用XML装配bean
步骤:
(1)创建XML配置规范:
在使用XML为Spring装配bean之前,你需要创建一个新的配置规范。在使用JavaConfig的时候,这意味着要创建一个带有@Configuration注解的类,而在XML配置中,这意味着要创建一个XML文件,并且要以beans标签元素为根。
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
xmlns:tx="http://www.springframework.org/schema/tx">
</beans>
(2)声明一个简单的bean标签
<bean class="soundsystem.CompactDisc" />
(3)注入
例如:
<bean id="dataSource"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
将dataSource注入到了sessionFactory中。