一、 通过注解配置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. java代码。从键盘输入次数。可控制的

    总结:把一碗水端平,本来水就不多. package com.b; import java.util.Scanner; //想办法用数组.一次性,多个的输出分解质因数 public class fa4 ...

  2. 2018年长沙理工大学第十三届程序设计竞赛 E小木乃伊到我家(spfa模版)

    链接:https://www.nowcoder.com/acm/contest/96/E来源:牛客网 小木乃伊到我家 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  3. 高效C#编码优化

    1.foreach VS for 语句 Foreach 要比for具有更好的执行效率Foreach的平均花费时间只有for的30%.通过测试结果在for和foreach都可以使用的情况下,我们推荐使用 ...

  4. socket模型

    Socket: "主机" + "端口" = 套接字/插座; 仅仅是一个通信模型,不属于七层协议(网络协议). 一台电脑(IP)的一个应用程序(端口) 和 另一台 ...

  5. [Chapter 3 Process]Practice 3.2 Including the initial parent process, how many processes are created by the program shown in Figure?

    3.2 Including the initial parent process, how many processes are created by the program shown in Fig ...

  6. c# webapi2 实用详解

    本文介绍webapi的使用知识 发布webapi的问题 配置问题 webapi的项目要前端访问,需要在web.config配置文件中添加如下配置 在system.webServer节点下面添加 < ...

  7. SqlServer——事务—隔离级别

    隔离实际上是通过锁来实现的,作用于整个事务,它通常在事务开始前指定,如 SET TRANSACTION ISOLATION LEVEL READ Committed,指定后面的事务为 已提交读:而锁是 ...

  8. 用SSIS包导入数据

    创建一个简单ETL包.打开 Step 1:创建新的Integration Services项目 在开始菜单中找到SQL Server Data Tools并打开,在Microsoft SQL Serv ...

  9. PCL — Point Pair Feature 中层次点云处理

    博客转载自:http://www.cnblogs.com/ironstark/p/5971976.html 机器人视觉中有一项重要人物就是从场景中提取物体的位置,姿态.图像处理算法借助Deep Lea ...

  10. Windows libQGLViewer2.7.0,libQGLViewer2.6.2与g2o20160427, g2o20170730编译生成G2O

    1. Win10, VS2013, libQGLViewer2.6.2 和 QT5.6.3编译时候会出错,初步判断libQGLViewer2.6.2不支持QT5 错误 error LNK1120: 个 ...