浅谈Spring容器在Web项目中的使用

开发 后端
本文将简单谈谈Spring容器在Web项目中的使用,Spring容器主要负责实例化、管理Bean,默认是XmlWebApplicationContext类。

Spring容器默认通过Xml配置文件定义bean以及他们之间的依赖关系。Xml文件中通过配置元数据来定义Bean和他对其他Bean的依赖。

DefaultListableBeanFactory的职责是实例化、初始化运用中的各种bean以及管理他们之间的关系。该实现使得Bean之间的关系可以通过Xml管理。

ApplicationContext类是Spring各种资源的集合体,包括消息资源处理(国际化处理)、事件传递、定义的各种Bean对象以及各种运用层的其他(ApplicationContext)。而ApplicationContext通过组合,有个BeanFactory属性,所以ApplicationContext具备了DefaultListableBeanFactory所有操作。

Spring容器的初始化

Servlet通过ContextCloader类初始化ApplicationContext。

(1)初始化ApplicationContext,BeanFactory对象。

ConfigurableWebApplicationContextwac=(ConfigurableWebApplicationContext)
BeanUtils.instantiateClass("XmlWebApplicationContext.class");//默认是XmlWebApplicationContext.class

DefaultListableBeanFactorybeanFactory=newDefaultListableBeanFactory()

XML配置元数据(resource对象表示)

XML配置元数据通常就是指每个XML配置文件,由这些配置元数据共同组成了XML配置文件。为了加载XML配置文件生成ApplicationContext对象,可以将这些XML配置文件的文件路径作为String数组传给ApplicationContext,ApplicationContext会将每个XML配置元数据生成一个Resource对象。同时BeanFactroy会通过调用BeanDefinitionReader对象从多个XML文件读取Bean的定义。

多个Bean定义(BeanDefinition对象表示)

Spring容器将管理多个Bean对象,而这些Bean对象通过xml配置文件中的Bean定义被创建。

在Spring系统中,Bean定义通过BeanDefinition对象表示,该对象封装了相应的Bean定义的内容。每个Bean定义必须包含以下几个内容

◆全限定类名(相对Classpath的全路径文件名)

。。。。。

◆bean行为的定义:静态工厂方法(factory-method)、工厂类(factory-bean)、依赖检查(dependency-check)、自动装配模式(autowire)、初始方法(init-method)、销毁方法(destroy-method)、抽象属性(abstract)、延迟加载(lazy-init)、孤子模式(singleton)等

◆创建bean的构造函数参数和属性,例如设置连接池的连接数以及连接池的连接数大小等。

◆bean之间的依赖关系:parent、依赖属性(depends-on)。

实例化Bean

◆用构造函数来实例化Bean。

只要设置Class属性,且指定类一般都有一个默认的空构造器。这样Spring容器就可以通过放射机制调用指定类的构造函数实例化指定类(相当于Java中的new操作符)。

< BEANID="REGINFOOPERATOR"PARENT="COM.LONGTOP.TEST.REGINFOOPERATOR">< /BEAN>

◆Factory-method静态工厂方法实例化Bean。

必须设置Factory-method属性来指定创建bean的静态工厂方法名,且指定类相应方法必须声明为static。

< BEANID="REGINFOOPERATOR"CLASS="COM.LONGTOP.TEST.REGINFOOPERATOR"FACTORY-METHOD="CREATEINSTANCE">
< /BEAN>

该定义不用指定返回对象的类型,仅仅指定了该类的工厂方法名,此例中createInstance声明为static。

publicclassReginfoOperator{  
privateStringname;  
publicStringgetName(){  
returnname;  
}  
 
publicvoidsetName(Stringname){  
this.name=name;  
}  
 
publicReginfoOperator(){  
}  
publicReginfoOperator(Stringname){  
this.name=name;  
System.out.println("生成ReginfoOperator对象,name="+name);  
}  
 
publicstaticReginfoOperatorcreateInstance(){  
returnnewReginfoOperator("hello");  
}  
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

◆Factory-bean工厂对象实例化bean。

用来实例的工厂方法位于另一个已有的bean中,容器将调用这个Bean的工厂方法创建新的指定bean。

<beanidbeanid="reginfoOperator" 
factoryfactory-method="createOperatorInstance"factory-bean="operatorFactory"> 
bean> 
<beanidbeanid="operatorFactory"class="com.longtop.test.OperatorFactory"> 
bean> 
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

其中reginfoOperator的定义中,class属性必须为空,factory-bean必须定义为包含工厂方法factory-method的bean名称。

packagecom.longtop.test;  
 
publicclassOperatorFactory{  
 
publicOperatorFactory(){  
}  
publicReginfoOperatorcreateOperatorInstance(){  
returnnewReginfoOperator("factory-bean");  
}  
}  
 
 
publicclassReginfoOperator{  
privateStringname;  
publicStringgetName(){  
returnname;  
}  
 
publicvoidsetName(Stringname){  
this.name=name;  
}  
 
publicReginfoOperator(Stringname){  
this.name=name;  
System.out.println("生成ReginfoOperator对象,name="+name);  
}  

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

【编辑推荐】

  1. JSF和Spring的集成
  2. 在Spring中进行集成测试
  3. 比较JSF、Spring MVC、Stripes、Struts 2、Tapestry、Wicket
  4. Spring中的TopLink ServerSession
  5. Spring is coming
责任编辑:彭凡 来源: javaeye
相关推荐

2022-12-08 10:40:06

声明式事务AOP

2022-04-20 15:55:29

容器架构设计

2011-05-19 08:57:41

软件开发项目

2012-05-30 15:57:49

ERP项目运维

2011-05-18 16:02:08

XML

2011-07-08 08:37:05

软件开发

2011-05-07 09:07:53

功能点

2024-05-24 10:01:12

2023-12-07 19:19:11

2024-08-19 01:10:00

RedisGo代码

2024-09-09 05:30:00

数据库Spring

2009-01-03 14:39:04

ibmdwDojoMVC

2015-08-03 11:45:37

storyboard

2009-06-24 17:34:58

使用JSF的经验

2024-10-18 16:21:49

SpringPOM

2012-07-13 09:38:15

项目代码

2012-07-13 09:35:58

PHP

2020-10-27 14:15:42

SpringBoot

2011-08-23 17:52:39

LUAWeb 开发

2016-11-01 20:26:47

前端模板underscoreWeb
点赞
收藏

51CTO技术栈公众号