对于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.0的schema,
我们打开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,如下图所示,我们一一介绍,(other和description不再介绍)
先是beans的大节点,下面我们分条看
attributes:这个里面配置一些通配,如果子bean节点没有配置,则采用这里的配置,如果这里也没有配置,则使用默认值。
1、打开下面的扩展
1)import: import:这个比较好理解,在xml文件中,spring提供能力,让你可以在这里面配置一个新的xml文件,然后它会去按你配置地址去寻找,最后对它进行加载。这个文件可以不满足web.xml中配置的文件格式。
如:<import resource="USR.xml"/>
当然它是支持jar包内寻找,在二次封装spring中,这个可以很灵活的使用。
2)alias别名,我们在定义spring的beanid时,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的节点。
它有一个必选属性,我已经展开了,那就是id,id是bean的主键是不可或缺的。
我们再看它的第二个可选属性。(这个属性图截起来很多,我就截一小部分,其它直接按顺序写属性名称)
name:这个是配置name,前面已经说过,这个里面可以配置bean的别名的。
class:这个上台率绝对是除了主键,它是最高的,它配置了这个bean对应的class路径,package+class,但它仅仅是一个可选属性。后面还有很多属性,说完之后会发现它可以不是一个必要的东西
parent:spring设计bean的时候,也有自己的继承模型,你可以将parent配置成其它bean的id,这个时候你当前bean的大部分属性将从父bean中获取,可以是class。
scope:这个是对场景的控制,我们常用的有两个控制,一个是singleton,一个是prototype,
singleton,是单例的,前面说过懒加载,也是需要这个来约束,向spring申请对象时,它都返回的同一个,因为它只初始化一次,发果没有配置scope,默认也是singleton的。
prototype是多例的,每次向spring申请对象时,它都会重新创建一个对象出来,
这两个我单独说一下,可能基本上对scope的理解,很多人都是这两个,对,这两个很关键,但同样,它们也引发过很多并发问题,而并非出自spring,而是使用者使用不慎导致的,如果你的类和父类中有全局变量,一定要用prototype,如果你想用singleton,一定不能在bean的类中或父类中存在全局变量。有人会说,那我不想排查代码,直接使用prototype,其实prototype每次都创建对象,大量使用务必会导致性能下降,那有人的又会说,那我把所有类中全局变量都优化掉,放弃全局变量,然后配置成singleton,第一,全局变量有它的优势,如果全局变量带来的优势大于单例所带来的优势,那岂不是本末倒置了吗?再者,因为singleton对象,JVM不会对它进行回收,所以它会一直占了内存不放,如果这个类一天或几天才会用一次,何不用prototype呢?
当然scope还有其它属性值,如request,session,有兴趣的可以自己研究一下。
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.0的xsd,对于后续版本新加的能力,我这边暂不会提到)
depends-on:spring创建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了。看来spring对byType很重视。
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:这个看起来就比较怪了,如下图
它需要一个bean或local,其实它俩含义上差不多,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部分也是空的。
array,list,set:这几个是一样的,它们都是集合或数组 ,里面有一个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,它在执行你这个类的时候 ,会自动寻找你配置的这个类的代理。
相关推荐
spring配置 spring配置 spring配置 spring配置 spring配置
ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssmspring配置ssm...
Spring配置 Spring 配置 映射 加注释!!!!Spring配置 Spring 配置 映射 加注释!!!!
spring配置文件实例
下面是对Spring配置文件的详细介绍。 首先,Spring配置文件通常是以`.xml`为扩展名的文件,例如`beans.xml`。这些文件存储在项目的`src/main/resources`目录下,以便在运行时被自动加载。Spring容器...
Spring 配置文件是 Spring 框架中最重要的配置文件之一,它负责定义和配置应用程序的Bean对象,以及它们之间的依赖关系。Spring 配置文件通常以XML文件的形式存在,文件名通常为applicationContext.xml。 在 ...
spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件spring配置文件...
在本压缩包中,我们找到了一系列与Spring相关的配置文件,这些文件在构建JavaWeb应用时起着至关重要的作用。 1. `jdbc.properties`: 这个文件通常用于存储数据库连接的相关信息,如URL、用户名、密码等。它是Spring...
### Spring配置的5种方式详解 #### 一、引言 在Java开发领域,特别是针对企业级应用,Spring框架作为一款轻量级的容器管理工具,不仅提供了强大的依赖注入功能,还支持多种事务管理策略。Struts2+Spring+Hibernate...
在微服务架构中,Spring Cloud Config 是一个强大的分布式配置中心,它允许开发人员将应用程序的配置存储在远程仓库中,并且可以在运行时动态地管理和更新这些配置,无需重启应用。这个特性对于大型分布式系统来说...
spring配置的简单案例.zip spring配置的简单案例.zip spring配置的简单案例.zip spring配置的简单案例.zip spring配置的简单案例.zip spring配置的简单案例.zip spring配置的简单案例.zip spring配置的简单案例.zip ...
spring配置和启动方式 博客地址:https://blog.csdn.net/u010476739/article/details/76696756
### Spring配置步骤详解 #### 一、Spring框架简介 Spring框架是Java平台上的一个开源框架,它提供了一种简化企业级应用开发的方式。Spring的核心功能包括依赖注入(Dependency Injection, DI)、面向切面编程...
连接MYSQL数据库,SPRING配置文件示例。
1.创建web工程 2.导入jar ...3.导入配置文件 spring-framework-2.5.6\samples\jpetstore\war\WEB-INF\log4j.properties spring-framework-2.5.6\samples\jpetstore\war \WEB-INF\applicationContext.xml
接下来,一旦检测到Spring配置文件发生变化,我们需要重新加载配置文件。这可以通过Spring的`ApplicationContext`的`refresh()`方法来实现。`refresh()`会重新初始化Bean工厂,读取新的配置信息,并更新所有Bean的...
Spring Cloud配置中心获取不到最新配置信息的问题是一个常见的问题,在微服务应用中,配置中心是非常重要的组件,它负责管理和分发配置信息。但是,如果配置中心出了问题,整个微服务系统就会受到影响。这个问题的...
spring配置数据库文件,连接数据库的一写配置文件
以上就是关于Spring框架的下载与配置的基本介绍。在实际开发中,我们还需要考虑如何整合其他Spring项目,如Spring MVC用于构建Web应用,Spring Data用于数据库操作,以及Spring Boot用于简化Spring应用的初始搭建和...
Spring MVC 配置详解 ...Spring MVC 是一个功能强大且灵活的 Web 框架,它提供了许多可配置的组件,以便我们根据需要进行自定义配置。掌握 Spring MVC 的配置和原理是我们开发高质量 Web 应用程序的关键。