Spring配置介绍(一)_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Spring配置介绍(一)

Spring配置介绍(一)

 2017/2/16 5:34:14  huayu611  程序员俱乐部  我要评论(0)
  • 摘要:对于spring详细描述这边就不在多话了,不知道什么时候spring已经成为web项目程序员必备的能力。这博客先简单介绍一下最简单的场景,对于jta,aop后面我再慢慢写。Bean对于bean,我们主要为xml和注解两种,这篇我主要想写一下xml方式在spring声明bean时,对于xml文件,我们都知道,可以在web.xml中定义它的文件名格式,而在每一个bean的文件中,在beans的元素里我们也会找到这样的一个节点:http://www.springframework
  • 标签:配置 Spring

class="MsoNormal">?

对于spring详细描述这边就不在多话了,不知道什么时候spring已经成为web项目程序员必备的能力。这博客先简单介绍一下最简单的场景,对于jta,aop后面我再慢慢写。

Bean

???????? 对于bean,我们主要为xml注解两种,这篇我主要想写一下xml方式

spring声明bean时,对于xml文件,我们都知道,可以在web.xml中定义它的文件名格式,而在每一个bean的文件中,在beans的元素里我们也会找到这样的一个节点: http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

这个定义含义是,下面这个对bean的定义规范,使用的是spring3.0schema

我们打开spring-beans-3.0.xsd这个文件,这个文件应该是在spring-beans-*.jar 中的org\springframework\beans\factory\xml,(我参考的是spring4.0版本,其jar名为spring-beans-4.0.0.M1.jar)。

???????? xmlspy打开xsd,如下图所示,我们一一介绍,(otherdescription不再介绍)

?

?

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

先是beans的大节点,下面我们分条看

attributes:这个里面配置一些通配,如果子bean节点没有配置,则采用这里的配置,如果这里也没有配置,则使用默认值。

1、打开下面的扩展



?

1import: import:这个比较好理解,在xml文件中,spring提供能力,让你可以在这里面配置一个新的xml文件,然后它会去按你配置地址去寻找,最后对它进行加载。这个文件可以不满足web.xml中配置的文件格式。

如:<import resource="USR.xml"/>

当然它是支持jar包内寻找,在二次封装spring中,这个可以很灵活的使用。

?

2alias别名,我们在定义springbeanid时,spring同时支持一个别名模式,比如我们向spring申请一个一个对象,但因业务场景不同对spring中的beanid生成又不同,则这个时候可以使用别名,比如

<bean id="A" class="com.huayu.A" name="B"></bean>

这时你不管用A,还是B,向spring申请对象时,spring给你的都是同一个对象。当然也可以写成

<bean id="A" class="com.huayu.A" ></bean>

<bean id="B" class="com.huayu.A”></bean>

但这个方式在单例的情况下,会生成两个不同的对象。

同样也可以写成<alias name="A" alias="B"/>这样的话,就单独定义别名,如果有多个别名,可以用逗号分开(spring在分隔时使用了,; ,也就是逗号,分号和空格它都认的)

3) bean,这个才是xml中写入bean的地方,我们打开bean的节点。



?

它有一个必选属性,我已经展开了,那就是ididbean主键是不可或缺的。

我们再看它的第二个可选属性。(这个属性图截起来很多,我就截一小部分,其它直接按顺序写属性名称)



?

name:这个是配置name,前面已经说过,这个里面可以配置bean的别名的。

class:这个上台率绝对是除了主键,它是最高的,它配置了这个bean对应的class路径,package+class,但它仅仅是一个可选属性。后面还有很多属性,说完之后会发现它可以不是一个必要的东西

parentspring设计bean的时候,也有自己的继承模型,你可以将parent配置成其它beanid,这个时候你当前bean的大部分属性将从父bean中获取,可以是class

scope:这个是对场景的控制,我们常用的有两个控制,一个是singleton,一个是prototype

