Spring IOC 容器的依赖注入工作可以分为两个阶段。第一个阶段可以认为是构建和收集 Bean 定义的阶段,在这个阶段中,我们可以通过 xml 或者 Java 代码的方式定义一些 Bean,然后通过手动组装或者让容器基于某种规则自动扫描的形式,将这些 Bean 定义收集到 IOC 容器中。下面是以XML配置的形式来注册一些 Bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 <bean id ="foo" class ="com.vincent.spring.Foo" /> <bean id ="dataSource" class ="com.vincent.spring.DataSource" > <constructor-arg value ="root" /> <constructor-arg value ="root" /> </bean > <bean id ="dataSource" class ="com.vincent.spring.DataSource" > <property name ="username" value ="root" /> <property name ="password" value ="root" /> </bean > <bean id ="foo" class ="com.vincent.spring.Foo" > <constructor-arg > <list > <value > 100</value > <value > 200</value > <value > 300</value > </list > </constructor-arg > </bean > <bean id ="foo" class ="com.vincent.spring.Foo" > <constructor-arg > <set > <value > 100</value > <value > 200</value > <value > 300</value > </set > </constructor-arg > </bean >
1 2 3 4 5 @Component @Component("foo")
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 @Resource @Resource("foo") public class Foo { private Bar bar; @Autowired public Foo (Bar bar) { this .bar = bar; } } @Resource(required = false)
如果觉得逐个收集 Bean 定义麻烦,想批量的将 Bean 收集并注册到容器之中,我们也可以配置批量扫描注册 Bean 的方式进行。下面分别是基于 XML 和 Java 配置的方式进行批量注册。
1 2 3 <context:component-scan base-package ="com.vincent.spring.framework.example" />
1 2 3 4 5 6 7 8 9 10 @ComponentScan @ComponentScan(basePackages = { "com.vincent.spring.framework.example.web", "com.vincent.spring.framework.example.service" }) @ComponentScan(basePackageClasses = com.vincent.spring.framework.example.SpringContextConfig.class)
当 Bean 都已经成功注册到 IOC 容器中后,IOC 容器会分析这些 Bean 之间的依赖关系,根据他们之间的依赖关系先后组装它们。比如 IOC 容器发现 JdbcCTemplate 这个 Bean 依赖于 dataSource,它就会将这个 Bean 注入给依赖它的那个 Bean 直到所有的 Bean 都依赖注入完成。至此,所有的 Bean 都组装完成。
代码案例:spring-framework-bean-example