在工作中碰到了好多的配置文件,具体来说是spring 中bean配置的parent的配置,搞的我一头雾水,仔细看一下spring中有关bean的配置,剖析一下,具体什么含义!

一、Spring IoC容器和beans的介绍

1、Spring框架实现控制反转(IoC)的原理。IoC又叫依赖注入(DI)。它描述了对象的定义和依赖的一个过程,也就是说,依赖的对象通过构造参数、工 厂方法参数或者属性注入,当对象实例化后依赖的对象才被创建,当创建bean后容 器注入这些依赖对象。这个过程基本上是反向的,因此命名为控制反转(IoC),它通过直接使用构造类来控制实例化,或者定义它们之间的依赖关系,或者类似于服务定位模式的一种机制。

2、org.springframework.beans 和 org.springframework.context 是Spring框 架中IoC容器的基础, BeanFactory 接口提供一种高级的配置机制能够管理任何 类型的对象。 ApplicationContext 是 BeanFactory 的子接口。它能更容易集 成Spring的AOP功能、消息资源处理(比如在国际化中使用)、事件发布和特定的 上下文应用层比如在网站应用中的 WebApplicationContext。 总之, BeanFactory 提供了配置框架和基本方法, ApplicationContext 添加 更多的企业特定的功能。 ApplicationContext 是 BeanFactory 的一个子接 口,在本章它被专门用于Spring的IoC容器描述。

3、在Spring中,由Spring IoC容器管理的对象叫做beans。 bean就是由Spring IoC容 器实例化、组装和以其他方式管理的对象。此外bean只是你应用中许多对象中的一 个。Beans以及他们之间的依赖关系是通过容器配置元数据反映出来。

二、spring中容器的介绍

1、org.springframework.context.ApplicationContext 接口代表了Spring Ioc容 器,它负责实例化、配置、组装之前的beans。容器通过读取配置元数据获取对象 的实例化、配置和组装的描述信息。它配置的0元数据用xml、Java注解或Java代码 表示。它允许你表示组成你应用的对象以及这些对象之间丰富的内部依赖关系。

2、Spring提供几个开箱即用的 ApplicationContext 接口的实现类。在独立应用程 序中通常创建一 个 ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext 实例对象。虽然XML是用于定义配置元数据的传统格式,你也可以指示容器使用 Java注解或代码作为元数据格式,但要通过提供少量XML配置来声明启用对这些附 加元数据格式的支持。

3、在大多数应用场景中,显示用户代码不需要实例化一个或多个Spring IoC容器的实 例。

三、bean 中的parent属性

这个在spring-framework 5.0官方文档中都很少见,但是在文档中还是有一点定义的,在定义事务代理的一个小块中找到了一点,也就值找到了这一点,呵呵了。。。

1、创建代理的父模板

特别是在定义事务代理时,最终可能有许多类似的代理定义。 使用父、子bean定 义,以及内部bean定义,可能会使代理的定义更加清晰和简明。

 //定义代理父模板
<bean id="txProxyTemplate" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager" ref="transactionManager"/>
  <property name="transactionAttributes">
    <props>
    <prop key="*">PROPAGATION_REQUIRED</prop>
    </props>
  </property>
</bean>

这个定义自身永远不会实例化,所以实际上是不完整的定义。 然后每个需要被创建的代理,只需要一个子bean的定义,将目标对象包装成一个内部类定义,因为目标对象永远不会直接被使用。

2、创建子bean

 //简单的子bean定义
<bean id="myService" parent="txProxyTemplate">
  <property name="target">
    <bean class="org.springframework.samples.MyServiceImpl">
    </bean>
  </property>
</bean>

当然也可以覆盖父模板的属性,例如在本示例中,事务传播的设置:

 <bean id="mySpecialService" parent="txProxyTemplate">
  <property name="target">
    <bean class="org.springframework.samples.MySpecialServiceImpl">
    </bean>
  </property>
  <property name="transactionAttributes">
    <props>
      <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
      <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
      <prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>
      <prop key="store*">PROPAGATION_REQUIRED</prop>
    </props>
  </property>
</bean>

需要主意的是,在上面的示例中,我们通过 abstract 属性明确的将父bean标记为抽象定义, 就如前面介绍的子bean定义,因此该父bean永远不会被实例化。 应用上下文(不是简单的bean工厂)默认会预先实例化所有单例。 因此,重要的是,如果你有一个仅仅想作为模板的bean(父bean)定义,并且指定了该bean的 class, 那么你必须保证该bean的 abstract 属性被置为 tue ,否则应用上下文 会尝试在实际中预先实例化该bean。