?singleton,是单例的,前面说过懒加载,也是需要这个来约束,向spring申请对象时,它都返回的同一个,因为它只初始化一次,发果没有配置scope,默认也是singleton的。

prototype是多例的,每次向spring申请对象时,它都会重新创建一个对象出来,

这两个我单独说一下,可能基本上对scope的理解,很多人都是这两个,对,这两个很关键,但同样,它们也引发过很多并发问题,而并非出自spring,而是使用者使用不慎导致的,如果你的类和父类中有全局变量,一定要用prototype,如果你想用singleton,一定不能在bean的类中或父类中存在全局变量。有人会说,那我不想排查代码,直接使用prototype,其实prototype每次都创建对象,大量使用务必会导致性能下降,那有人的又会说,那我把所有类中全局变量都优化掉,放弃全局变量,然后配置成singleton,第一,全局变量有它的优势,如果全局变量带来的优势大于单例所带来的优势,那岂不是本末倒置了吗?再者,因为singleton对象,JVM不会对它进行回收,所以它会一直占了内存不放,如果这个类一天或几天才会用一次,何不用prototype呢?

当然scope还有其它属性值,如requestsession,有兴趣的可以自己研究一下。

? abstract,是否为抽象bean,它常常与parent合作使用,因为这类的bean永远不会初始化,它如果有bean继承它,那么它的价值就能体现了。

lazy-init:启动时是否懒加载,spring启动会扫描所有的定义的bean,对那些需要初始化的bean进行初始化,而初始化可能存在三种情况不会被初使化,一种是多例,对于多例的情况,程序向spring申请对象的时候 ,不论何时,都会创建新的对象给调用者,另一种是abstract,是否为抽象,如果为抽象,则这个bean永远不会被初始化,在spring的世界里,不论配置的class是什么类型的,而spring认为它是抽象的,不具备初始化能力,还有一种是懒加载,对于此,比较特殊,在单例的情况下,启动spring不会被初始化,而第一次调用时,它们创建对象,而此后对象一种保存在spring的缓存里,再调用时,直接把这个对象给调用者。lazy-init的默认情况为false,对于多例或abstract情况下,这个配置将失效。

autowire?? 自动装载,它有5种选项,default ,no, byname, byType, constructor

default:默认为no

no:不会自动装载

byname,通过名字自动装载。比如类中的属性名字为abc,则按abc去寻找对应的bean

byType,通过类型进行自动装载。如果同类型有多个bean使用,则报错。但没有则不会报错。

Constructor:构造器装载(有人可能问应该还有一个autodetect,我是参考的是spring3.0xsd,对于后续版本新加的能力,我这边暂不会提到)

depends-onspring创建bean的时候,在业务上可能需要其它的bean先初始化,则使用depends-on,比如depends-on=”Abc”,那么在初始化这个bean时,发现depends-on,则暂停初始化本bean,优先初始化Abc

autowire-candidate,前面说过,如果在autowire自动装载时,发现多个,则会出现异常,如果我们不想让它报错,比如现在A的类由两个,

<bean id="A" class="com.huayu.A"></bean>

<bean id="B" class="com.huayu.A"></bean>

byType时,找到了两个类,这个时候spring会抛错,如果我们把其中一个标记为一下<bean id="B" class="com.huayu.A" autowire-candidate="true"></bean>

那么会找自动找B,这种就让byType有了生存空间,在项目中同一个类标记为多个spring bean是常有的事情 ,当然你有多个autowire-candidate,也会报错。

primary:有了autowire-candidate,其实spring还不满足,因为有人想autowire-candidate重复也不要报错就好了,那么又有一个primary的属性,那么你autowire-candidate多个,但有一个primary,又能正确找到spring bean了。看来springbyType很重视。

init-method:这个里面可以写一个本类的的方法,也就是spring在初始化类后,会调用一下这个方法,这样扩展了,对象在创建之后 ,可以执行初始化方法。

destroy-method:这个是与init-method方法类型,不过它在销毁时会调用,一般情况下在关闭服务器时会调用。

