Spring容器负责创建应用程序中的Bean,并通过依赖注入协调这些对象之间的关系。创建应用对象之间协作关系的行为通常成为装配。
基于XML的Bean装配
Spring提供了两种基于XML的装配方式:属性setter方法注入和构造方法注入。在Spring实例化Bean过程中,Spring首先会调用Bean的默认构造方法来实例化Bean对象,然后通过反射的方式调用setter方法来注入属性值。属性setter方法注入要求Bean必须满足两点:
- Bean类必须提供一个默认的构造方法。
- Bean类必须为需要注入的属性提供对应的setter方法。
在spring配置文件中,使用属性setter方法注入时,在<bean>
元素的子元素<property>
中为每个属性注入值;使用构造方法注入时,在<bean>
元素的子元素<constructor-arg>
中定义构造方法的参数,可使用其value属性或子元素来设置该参数的值。
<bean id = "adminInfo" class = "com.ssm.entity.AdminInfo">
<property name = "id value = "5"></property>
<constructor-arg name = "name" value = "admin"/>
<constructor-arg name = "pwd" value = "123456"/>
</bean>
基于Annotation的Bean装配
如果应用中bean数量较多,会导致xml配置文件过于臃肿,从而给维护和升级带来一定的困难。
Spring中定义了一系列的注解
-
@Component
使用此注解描述Spring中的Bean,仅仅表示一个组件(Bean),可以作用在任何层次。使用时只需要将该注解标注在相应类上。 -
@Repository
用于将数据访问层(DAO层)的类标识为Spring中的Bean -
@Service
用于将业务层(Service层)的类标识为Spring中的Bean -
@Controller
作用于控制层(如Spring MVC的Controller),用于将控制层的类标识为Spring中的Bean -
@Autowired
用于对Bean的属性变量、属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作。
@Autowired注解默认按照Bean类型进行装配。
@Autowired注解加上@Qualifier注解,可直接指定一个Bean实例名称来进行装配 -
@Resource
作用相当于@Autowired,配置对应的注解处理器完成Bean的自动配置工作。区别:
@Autowired默认按照Bean类型进行装配
@Resource默认按照Bean实例名称进行装配@Resource包括name和type两个重要属性,Spring将name属性解析为Bean实例的名称,将type属性解析为Bean实例的类型。如果指定name属性,则按照实例名称进行装配;如果指定type,则按照Bean类型进行装配。如果都不指定,则先按照Bean实例名称装配,如果不能匹配,再按照Bean类型进行装配,如果都无法匹配,则抛出NoSuchBeanDefinitionException异常
-
@Qualifier
与@Autowired注解配合,将默认按Bean类型装配修改为按Bean实例名称进行装配,Bean的实例名称由@Qualifier注解的参数指定。
在实际开发中,通常使用@Repository标注数据访问层(DAO层),@Service标注业务逻辑层(Service层),@Controller标注控制器层(Controller层)
自动装配
Spring的<bean>
元素中包含一个autowire属性,可通过设置autowire属性来自动装配Bean,就是将一个Bean注入到其他Bean的Property中。
autowire属性值:
- default
默认值,由<bean>
的上级标签<beans>
的default-autowire属性值确定。例如<beans default-autowire = "byname">
,则该<bean>
元素中的autowire属性对应的属性值就是byName。 - byName
根据Property的Name自动装配,如果一个Bean的name和另一个Bean中的property的name相同,则自动装配这个Bean到Property中。 - byType
根据Property的数据类型(TYPE)自动装配,如果一个Bean的数据类型和另一个Bean中的property的数据类型相同,则自动装配这个Bean到Property中。 - constructor
根据构造函数参数的数据类型,进行byType模式的自动装配。 - autodetect
如果发现默认的构造函数,用constructor模式,否则用byType模式 - no
默认情况下,不适用自动装配,Bean依赖必须通过ref元素定义。
对于大型的应用、不鼓励使用自动装配。虽然使用自动装配可减少配置文件的工作量,但大大降低了依赖关系的清晰性和透明性。依赖关系的装配依赖于源文件的属性名,导致Bean和Bean之间的耦合降低为代码层次,不利于高层次的解耦。
来源《SSM框架技术精讲与整合案例》