总结:这个用法的好处就是可以优化代码,很多相同的代码可以抽取出来,直接放到父bean中,然后在子bean中增加一些独特的属性或者方法,简单整洁,扩展性强,但是,这里并不是继承关系,并不是extends,spring官方文档说是子bean将目标对象包装成一个内部类定义,这个具体在内存中如何存储以及调用不是很明白,这里存在一点点的问题,记录下来,我再研究一下内部类!!!

Java中的内部类:

内部类的访问特点:
  A:内部类可以直接访问外部类的成员,包括私有。
  B:外部类要访问内部类的成员,必须创建对象。

spring中bean的配置详解--定义parent的更多相关文章

  1. Spring中bean的scope详解

    如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...

  2. Spring学习 6- Spring MVC (Spring MVC原理及配置详解)

    百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...

  3. vue-cli 中的 webpack 配置详解

    本篇文章主要介绍了 vue-cli 2.8.2 中的 webpack 配置详解, 做个学习笔记 版本 vue-cli 2.8.1 (终端通过 vue -V 可查看) vue 2.2.2 webpack ...

  4. tomcat中server.xml配置详解(转载)(一)

    转载自:https://www.cnblogs.com/starhu/p/5599773.html tomcat中server.xml配置详解 Tomcat Server的结构图如下:(该文件描述了如 ...

  5. Spring 入门 web.xml配置详解

    Spring 入门 web.xml配置详解 https://www.cnblogs.com/cczz_11/p/4363314.html https://blog.csdn.net/hellolove ...

  6. Struts2中 Result类型配置详解

    一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwor ...

  7. Spring中bean的配置

    先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就表示当前模块已经 ...

  8. Spring中的事务管理详解

    在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...

  9. Spring中注解的使用详解

    一:@Rsource注解的使用规则 1.1.案例演示 Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件 ...

随机推荐

  1. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时1

    课时1 计算机视觉历史回顾与介绍上 CS231n:这一一门关于计算机视觉的课程,基于一种专用的模型架构,叫做神经网络(更细一点说,是卷积神经网络CNN).计算机视觉是人工智能领域中发展最为迅猛的一个分 ...

  2. ORACLE PL/SQL 实例精解之第七章 迭代控制之二

    7.1CONTINUE语句 CONTINUE语句会导致循环终止当前迭代.并且当CONTINUE的条件为TRUE时,开始执行该循环的下一次迭代.需要借助于IF语句来计算COUNTINUE条件.当CONT ...

  3. 在线抠图网站速抠图sukoutu.com全面技术解析之canvas应用

    技术关键词 Canvas应用,泛洪算法(Flood Fill),图片缩放,相对位置等比缩放,判断一个点是否在一个平面闭合多边形,nginx代理 业务关键词 在线抠图,智能抠图,一键抠图,钢笔抠图,矩阵 ...

  4. 20170406-ms

    Interval 间隔 revoke v撤销 alert adj 警觉的 n警报

  5. 骨骼蒙皮动画(Skinned Mesh)的原理解析(二)

    http://blog.csdn.net/jimoshuicao/article/details/9283071 2)蒙皮信息和蒙皮过程 2-1)Skin info的定义 上文曾讨论过,Skinned ...

  6. HTML实现单行时文字居中,多行文字时左对齐显示效果

    css代码: div { width: 100px; padding: 5px; text-align: center; background-color: #5dffa0; } p { paddin ...

  7. 360安全中心:WannaCry勒索软件威胁形势分析

    猫宁!!! 参考链接:http://zt.360.cn/1101061855.php?dtid=1101062360&did=210646167 这不是全文,而是重点摘要部分. 2017年5月 ...

  8. RobotFramework自动化测试框架(2)- RobotFramework语法

    RobotFramework测试用例是由四部分组成的,下面就从这四个部分简单介绍语法: 关键字表 *** Keywords *** 设置表 *** Settings *** 变量表 *** Varia ...

  9. Codeforces Round #410 (Div. 2) A

    Description Mike has a string s consisting of only lowercase English letters. He wants to change exa ...

  10. 二分搜索 2015百度之星初赛1 HDOJ 5248 序列变换

    题目传送门 /* 二分搜索:在0-1e6的范围找到最小的max (ai - bi),也就是使得p + 1 <= a[i] + c or a[i] - c 比赛时以为是贪心,榨干智商也想不出来:( ...