- 浏览: 2473586 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (574)
- Book (62)
- Architecture (6)
- Java (39)
- Taobao (41)
- Distributed (4)
- Life (72)
- Database (7)
- Spring (16)
- Photography (15)
- Bicycle (41)
- Test (20)
- jBPM (8)
- Business (12)
- Movie (3)
- Ajax (15)
- Code (7)
- Eclipse (96)
- VIM (2)
- Music (6)
- Groovy (10)
- AutoHotKey (3)
- Dorado (10)
- Maven (7)
- Scrum (5)
- English (20)
- Financial (12)
- OSGi (3)
- Other (4)
- Tool (6)
- Browser (1)
- PPT (1)
- Project Management (4)
- Agile (6)
- Nosql (1)
- Search engine (6)
- Shell (2)
- Open Source (4)
- Storm (10)
- Guava (3)
- Baby (1)
- netty (1)
- Algorithm (1)
- Linux (1)
- Python (2)
最新评论
-
roy2011a:
https://github.com/ebottabi/sto ...
storm的序列化问题及与spring的结合方式 -
roy2011a:
能抗能打 写道哥们儿,你好!能共享下那个storm与sprin ...
storm的序列化问题及与spring的结合方式 -
Alick1:
兄弟,你之前是不是在深圳的正阳公司呆过啊?
storm的ack和fail -
liuleixwd:
先点个赞,写的非常好!有个问题请教下,如果我再bolt里不用e ...
storm的ack和fail -
yao-dd:
solr的facet查询
bean属性及构造器参数:直接量(基本类型、Strings类型等。)
<value/>元素通过字符串来指定属性或构造器参数的值。正如前面所提到的,JavaBean PropertyEditor将用于把字符串从java.lang.String类型转化为实际的属性或参数类型。
idref元素用来将容器内其它bean的id传给<constructor-arg/> 或 <property/>元素,同时提供错误验证功能。
上述bean定义片段完全地等同于(在运行时)以下的片段:
第一种形式比第二种更可取的主要原因是,使用idref标记允许容器在部署时 验证所被引用的bean是否存在。而第二种方式中,传给client bean的targetName属性值并没有被验证。
如果被引用的bean在同一XML文件内,且bean名字就是bean id,那么可以使用local属性,此属性允许XML解析器在解析XML文件时来对引用的bean进行验证。
如:
depends-on属性可以用于当前bean初始化之前显式地强制一个或多个bean被初始化。例如,当类中的静态块的初始化被时,如数据库驱动的注册. 若需要表达对多个bean的依赖,可以在'depends-on'中将指定的多个bean名字用分隔符进行分隔,分隔符可以是逗号、空格及分号等。
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。
当采用XML格式配置bean时,<bean/>元素的 autowire-candidate属性可被设为false,这样容器在查找自动装配对象时将不考虑该bean。
根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
实现了Spring的InitializingBean和DisposableBean这两个标志接口的bean在初始化和析构时容器会调用前者的afterPropertiesSet()方法,以及后者的destroy()方法。
要避免使用InitializingBean接口(而且不鼓励使用该接口,因为这样会将代码和Spring耦合起来)可以在Bean定义中指定一个普通的初始化方法,即在XML配置文件中通过指定init-method属性来完成。同样要避免使用DisposableBean标志接口(而且不鼓励使用该接口,因为这样会将代码与Spring耦合在一起)可以在bean定义中指定一个普通的析构方法,即在XML配置文件中通过指定destroy-method属性来完成。
顶层<beans/>元素'default-init-method'属性的出现意味着Spring IoC容器会把bean上名为'init'的方法识别为初始化方法回调,并且当bean被创建和装配的时候,如果bean类具有这样的方法,它将会在适当的时候被调用。 类似的,配置析构方法回调是在顶层<beans/>元素上使用'default-destroy-method'属性。
对于实现了org.springframework.beans.factory.BeanFactoryAware接口的类,当它被BeanFactory创建后,它会拥有一个指向创建它的BeanFactory的引用。也就是让bean能持有一个指向BeanFactory的引用. 但是一般来说应该尽量避免使用,因为这样将使代码与Spring耦合在一起,而且也有违反转控制的原则(协作者应该作为属性提供给bean)。
ObjectFactoryCreatingFactoryBean 与BeanFactoryAware的区别在于它没有违反控制反转这一原则, 因为某个bean在注入了该FactoryBean之后, 所依赖的bean将由该ObjectFactory来提供, 这样可以对依赖bean做更多的工作.
假如bean实现了org.springframework.beans.factory.BeanNameAware接口并被部署在一个BeanFactory中,BeanFactory会通过该接口的setBeanName()方法以告知其被部署时的bean id。在bean属性被设置完成之后,在像InitializingBean的afterPropertiesSet或是自定义init-method这样的初始化回调执行之前,该接口的回调方法会被调用。
org.springframework.beans.factory.config.BeanPostProcessor接口有两个回调方法可供使用。当一个该接口的实现类被注册(如何使这个注册生效请见下文)为容器的后置处理器(post-processor)后,对于由此容器所创建的每个bean实例在初始化方法(如afterPropertiesSet和任意已声明的init方法)调用前,后置处理器都会从容器中分别获取一个回调。后置处理器可以随意对这个bean实例执行它所期望的动作,包括完全忽略此回调。一个bean后置处理器通常用来检查标志接口,或者做一些诸如将一个bean包装成一个proxy的事情;一些Spring AOP的底层处理也是通过实现bean后置处理器来执行代理包装逻辑。
请不要将BeanPostProcessor标记为延迟初始化。如果你这样做,Spring容器将不会注册它们,自定义逻辑无法得到应用。假如你在<beans/>元素的定义中使用了'default-lazy-init'属性,请确信你的各个BeanPostProcessor标记为'lazy-init="false"'
在Spring的BeanPostProcessor实现中调用标志接口或使用注解是扩展Spring IoC容器的常用方法。
BeanFactoryPostProcessor可以对bean的定义(配置元数据)进行处理。也就是说,Spring IoC容器允许BeanFactoryPostProcessor在容器实际实例化任何其它的bean之前读取配置元数据,并有可能修改它。配置多个BeanFactoryPostProcessor。你还能通过设置'order'属性来控制BeanFactoryPostProcessor的执行次序(仅当BeanFactoryPostProcessor实现了Ordered接口时你才可以设置此属性,因此在实现BeanFactoryPostProcessor时,就应当考虑实现Ordered接口)
PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,可以将BeanFactory定义中的一些属性值放到另一个单独的标准Java Properties文件中。
PropertyOverrideConfigurer是另外一个bean factory processor, 他的作用是可以使用properties文件中的值覆盖已有的值
一个processor是改变实例, 一个是改变定义
FactoryBean接口是插入到Spring IoC容器用来定制实例化逻辑的一个接口点。如果你有一些复杂的初始化代码用Java可以更好来表示,而不是用(可能)冗长的XML,那么你就可以创建你自己的FactoryBean,并在那个类中写入复杂的初始化动作,然后把你定制的FactoryBean插入容器中。
-----spring bean id name
id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名:不能以数字,符号打头,不能有空格,如123,?ad,"ab "等都是不规范的,Spring在初始化时就会报错
name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如"a b"," abc",,这时,虽然初始化时不会报错,但在getBean()则会报错
但配置文件中允许出现两个name相同的<bean>,在用getBean()返回实例时,后面一个Bean被返回,应该是前面那个<bean>被后面同名的 <bean>覆盖了。有鉴于此,为了避免不经意的同名覆盖的现象,尽量用id属性而不要用name属性。
name属性可以用,隔开指定多个名字,如<bean name="b1,b2,b3">,相当于多个别名,这时通过getBean("a1") getBean("a2") getBean("a3")返回的都是同一个实例(假设是singleton的情况)
如果id和name都没有指定,则用类全名作为name,如<bean class="com.stamen.BeanLifeCycleImpl">,则你可以通过
getBean("com.stamen.BeanLifeCycleImpl")返回该实例。
<value/>元素通过字符串来指定属性或构造器参数的值。正如前面所提到的,JavaBean PropertyEditor将用于把字符串从java.lang.String类型转化为实际的属性或参数类型。
<bean id="myDataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"> <!-- results in a setDriverClassName(String) call --> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/mydb</value> </property> <property name="username"> <value>root</value> </property> </bean>
idref元素用来将容器内其它bean的id传给<constructor-arg/> 或 <property/>元素,同时提供错误验证功能。
<bean id="theTargetBean" class="..."/> <bean id="theClientBean" class="..."> <property name="targetName"> <idref bean="theTargetBean" /> </property> </bean>
上述bean定义片段完全地等同于(在运行时)以下的片段:
<bean id="theTargetBean" class="..."/> <bean id="client" class="..."> <property name="targetName"> <value>theTargetBean</value> </property> </bean>
第一种形式比第二种更可取的主要原因是,使用idref标记允许容器在部署时 验证所被引用的bean是否存在。而第二种方式中,传给client bean的targetName属性值并没有被验证。
如果被引用的bean在同一XML文件内,且bean名字就是bean id,那么可以使用local属性,此属性允许XML解析器在解析XML文件时来对引用的bean进行验证。
如:
<idref local="theTargetBean"/>
depends-on属性可以用于当前bean初始化之前显式地强制一个或多个bean被初始化。例如,当类中的静态块的初始化被时,如数据库驱动的注册. 若需要表达对多个bean的依赖,可以在'depends-on'中将指定的多个bean名字用分隔符进行分隔,分隔符可以是逗号、空格及分号等。
<bean id="beanOne" class="ExampleBean" depends-on="manager"/> <bean id="manager" class="ManagerBean" />
ApplicationContext实现的默认行为就是在启动时将所有singleton bean提前进行实例化。如果你不想让一个singleton bean在ApplicationContext实现在初始化时被提前实例化,那么可以将bean设置为延迟实例化。一个延迟初始化bean将告诉IoC 容器是在启动时还是在第一次被用到时实例化。在XML配置文件中,延迟初始化将通过<bean/>元素中的lazy-init属性来进行控制。
当采用XML格式配置bean时,<bean/>元素的 autowire-candidate属性可被设为false,这样容器在查找自动装配对象时将不考虑该bean。
根据经验,对所有有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
实现了Spring的InitializingBean和DisposableBean这两个标志接口的bean在初始化和析构时容器会调用前者的afterPropertiesSet()方法,以及后者的destroy()方法。
要避免使用InitializingBean接口(而且不鼓励使用该接口,因为这样会将代码和Spring耦合起来)可以在Bean定义中指定一个普通的初始化方法,即在XML配置文件中通过指定init-method属性来完成。同样要避免使用DisposableBean标志接口(而且不鼓励使用该接口,因为这样会将代码与Spring耦合在一起)可以在bean定义中指定一个普通的析构方法,即在XML配置文件中通过指定destroy-method属性来完成。
顶层<beans/>元素'default-init-method'属性的出现意味着Spring IoC容器会把bean上名为'init'的方法识别为初始化方法回调,并且当bean被创建和装配的时候,如果bean类具有这样的方法,它将会在适当的时候被调用。 类似的,配置析构方法回调是在顶层<beans/>元素上使用'default-destroy-method'属性。
对于实现了org.springframework.beans.factory.BeanFactoryAware接口的类,当它被BeanFactory创建后,它会拥有一个指向创建它的BeanFactory的引用。也就是让bean能持有一个指向BeanFactory的引用. 但是一般来说应该尽量避免使用,因为这样将使代码与Spring耦合在一起,而且也有违反转控制的原则(协作者应该作为属性提供给bean)。
ObjectFactoryCreatingFactoryBean 与BeanFactoryAware的区别在于它没有违反控制反转这一原则, 因为某个bean在注入了该FactoryBean之后, 所依赖的bean将由该ObjectFactory来提供, 这样可以对依赖bean做更多的工作.
假如bean实现了org.springframework.beans.factory.BeanNameAware接口并被部署在一个BeanFactory中,BeanFactory会通过该接口的setBeanName()方法以告知其被部署时的bean id。在bean属性被设置完成之后,在像InitializingBean的afterPropertiesSet或是自定义init-method这样的初始化回调执行之前,该接口的回调方法会被调用。
org.springframework.beans.factory.config.BeanPostProcessor接口有两个回调方法可供使用。当一个该接口的实现类被注册(如何使这个注册生效请见下文)为容器的后置处理器(post-processor)后,对于由此容器所创建的每个bean实例在初始化方法(如afterPropertiesSet和任意已声明的init方法)调用前,后置处理器都会从容器中分别获取一个回调。后置处理器可以随意对这个bean实例执行它所期望的动作,包括完全忽略此回调。一个bean后置处理器通常用来检查标志接口,或者做一些诸如将一个bean包装成一个proxy的事情;一些Spring AOP的底层处理也是通过实现bean后置处理器来执行代理包装逻辑。
请不要将BeanPostProcessor标记为延迟初始化。如果你这样做,Spring容器将不会注册它们,自定义逻辑无法得到应用。假如你在<beans/>元素的定义中使用了'default-lazy-init'属性,请确信你的各个BeanPostProcessor标记为'lazy-init="false"'
在Spring的BeanPostProcessor实现中调用标志接口或使用注解是扩展Spring IoC容器的常用方法。
BeanFactoryPostProcessor可以对bean的定义(配置元数据)进行处理。也就是说,Spring IoC容器允许BeanFactoryPostProcessor在容器实际实例化任何其它的bean之前读取配置元数据,并有可能修改它。配置多个BeanFactoryPostProcessor。你还能通过设置'order'属性来控制BeanFactoryPostProcessor的执行次序(仅当BeanFactoryPostProcessor实现了Ordered接口时你才可以设置此属性,因此在实现BeanFactoryPostProcessor时,就应当考虑实现Ordered接口)
PropertyPlaceholderConfigurer是个bean工厂后置处理器的实现,可以将BeanFactory定义中的一些属性值放到另一个单独的标准Java Properties文件中。
PropertyOverrideConfigurer是另外一个bean factory processor, 他的作用是可以使用properties文件中的值覆盖已有的值
一个processor是改变实例, 一个是改变定义
FactoryBean接口是插入到Spring IoC容器用来定制实例化逻辑的一个接口点。如果你有一些复杂的初始化代码用Java可以更好来表示,而不是用(可能)冗长的XML,那么你就可以创建你自己的FactoryBean,并在那个类中写入复杂的初始化动作,然后把你定制的FactoryBean插入容器中。
-----spring bean id name
id属性命名必须满足XML的命名规范,因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名:不能以数字,符号打头,不能有空格,如123,?ad,"ab "等都是不规范的,Spring在初始化时就会报错
name属性则没有这些限定,你可以使用几乎任何的名称,如?ab,123等,但不能带空格,如"a b"," abc",,这时,虽然初始化时不会报错,但在getBean()则会报错
但配置文件中允许出现两个name相同的<bean>,在用getBean()返回实例时,后面一个Bean被返回,应该是前面那个<bean>被后面同名的 <bean>覆盖了。有鉴于此,为了避免不经意的同名覆盖的现象,尽量用id属性而不要用name属性。
name属性可以用,隔开指定多个名字,如<bean name="b1,b2,b3">,相当于多个别名,这时通过getBean("a1") getBean("a2") getBean("a3")返回的都是同一个实例(假设是singleton的情况)
如果id和name都没有指定,则用类全名作为name,如<bean class="com.stamen.BeanLifeCycleImpl">,则你可以通过
getBean("com.stamen.BeanLifeCycleImpl")返回该实例。
发表评论
-
spring中map的定义, 包括value为class的定义
2013-03-11 22:26 37<bean id="fieldM ... -
spring的xml string applicationcontext实现
2013-03-06 07:26 2367这里有两种实现方式: import org.springf ... -
对多数据源进行aop声明式事务管理
2009-11-04 18:57 4987当在对数据库表进行横向切分(将一个表的数据拆分为到多个数据库中 ... -
spring + ibatis 源码解读
2009-10-16 11:46 5708最近对ibatis2.1.0.256这个 ... -
编程方式实现sping bean延迟初始化
2009-10-09 10:12 2762在实际开发中, 碰到如下需求场景: 在线上需要spring容 ... -
使用spring aop 简化mock设计实现
2009-09-28 20:42 2846有时候为了去掉对外部系统的依赖, 我们需要针对外部依赖的接口创 ... -
自定义logger注解, 简化log4j的配置
2009-09-28 20:20 6050上次在参加支付宝架构培训的时候, 看到他们框架中有一个不错的对 ... -
使用spring aop碰到的几个问题及解决办法
2009-09-28 20:09 3946这里的问题只是针对spring 2.0.7 至于其他版本, ... -
本人常用的两种spring aop实现方式
2009-09-28 10:53 3891备忘一下, 基本的用法包括在配置文件中配置pointcut, ... -
spring aspectj的返回值
2009-05-31 08:40 4309最近使用到了基于aspectj的spring aop, aop ... -
spring map bean定义
2009-05-21 12:20 43485一般我们知道在property属性里面定义一个无id的map是 ... -
spring @Configration扩展使用一例
2009-02-05 22:03 5799最近对注解了解的比较多, 也在实际项目中实战了一把, 同时对s ... -
spring 注解学习笔记
2009-02-05 21:20 9816spring 注解讲的最详细的文章: http://www.i ... -
spring加载配置文件
2008-12-11 09:27 2354ClassPathXmlApplicationContext ... -
Spring动态数据源路由实现
2008-09-24 09:32 16829简单的翻译, 也算是一篇笔记. 原文:http://blog. ... -
spring aop学习笔记
2008-02-19 14:08 15589理解spring aop的路径:最初级的做法是通过使用代理将业 ...
相关推荐
在这个"spring知识总结.zip"压缩包中,我们可以期待找到一系列关于Spring框架及其相关技术的学习资料。 1. **Spring框架基础** - **依赖注入(Dependency Injection)**:Spring的核心特性之一,通过容器管理对象...
### Spring知识总结 #### Spring框架概述 Spring框架是一款开源的Java平台应用框架,它主要针对企业级应用开发而设计,提供了全面的解决方案和技术支持。Spring框架的核心特性包括但不限于依赖注入(Dependency ...
该资源包含spring的详细应用,以及MVC的模式详解,配套如何使用mybatis,这三者之间的紧密配合,对Java初学者以及中期人员很有帮助,理解会更加透彻一点。
spring从搭建配置到简单开发的一个整体流程,比较适合打基础的朋友!
这样的总结对于快速回顾和记忆Spring知识点非常有用。 **学习路径** 对于初学者,首先应该理解Spring的基本概念,如IoC和AOP,然后逐步学习Spring的各个模块,例如Spring MVC(用于构建Web应用)、Spring JDBC和...
spring阶段知识点总结
Java后端核心知识总结:JVM篇 Java后端核心知识总结:并发编程篇 ...Java核心知识总结:Spring Cloud Java核心知识总结:Spring Cloud Alibaba Java后端核心知识总结:计算机网络 Java后端核心知识总结:Netty ....
这里,我们针对“spring问题总结.zip”文件中的主题进行详细的Spring框架知识探讨。 1. **依赖注入(Dependency Injection, DI)**:Spring的核心特性之一,通过DI,对象之间的依赖关系被反转,使得应用程序的组件...
springcloud 微服务 知识总结 , Spring Cloud微服务架构体,详细的说明了Spring Cloud微服务从概念到实际操作,包含服务拆分、服务注册、服务发现、服务消费、网关配置、集中配置中心、熔断机制、自动扩展等方面
spring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wpsspring AOP 理论知识点总结.wps
SpringCloud微服务面试总结
Spring框架是Java开发中不可或缺的一部分,它以简化企业级应用程序的构建为目标,通过提供一系列的模块和功能,解决了传统EJB框架存在的诸多问题。本文将深入探讨Spring框架的核心概念、作用以及IoC(控制反转)的...
包含Spring简介,AOP,SpringMVC,集成JDBC,事务,ORM框架,Spring集成知识点总结,以思维导图的形式展示,xmind文件。
Spring框架是Java开发中广泛应用的一个轻量级框架,它提供了多种功能来简化应用程序的构建和管理。Spring的核心特性包括依赖注入(Dependency Injection, DI),面向切面编程(Aspect-Oriented Programming, AOP),...
Spring 问题总结实用知识库分享 Spring 框架是 Java 语言中最流行的框架之一,对于 Java 开发者来说,掌握 Spring 框架是非常重要的。本文将总结 Spring 框架中的一些常见问题和解决方法,旨在帮助开发者更好地掌握...
本篇笔记将详细讲解Spring框架的基础知识,包括其模块结构、配置文件的建立、配置文件的加载以及依赖注入的多种方式。 1. **Spring的模块结构** Spring框架由多个模块组成,主要包括: - **Core Container**:...
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、...在学习过程中,分析提供的源代码和示例将有助于深入理解SpringSecurity的工作原理,并能帮助你在实际项目中有效地应用这些知识。