Spring自动装配

自动装配的概念

  1. 手动装配:以value或ref的方式明确指定属性值都是手动装配
  2. 自动装配:根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中。

装配模式

1.根据类型自动装配:将类型匹配的bean作为属性注入到另一个bean中。若IOC容器中有多个与目标bean类型一致的bean,Spring将无法判定哪一个bean最合适该属性,所以不能执行自动装配。
2.根据名称自动装配:必须将目标bean的名称和属性名设置的完全相同或
3.通过构造器自动装配:当bean中存在多个构造器时,此种自动装配方式将会很复杂,不推荐使用。
4.相对于使用注解的方式实现的自动装配,在XML文档中进行的自动装配略显笨拙,在项目中更多的使用注解的方式实现。

通过注解配置bean

概述
相对于XML方式而言,通过注解的方式配置bean更简洁和优雅,而且和MVC组件化开发的理念十分契合,是开发中常用的使用方式。
使用注解标识组件
1.普通组件:@Component pojo
标识一个受SpringIOC容器管理的组件
2.持久化层组件:@Repository mapper
标识一个受SpringIOC容器管理的持久化层组件
3.业务逻辑层组件:@Service service
标识一个受SpringIOC容器管理的业务逻辑层组件
4.表述的控制器组件:@Controller controller
标识一个受Sprign IOC容器管理的表述层控制器组件
5.组件命名规则
默认情况:使用组件的简单类名首字母小写后得到的字符串为bean的id
使用组件注解的value属性指定bean的id
注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将 @Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以 @Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确 当前的组件扮演的角色
扫描组件
在配置文件中添加扫描组件
Spring自动装配

<context:component-scan base-package=“com.dahua”></context:component-scan>
base-package="基础包“

组件装配
Spring自动装配

1)需求
Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到 Repository组件的实例。Spring可以通过注解的方式帮我们实现属性的装配。
2)实现依据
在指定要扫描的包时,context:component-scan 元素会自动注册一个bean的后置处 理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记 了@Autowired、@Resource或@Inject注解的属性。
3)@Autowired注解
①根据类型实现自动装配。
②构造器、普通字段(即使是非public)、一切具有参数的方法都可以应用@Autowired 注解
③默认情况下,所有使用@Autowired注解的属性都需要被设置。当Spring找不到匹 配的bean装配属性时,会抛出异常。
④若某一属性允许不被设置,可以设置@Autowired注解的required属性为 false
⑤默认情况下,当IOC容器里存在多个类型兼容的bean时,Spring会尝试匹配bean 的id值是否与变量名相同,如果相同则进行装配。如果bean的id值不相同,通过类 型的自动装配将无法工作。此时可以在@Qualifier注解里提供bean的名称。Spring 甚至允许在方法的形参上标注@Qualifiter注解以指定注入bean的名称。 ⑥@Autowired注解也可以应用在数组类型的属性上,此时Spring将会把所有匹配的bean进行自动装配。
⑦@Autowired注解也可以应用在集合属性上,此时Spring读取该集合的类型信息,然后自动装配所有与之兼容的bean。
⑧@Autowired注解用在java.util.Map上时,若该Map的键值为String,那么 Spring将自动装配与值类型兼容的bean作为值,并以bean的id值作为键。

4)@Resource
@Resource注解要求提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。
5)@Inject
@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。