spring中bean的配置详解--定义parent
在工作中碰到了好多的配置文件,具体来说是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的更多相关文章
- Spring中bean的scope详解
如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" scope=& ...
- Spring学习 6- Spring MVC (Spring MVC原理及配置详解)
百度的面试官问:Web容器,Servlet容器,SpringMVC容器的区别: 我还写了个文章,说明web容器与servlet容器的联系,参考:servlet单实例多线程模式 这个文章有web容器与s ...
- vue-cli 中的 webpack 配置详解
本篇文章主要介绍了 vue-cli 2.8.2 中的 webpack 配置详解, 做个学习笔记 版本 vue-cli 2.8.1 (终端通过 vue -V 可查看) vue 2.2.2 webpack ...
- tomcat中server.xml配置详解(转载)(一)
转载自:https://www.cnblogs.com/starhu/p/5599773.html tomcat中server.xml配置详解 Tomcat Server的结构图如下:(该文件描述了如 ...
- Spring 入门 web.xml配置详解
Spring 入门 web.xml配置详解 https://www.cnblogs.com/cczz_11/p/4363314.html https://blog.csdn.net/hellolove ...
- Struts2中 Result类型配置详解
一个result代表了一个可能的输出.当Action类的方法执行完成时,它返回一个字符串类型的结果码,框架根据这个结果码选择对应的result,向用户输出.在com.opensymphony.xwor ...
- Spring中bean的配置
先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对象的时候,一般都是直接使用关键字类new一个对象,那这样有什么坏处呢?其实很显然的,使用new那么就表示当前模块已经 ...
- Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- Spring中注解的使用详解
一:@Rsource注解的使用规则 1.1.案例演示 Spring的主配置文件:applicationContext.xml(因为我这里将会讲到很多模块,所以我用一个主配置文件去加载各个模块的配置文件 ...
随机推荐
- STL - merge()
merge用来对两个有序容器进行合并.返回合并后存入容器中的元素的下一个位置的迭代器(可以认为是超尾). merge(v1.first(),v1.end(),v2.first(),v2.end(),r ...
- unity ShaderLab 编辑器——sublime text 2
sublime text 2,支持unity shader关键字高亮显示,智能提示功能.这个脚本编辑器的售价是70美元,不过作者很厚道地给了我们永久的免费试用期. 1)下载sublime text 2 ...
- python 模块和包的使用方法
一.模块 1.import导入模块 import module1,mudule2... 2.from...import...导入模块 导入指定内容 from modname import name1[ ...
- 【CodeForces - 501B 】Misha and Changing Handles(map)
Misha and Changing Handles CodeForces原题是英文,这里就直接上中文好了,翻译不是太给力,但是不影响做题 ^▽^ Description 神秘的三角洲里还有一个传说 ...
- 「开源」目前见过的最好的开源OA产品
这是我目前见过的最好的开源OA产品.功能完整,代码结构清晰.值得推荐. 1.项目介绍 oasys是一个OA办公自动化系统,使用Maven进行项目管理,基于springboot框架开发的项目,mysql ...
- hbase-shell + hbase的java api
本博文的主要内容有 .HBase的单机模式(1节点)安装 .HBase的单机模式(1节点)的启动 .HBase的伪分布模式(1节点)安装 .HBase的伪分布模式(1节点)的启动 .HBas ...
- scikit-learning API
API参考 这是scikit学习的类和函数参考.有关详细信息,请参阅完整的用户指南,因为类和功能原始规格可能不足以给出其使用的完整指导. sklearn.base:基类和效用函数 所有估计器的基类. ...
- 【C#】什么时候使用virtual什么时候使用abstract,(另附override/new区别)
一.C#中virtual与abstract的区别(引用“姓吕名布字子乔”的文章) C#的virtual & abstract经常让人混淆,这两个限定词都是为了让子类进行重新定义,覆盖父类的定义 ...
- net MVC 四种基本 Filter
四种基本 Filter 概述 MVC框架支持的Filter可以归为四类,每一类都可以对处理请求的不同时间点引入额外的逻辑处理.这四类Filter如下表: 使用内置的Authorization Fi ...
- apt-get的一些坑
apt-get update:更新安装列表apt-get upgrade:升级软件apt-get install software_name :安装软件apt-get --purge remove ...