手动装配
以value或ref的方式明确指定属性值都是手动装配
自动装配 *
根据指定的装配规则,不需要明确指定,Spring自动将匹配的属性值注入bean中。
根据类型自动装配:byType
使用bean的属性的类型与IOC容器中<bean>的class进行匹配。 如果唯一匹配则装配成功
如果匹配到多个兼容类型的bean。则抛出异常
根据名称自动装配:byName
使用bean的属性名与IOC容器中<bean>的id值进行匹配. 匹配成功则装配成功.
constructor:通过构造器进行自动装配,no:不进行自动装配(关闭),default:使用父标签beans配置的装配方式(default-autowire指定的装配方式)
注解实现自动装配(必须掌握) *
相对于XML方式而言,通过注解的方式配置bean更加简洁和优雅,而且和MVC组件化开发的理念十分契合,是开发中常用的使用方式。
分层注解
普通组件:@Component
标识一个受Spring IOC容器管理的组件,比如有个类要交给spring的Ioc容器管理,只要在类上加这个注解就可以了,这个只是普通的组件,没有特殊含义
持久化层组件:@Repository
标识一个受Spring IOC容器管理的持久化层组件
业务逻辑层组件:@Service
标识一个受Spring IOC容器管理的业务逻辑层组件
控制层/表述层控制器组件:@Controller
标识一个受Spring IOC容器管理的表述层控制器组件
组件命名规则
默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id
使用组件注解的value属性指定bean的id
注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以 @Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色,在使用上基本是没有区别的。
组件扫描
组件被上述注解标识后还需要通过Spring进行扫描才能够侦测到
核心配置文件增加配置:<context:component-scan base-package="com.kgc.spring.annotation"></context:component-scan>
扫描加了注解的类,并管理到IOC容器中 base-package: 基包. Spring会扫描指定包以及子包下所有的类,将带有注解的类管理到IOC容器中当需要扫描多个包时可以使用逗号分隔
指定扫描和排除扫描
指定扫描
<context:include-filter>子节点表示要包含的目标类
通常需要与父标签的use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则指定的组件了。否则不生效
排除扫描
<context:exclude-filter>子节点表示要排除在外的目标类
过滤扫描方式
根据注解
按照注解方式进行指定,注意type和expression(注解的全类名),推荐用法
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
根据类型
按照指定类进行指定,注意type和expression(具体类的全类名)
<context:include-filter type="assignable" expression="com.kgc.spring.annotation.controller.Controller"/>
组件自动装配
需求:Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到 Repository组件的实例。Spring可以通过注解的方式帮我们实现属性的装配。
原理:在指定要扫描的包时,<context:component-scan> 元素会自动注册一个bean的后置处 理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以 自动装配标记 了@Autowired、@Resource或@Inject注解的属性。
@Autowired注解
工作机制
首先会使用byType的方式进行自动装配,如果能唯一匹配,则装配成功,
如果匹配到多个兼容类型的bean,还会尝试使用byName的方式进行唯一确定
如果能唯一确定,则装配成功,如果不能唯一确定,则装配失败,抛出异常.
属性配置
默认情况下, 使用@Autowired标注的属性必须被装配,如果装配不了,也会抛出异常
可以设置@Autowired注解的required属性为 false,实现允许不必须被装配(容器中找不到的情况,如果多个匹配,不适用)
@Qualifier注解
如果匹配到多个兼容类型的bean,可以使用@Qualifier来进一步指定要装配的bean的id值
在自动装配的成员对象变量上,增加注解:@Qualifier("目标bean的idl")
@Resource注解
Resource注解,也可以实现自动装配,但是这个不是spring的注解,是jdk提供的,实现自动装配原理,正好跟Autowired注解是相反的(先根据名称,再根据类型)
提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。
@Inject注解
@Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有required属性
了解即可