1. 注解的方式配置Bean

首先我们先明白手动装配和自动装配的概念:

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

1.1 装配模式

autowire = “byName/byType”

  1. 根据类型自动装配:将类型匹配的bean作为属性注入到另一个bean中。若IOC容器中有多个与目标bean类型一致的bean,Spring将无法判定哪个bean最合适该属性,所以不能执行自动装配
  2. 根据名称自动装配:必须将目标bean的名称和属性名设置的完全相同
  3. 通过构造器自动装配:当bean中存在多个构造器时,此种自动装配方式将会很复杂。不推荐使用
1
2
3
4
5
6
7
8
9
10
11
12
13
<!--
byName:根据id来匹配,唯一匹配
byType:根据类型来匹配,能够匹配当前类型及其子类型。
默认是根据byName来匹配的

-->

<bean id="cart" class="cn.justweb.autowire.Cart" p:price="100001" p:brand="思域" autowire="byType"/>

<bean id="person" class="cn.justweb.autowire.Person" autowire="byName">
<property name="name" value="taoge"></property>
</bean>

1.2 注解配置

相对于XML方式而言,通过注解的方式配置bean更加简洁和优雅,而且和MVC组件化开发的理念十分契合,是开发中常用的使用方式。

  1. 普通组件:@Component 标识一个受Spring IOC容器管理的组件

  2. 持久化层组件:@Repository 标识一个受Spring IOC容器管理的持久化层组件

  3. 业务逻辑层组件:@Service标识一个受Spring IOC容器管理的业务逻辑层组件

  4. 表述层控制器组件:@Controller标识一个受Spring IOC容器管理的表述层控制器组件

组件命名规则

  • 默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id
  • 使用组件注解的value属性指定bean的id

注意:

​ 事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将**@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,所以 @Respository@Service@Controller**这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。

扫描组件:

组件被上述注解标识后还需要通过Spring进行扫描才能够侦测到。

指定被扫描的package

1
<context:component-scan base-package="cn.justweb.store"/>
  1. base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。

  2. 当需要扫描多个包时可以使用逗号分隔

  3. 如果仅希望扫描特定的类而非基包下的所有类,可使用resource-pattern属性过滤特定的类,示例:

    1
    2
    3
    <context:component-scan 
    base-package="com.justweb.store"
    resource-pattern="autowire/*.class"/>
  4. 包含与排除

必须在原有JAR包组合的基础上再导入一个:spring-aop-4.0.0.RELEASE.jar(这个包context包里面包含的有)

1.3 注解装配

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

* byName 根据名称注入。
* @Resource(name="userServiceImpl")
* private UserService service;
*
* 这种组合根据名称注入
* @Qualifiter
* @Inject@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。
* */

1.4 整合多个配置文件

  1. Spring允许通过<import>将多个配置文件引入到一个文件中,进行配置文件的集成。这样在启动Spring容器时,仅需要指定这个合并好的配置文件就可以。
  2. import元素的resource属性支持Spring的标准的路径资源
  3. classpath