引入 |
在这之前,想必大家都使用过<import/>
标签,它可以从其他的配置文件中加载Bean,例如这样:
---GlobalBeans.xml
<beans>
<bean id="c" class = "com.xxx.C"></bean>
<import resource="beans1.xml"/>
<import resource="beans2.xml"/>
</beans>
----beans1.xml
<beans>
<bean id="a",class = "com.xxx.A"></bean>
</beans>
----beans2.xml
<beans>
<bean id="b",class = "com.xxx.B"></bean>
</beans>
如上,GlobalBeans.xml中声明了C类的实例,并且使用import标签导入了beans1.xml和beans2.xml配置文件。最终效果等同于如下代码块:
---GlobalBeans.xml
<beans>
<bean id="c" class = "com.xxx.C"></bean>
<bean id="a",class = "com.xxx.A"></bean>
<bean id="b",class = "com.xxx.B"></bean>
</beans>
所以下面的代码块也会得到正确的结果。
ApplicationContext ctx = new AnnotationConfigApplicationContext(GlobalBeans.class);
// now both beans A and B and Cwill be available...
A a = ctx.getBean(A.class);
B b = ctx.getBean(B.class);
C c = ctx.getBean(C.class);
在这里你可能会想,那为什么不直接将所有bean的定义都写在GlobalBeans配置文件中,这样还避免了import的过程。
这是因为:
- 如果将所有Bean的定义都放在全局配置文件中,在未来Bean特别多的情况下,该配置文件将会显得特别臃肿;
- 在不同的配置文件中定义不同类型的bean,可以使得配置模块化;(在这里是合而分之)
- 通过import,可以选择性得进行导入。
@import注解 |
@Configuration
public class ConfigA {
@Bean
public A a() {
return new A();
}
}
@Configuration
public class ConfigB {
@Bean
public B b() {
return new B();
}
}
@Configuration
@Import({ConfigA.class,ConfigB.class})
public class SystemConfig {
}
以SystemConfig配置类初始化Spring容器,分别获取在ConfigA和ConfigB配置类中定义的Bean。如下访问将是合法的。
public static void main(String[] args) {
ApplicationContext ctx = new AnnotationConfigApplicationContext(SystemConfig.class);
// now both beans A and B will be available...
A a = ctx.getBean(A.class);
B b = ctx.getBean(B.class);
}
@import注解可以帮助我们将多个配置文件(可以是按功能划分,也可以是按业务划分)导入到单个主配置文件中,这样我们就可以从导入的配置类中加载对应Bean,以达到统一配置的目的。(在这里是分而合之)
@import注解 TODO import other way |