2.1、spring配置的可选方案
spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系。我们作为开发人员,需要告诉spring如何通过这些bean之间的依赖关系将其组装起来。下面来介绍spring提供的三种装配模式:
a、在XML中进行显示配置;
b、在Java中进行显示配置;
c、隐式的bean发现机制和自动装配;
这三种配置方式具体哪种方式更为优秀,没有一个确定的答案,每种装配方式各有优缺点,本人总结如下:
优点 | 缺点 | |
a | 功能强大,提供了大量的用来装配bean的技巧 | 将bean的创建完全交给spring,bean的类型是以字符串形式设置在class属性中;如bean的类路径,如果没有编译器的检查,则会出错 |
b | 功能比XML更强大、类型安全且重构友好 | bean的创建交给程序员来控制,你可以以任何你可以创建bean的方式去创建一个对象(如反射、new)。 |
c | 开发人员需要配置的东西较少 | 功能不够强大,只能处理简单的装配bean |
2.2、自动化装配bean
spring需要从两个角度来实现自动化装配:
a、组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;
b、自动装配(autowirting):spring自动满足bean之间的依赖;
我们将组件扫描和自动装配组合在一起就能发挥出强大的威力,他们能够将你的显示配置降低到最少。
我们只需要使用Java或者xml配置spring的方式配置spring需要扫描的包,然后spring就可以将包中的bean(类)装配到spring容器中了。
a、Java配置方式:需要由spring生成的bean上添加@Component注解、
在Java配置类上添加@ComponentScan({"包路径1", "包路径2", "包路径3"})注解
b、xml配置方式:在spring的xml配置文件中添加<bean id="默认是bean的类名首字母小写" class="bean的路径名"/>
在spring的xml配置文件配置<context:component-scan base-package="包路径"/>
如果我们需要在bean中引入其所依赖的bean,我们可以通过以下两种方式进行配置:
a、在Java类中属性(依赖的bean)的setter方法或者构造方法上配置@Autowired注解
b、<bean />标签有一个字标签<property name="属性名" ref="需要注入的bean的id">可以实现注入依赖bean
2.3、通过Java代码装配bean
spring的自动化配置是spring所推荐的,但是有的情况下自动化配置的方案行不通,因此需要显式配置spring;比如说,你需要将第三方类库中的类应用到你的类中,可是该类是导成jar包的类,你不可能去人家的类上去加@Commpoent和@Autowired注解的,因此就不能使用自动装配的方案了。
正如之前所说,进行显示配置时,Java配置方式是更好的方案,因为它更强大、类型安全且对重构友好。因为它是Java代码,就像应用程序中其他的Java代码一样。虽然它是Java代码,但是它与Java代码又有所区别,它和我们应用中的业务逻辑代码是不同的,它不包含任何业务逻辑,Java配置类也不应该侵入到业务逻辑代码中。
1、创建一个Java配置类,在此类上使用@Configuration注解、@ComponentScan("扫描路径")注解
2、在此类中创建各种返回值为Java bean的方法,并且在方法上添加@Bean("id")注解
2.4、通过xml装配bean
这种方式网上教程很多,这里只是简单说明一下步骤:
1、创建xml配置规范——<beans />
2、声明bean——<bean />
这里说明一下给bean注入依赖bean,我们可以通过两种方式注入
1、<constructor-arg />元素或者<property />元素
2、spring3.0引入的c-命名空间或者p-命名空间
说明:c开头的两种方式是通过构造器注入参数,p开头的是通过setter方法注入参数(属性注入)。
2.5、导入和混合配置
在实际开发中,只是使用单一的配置spring方式是不够的,因此我们需要了解一下混合配置,因为spring中每种配置方案都不是互斥的,我们尽可以将Java配置和xml文件配置混合使用。
关于混合配置,我们首先需要了解的事是在自动装配时,它并不在意装配的bean来自哪里(这里指的是来自Java配置还是xml配置),自定装配时考虑的是spring容器中的所有bean。
a、在Java配置类(总/根:表示最终的配置类)中引用xml文件配置
@Import({Java配置类1.class,Java配置类2.class,Java配置类3.class})——导入子Java配置类
@ImportResource({"classpath:config1.xml","classpath:config2.xml","classpath:config3.xml"})——导入xml配置文件
b、在xml文件(总/根:表示最终的配置文件)配置中引用Java配置
<import resource="config1.xml" />——导入子xml配置文件
<bean class="javaConfig" />——导入Java配置类
总结:
在本章中我学习了spring装配bean的三种主要方式:自动化配置、Java配置、xml配置;不论采用了哪种配置方式,这些配置信息都是用来描述应用中的组件(bean)以及组件之间的关系(依赖)的。
我们应该尽可能使用自动化配置,以避免显式配置所带来的维护成本。但是,在实际开发中如果确实需要使用显式配置spring的话,应优先选择基于Java的配置方式,因为它比基于xml的配置更加强大、类型安全且易于重构。