factory-method 这个是工厂模式创建对象,通常情况下,spring会直接newInstance方式创建对象,如果不想让它创建 ,可以配置factory-method方法进行创建,它可以是本类中的静态方法,也可以是其它类中的普通方法。

factory-bean:前面说过factory-method可以是其它类中的普通方法,如果要用其它类,则在这里要把这个类的bean通过factory-bean属性引用过来。

?

至此,属性已经差不多了,下面我们再看下它下面的元素节点



?



?
meta:



?

它其实很简单,一个key,一个value ,真正使用的场景不是很多。一般在spring内部处理时,会用到元数据。比如说spring script

constructor-arg 这个是构造函数需要的参数 ,如果构造函数有多个参数,则需要多个constructor-arg



?

先看一下attribute

index,表示构造方法中的参数位置,如果没有设置的话,

type表示参数的类型。

Name表示数据的名字。

ref:表示引用,参数从哪里引用过来。

value:值

其实ref value时,这一个构造函数的传参已经定下来了,ref=”a”表示,传这个需要bean A类型的传参,并且实例化,value直接对应值。比如value=”3”,之类的。如果没有这两个值 ,则可能需要下面的这些新的节点来标记传参。

bean:这个算是嵌套进去的,里面的格式与我们正在介绍的bean是一样的。它的作用是这个bean的实例作为传参,它与ref不同时,它完全自己定义。

其实新加的点节也是有ref的。如下图



?

它不是直接把对方bean引进来,而是继承上面的bean,这个与之前说的parent是类似的。

idref:这个看起来就比较怪了,如下图



?

它需要一个beanlocal,其实它俩含义上差不多,spring先取bean,如果没有再取local。其实它的含义与ref是差不多的。

value:子节点也有一个value。我们看一下value



?

仅仅一个type的属性,type需要写成一个类,其实它的配置书写方法应该是

<constructor-arg>

<value type="com.h.A">DDD</value>

</constructor-arg>

它的text部分为DDD。可以是一个表达式,也可以是一个字符串。

null:value类似,只不是它type是空的。text部分也是空的。

arraylistset:这几个是一样的,它们都是集合或数组 ,里面有一个attribute和一个一对多的集合。其实集合与我们现在说的以上几点是一样的。返回指定集合

map,props它俩格式是一样的,返回指定键值对。

其实constructor-arg相对来说是比较复杂的,说完这个,我们再看property,那就比较简单了,而且还是比较常用了,我们只要打开一看,它其实与constructor-arg里面格式是一样 ,只是说constructor-arg是为构造数据配置参数,但property为里面的属性配置数据。



?

qualifier

先看一下图



?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

这个在注解中使用的比较多,qualifier翻译一下,为合格者,在byName自动装载时,我们可以定义如果有需要装载类的名称,可能我没有仔细研究过,这个配置过后,只有在注解时会有作用。

lookup-method:如果有一个抽象类,现在你想配置一个bean出来。可以使用lookup-method将抽象方法指定返回 的类,这样向spring申请对象时,spring会给你创建一个新的对象,不是这个对象不属于抽象类的,而是抽象类的一个子类 ,这个子类由spring自动生成 的。

?

replaced-method:当然,如果你想在执行你的bean时,将某一个方法执行给替换掉。可以使用replaced-method,它在执行你这个类的时候 ,会自动寻找你配置的这个类的代理。

  • 大小: 1.3 KB
  • 大小: 15 KB
  • 大小: 7.9 KB
  • 大小: 11.7 KB
  • 大小: 8.3 KB
  • 大小: 11.6 KB
  • 大小: 5.7 KB
  • 大小: 8.6 KB
  • 大小: 17.2 KB
  • 大小: 15.9 KB
  • 大小: 7.3 KB
  • 大小: 19.6 KB
  • 大小: 15.1 KB
  • 查看图片附件
发表评论
用户名: 匿名