zoukankan      html  css  js  c++  java
  • Spring IOC机制之使用注解配置bean

    一、 通过注解配置bean

      1.1       概述

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

      1.2       使用注解标识组件

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

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

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

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

          ⑤组件命名规则

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

              [2]使用组件注解的value属性指定bean的id

      注意:事实上Spring并没有能力识别一个组件到底是不是它所标记的类型,即使将@Respository注解用在一个表述层控制器组件上面也不会产生任何错误,

         所以@Respository、@Service、@Controller这几个注解仅仅是为了让开发人员自己明确当前的组件扮演的角色。

      1.3       扫描组件

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

        ①指定被扫描的package

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

     

        ②详细说明

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

            [2]当需要扫描多个包时可以使用逗号分隔,也可以使用通配符*进行匹配。

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

    <context:component-scan

           base-package="com.neuedu.component"

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

     

            [4]包含与排除

              ●<context:include-filter>子节点表示要包含的目标类

            注意:通常需要与use-default-filters属性配合使用才能够达到“仅包含某些组件”这样的效果。

            即:通过将use-default-filters属性设置为false,禁用默认过滤器,然后扫描的就只是include-filter中的规则指定的组件了。

              ●<context:exclude-filter>子节点表示要排除在外的目标类

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

              ●其中include-filter和exclude-filter的属性type取值及含义:

                  assignable:根据全类名匹配引入项或排除项

                  annotation:根据注解匹配引入项或排除项

              ●过滤表达式

    类别

    示例

    说明

    annotation

    com.neuedu.XxxAnnotation

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

    assignable

    com.neuedu.BaseXxx

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

    aspectj

    com.neuedu.*Service+

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

    regex

    com.neuedu.anno.*

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

    custom

    com.neuedu.XxxTypeFilter

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

     

        ③JAR包

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

      1.4       组件装配

        ①需求

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

                  ②实现依据

          在指定要扫描的包时,<context:component-scan> 元素会自动注册一个bean的后置处理器:AutowiredAnnotationBeanPostProcessor的实例。

            该后置处理器可以自动装配标记了@Autowired、@Resource或@Inject注解的属性。

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

         ④@Resource

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

        ⑤@Inject

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

    二、具体步骤:

      ①声明bean的注解

        @Component 将当前类声明为IOC容器中的一个普通的组件

        @Controller 将当前类声明为IOC容器中的一个控制器组件

        @Service 将当前类声明为IOC容器中的业务逻辑层组件

        @Repository 将当前类声明为IOC容器中的一个持久化层组件

          Spring根据上述注解其实并不能分辨当前类是否真的是一个控制器或Dao,即使标记的类和注解不对应也没有语法错误。但在实际工作中,肯定要将专门的注解标记在对应的类上面。

      ②使用基于注解的bean的配置,需要额外导入一个jar包:spring-aop-4.0.0.RELEASE.jar

      ③需要设置自动扫描的包

        < context:component-scan base-package ="com.neuedu.ioc.bean"/>

      ④使用注解后,默认按照类名首字母小写作为id的值,也可以在注解中使用value属性指定id,value属性名也可以省略注解

        注解 id值
          @Component
            public class CommonComponent {
            }

          @Controller(value="neueduBookAction" )
            public class BookAction {

            }

          @Service("happyService" )
            public class BookService {

            }

      ⑤使用注解进行自动装配:@Autowired注解[好处就是:连get、set方法都不用写!]

        [1]首先检测标记了@Autowired注解的属性的类型

        [2]根据类型进行装配

        [3]如果指定类型的bean不止一个,那么根据需要被装配的属性的属性名做id的值,查找bean

        [4]如果根据id值还是没有找到bean,可以使用@Qualifier注解手动指定要装配的bean的id.

  • 相关阅读:
    文件操作
    需特别注意的地方(关于内存机制)
    数据类型的汇总和功能
    python之http请求及响应
    8.centos7进入单用户
    Android Studio使用总结
    django之数据库models
    django之错题集
    python之mysql安装配置
    python之pycharm的debug调试使用
  • 原文地址:https://www.cnblogs.com/java-zmj/p/8021686.html
Copyright © 2011-2022 走看看