一、 通过注解配置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.

Spring IOC机制之使用注解配置bean的更多相关文章

  1. spring Ioc容器之使用XML配置Bean

    1.项目截图 2.创建xml文件 3.打印机接口 package com.example.demo.computerTest; public interface Printer { void init ...

  2. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等

    实验1:配置通过静态工厂方法创建的bean  [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory { private st ...

  4. Spring(十五):通过注解配置 Bean

    在ClassPath中扫描组件 1)组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件: 2)特定组件包含: --- @C ...

  5. IDEA02 利用Maven创建Web项目、为Web应用添加Spring框架支持、bean的创建于获取、利用注解配置Bean、自动装配Bean、MVC配置

    1 环境版本说明 Jdk : 1.8 Maven : 3.5 IDEA : 专业版 2017.2 2 环境准备 2.1 Maven安装及其配置 2.2 Tomcat安装及其配置 3 详细步骤 3.1 ...

  6. Spring 注解配置Bean

    一.使用注解配置Bean 1.注解 在类定义.方法定义.成员变量定义前使用.其简化<bean>标签,功能同<bean>标签.格式为: @注解标记名. 2.组件扫描 Spring ...

  7. Spring框架入门之基于Java注解配置bean

    Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...

  8. 通过注解配置Bean

    之前说的三种配置方式,都是使用XML配置,现在我们说说使用注解配置Bean. 这部分内容主要分为两个部分:使用注解配置Bean,使用注解配置Bean属性. 在classpath中扫描组件 组件扫描:S ...

  9. Spring IOC 源码简单分析 02 - Bean Reference

    ### 准备 ## 目标 了解 bean reference 装配的流程 ##测试代码 gordon.study.spring.ioc.IOC02_BeanReference.java   ioc02 ...

随机推荐

  1. eclipse项目中将普通文件夹转化成资源文件夹

    1.点选该文件夹 2.右键属性Properties 3.选择属性:Build Path 4.点选属性:Use as  Source Folder ......等待变成资源文件夹 参考更详细的: ecl ...

  2. linux命令 把Windows 文件拷贝到linux

    scp build.zip mesadmin@dpydalapp01.sl.bluecloud.ibm.com:/tmp   // 把Windows上的build.zip拷贝到mesadmin@dpy ...

  3. DDD学习笔录——简介DDD的战术模式、问题空间和解空间

    DDD的战术模式 DDD的战术模式(也称为模型构造块)是一个帮助创建 用于复杂有界上下文的有效模型的 模式集合. 也就是我们常说的设计模式. 问题空间 问题空间将问题域提炼成更多可管理的子域,是真对于 ...

  4. Git分支和指针

    Git中的分支本质上是个指向commit对象的指针. 在当前commit点创建一个新的分支test git branch test 创建了一个新的可变指针指向f30ab  commit Git 是如何 ...

  5. 信号量sem 的用法

    #include <semaphore.h> sem_t sem; sem_init(&sem, 0, 0); sem_post(&sem); sem_wait(& ...

  6. adb pull 和 adb push

    1. 操作单个文件 通过adb push,则可将文件添加到SD卡中.如果想在push的时候修改文件名称的话,只需要修改push的第二个参数改成完整路径(目录+文件名),如/sdcard/test-0. ...

  7. 使用GSON来生成JSON数据

    第二种方法: 当不需要显示某个属性时,在不需要显示出的属性前加transient关键字即可满足 使用gson来解析 使用gson解析 带日期转换 集合类解析:gson中的数组与java中集合类都是对应 ...

  8. js中的各种宽高

    在设计页面时可能经常会用到固定层的位置,这就需要获取一些html对象的坐标以更灵活的设置目标层的坐标,这里可能就会用到document .body.scrollTop等属性,但是此属性在xhtml标准 ...

  9. JS继承方式详解

    js继承的概念 js里常用的如下两种继承方式: 原型链继承(对象间的继承) 类式继承(构造函数间的继承) 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念.所以,要想实现 ...

  10. css知多少(5)——选择器(转)

    css知多少(5)——选择器   1. 引言 从本节开始,就进入本系列的第二个部分——css和html的结合——说白了就是选择器. CSS中定义了样式,如何将这些样式设置到相应的html节点上?就不得 ...