spring实战——2、装配bean

时间:2022-01-18 20:33:31

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的配置更加强大、类型安全且易于重构。