Spring框架

2.9 引用外部属性文件

         当bean的配置信息逐渐增多时,查找和修改一些bean的配置信息就变得愈加困难。这时可以将一部分信息提取到bean配置文件的外部,以properties格式的属性文件保存起来,同时在bean的配置文件中引用properties属性文件中的内容,从而实现一部分属性值在发生变化时仅修改properties属性文件即可。这种技术多用于连接数据库的基本信息的配置。

2.9.1 直接配置

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

         <property name="user" value="root"/>

         <property name="password" value="root"/>

         <property name="jdbcUrl" value="jdbc:mysql:///test"/>

         <property name="driverClass" value="com.mysql.jdbc.Driver"/>

bean>

 

2.9.2 使用外部的属性文件

1. 创建properties属性文件

prop.userName=root

prop.password=root

prop.url=jdbc:mysql:///test

prop.driverClass=com.mysql.jdbc.Driver

 

2. 引入context名称空间

Spring框架_第1张图片

3.指定properties属性文件的位置

<context:property-placeholder location="classpath:jdbc.properties"/>

 

4.从properties属性文件中引入属性值

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

         <property name="user" value="${prop.userName}"/>

         <property name="password" value="${prop.password}"/>

         <property name="jdbcUrl" value="${prop.url}"/>

         <property name="driverClass" value="${prop.driverClass}"/>

bean>

 

2.10 自动装配

2.10.1 自动装配的概念

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

2.10.2 装配模式

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

2.10.3 选用建议

         相对于使用注解的方式实现的自动装配,在XML文档中进行的自动装配略显笨拙,在项目中更多的使用注解的方式实现。

2.11 通过注解配置bean

2.11.1 概述

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

 

2.11.2 使用注解标识组件

  1. 普通组件:@Component

                  标识一个受Spring IOC容器管理的组件

  1. 持久化层组件:@Repository

标识一个受Spring IOC容器管理的持久化层组件

  1. 业务逻辑层组件:@Service

标识一个受Spring IOC容器管理的业务逻辑层组件

  1. 表述层控制器组件:@Controller

标识一个受Spring IOC容器管理的表述层控制器组件

  1. 组件命名规则

         ①默认情况:使用组件的简单类名首字母小写后得到的字符串作为bean的id

         ②使用组件注解的value属性指定bean的id

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

 

2.11.3  扫描组件

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

  1. 指定被扫描的package

<context:component-scan base-package="com.atguigu.component"/>

 

  1. 详细说明

         ①base-package属性指定一个需要扫描的基类包,Spring容器将会扫描这个基类包及其子包中的所有类。

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

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

<context:component-scan

         base-package="com.atguigu.component"

         resource-pattern="autowire/*.class"/>

 

         ④包含与排除

              ●子节点表示要包含的目标类

注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些                               组件”这样的效果。即:通过将use-default-filters属性设置为false,                           禁用默认过滤器,然后扫描的就只是include-filter中的规则指定的                                 组件了。

              ●子节点表示要排除在外的目标类

              ●component-scan下可以拥有若干个include-filter和exclude-filter子节点

              ●过滤表达式

类别

示例

说明

annotation

com.atguigu.XxxAnnotation

过滤所有标注了XxxAnnotation的类。这个规则根据目标组件是否标注了指定类型的注解进行过滤。

assignable

com.atguigu.BaseXxx

过滤所有BaseXxx类的子类。这个规则根据目标组件是否是指定类型的子类的方式进行过滤。

aspectj

com.atguigu.*Service+

所有类名是以Service结束的,或这样的类的子类。这个规则根据AspectJ表达式进行过滤。

regex

com\.atguigu\.anno\.*

所有com.atguigu.anno包下的类。这个规则根据正则表达式匹配到的类名进行过滤。

custom

com.atguigu.XxxTypeFilter

使用XxxTypeFilter类通过编码的方式自定义过滤规则。该类必须实现org.springframework.core.type.filter.TypeFilter接口

 

  1. JAR包

必须在原有JAR包组合的基础上再导入一个:spring-aop-4.0.0.RELEASE.jar

2.11.4 组件装配

  1. 需求

         Controller组件中往往需要用到Service组件的实例,Service组件中往往需要用到       Repository组件的实例。Spring可以通过注解的方式帮我们实现属性的装配。

  1. 实现依据

         在指定要扫描的包时, 元素会自动注册一个bean的后置处     理器:AutowiredAnnotationBeanPostProcessor的实例。该后置处理器可以自动装配标记       了@Autowired、@Resource或@Inject注解的属性。

  1. @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值作为键。

                  

  1. @Resource

         @Resource注解要求提供一个bean名称的属性,若该属性为空,则自动采用标注处的变量或方法名作为bean的名称。

  1. @Inject

         @Inject和@Autowired注解一样也是按类型注入匹配的bean,但没有reqired属性。

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

你可能感兴趣的:(Java,大数据,Java培训)