??xml version="1.0" encoding="utf-8" standalone="yes"?>伊人成人在线视频,国产专区一区,久久影院一区二区三区 http://www.aygfsteel.com/improviser/category/26126.html思维是一U艺术,艺术需要灵?/description>zh-cn Mon, 05 Nov 2007 04:13:20 GMT Mon, 05 Nov 2007 04:13:20 GMT 60 偉Spring MVC http://www.aygfsteel.com/improviser/archive/2007/11/04/158025.htmlimproviser improviser Sun, 04 Nov 2007 02:44:00 GMT http://www.aygfsteel.com/improviser/archive/2007/11/04/158025.html http://www.aygfsteel.com/improviser/comments/158025.html http://www.aygfsteel.com/improviser/archive/2007/11/04/158025.html#Feedback 5 http://www.aygfsteel.com/improviser/comments/commentRss/158025.html http://www.aygfsteel.com/improviser/services/trackbacks/158025.html 个h认ؓSpring其核心是其IOC和AOP斚wQ对其SpirngMVC框架q不xQ我看好的是JSFQ简单易懂。但最q由于工作上需要,所以有需要对SpringMVC做个了解学习Q因此,本次对SpirngMVC的相遇纯属偶?... SpingMVC的架构其实也很简单,它通过一个共通的入门DispatcherServlet来接收所有的requestQ接下来Ҏrequest要求的页面通过handler转送给Controller处理Q处理结果返回Viewl用P因此对SpringMVC来说Q其核心为DispatcherServlet?br /> DispatcherServlet作ؓ一扇门Q我们要使用q个门,首先得安装上q个门,安装在哪呢?没错Q就安装在web.xmlq个大屋子,象其他servlet一P描述servlet的名字和c,再给他一个mapping描述对应映射的网c在下例中, 我们lDispatcherServlet的v名ؓ SpringMVCDemoQ?/font> q让container知道所?dol尾的request都丟ldispatcher?/span>
<
servlet
>
<
servlet-name
>
SpringMVCDemo
</
servlet-name
>
<
servlet-class
>
org.springframework.web.servlet.DispatcherServlet
</
servlet-class
>
<
load-on-startup
>
1
</
load-on-startup
>
</
servlet
>
<
servlet-mapping
>
<
servlet-name
>
SpringMVCDemo
</
servlet-name
>
<
url-pattern
>
*.do
</
url-pattern
>
</
servlet-mapping
>
门安装好了之后,我们需要定义门能打开的范_在哪定义呢?在门的上面贴上一张“入门指导”,介绍从哪斚w(hello.do)q门需要用何U交通方?springmvcController)q去Qƈ定义该交通方式?/font>
<
bean
id
="urlMapping"
class
="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"
>
<
property
name
="mappings"
>
<
props
>
<
prop
key
="/hello.do"
>
springmvcController
</
prop
>
</
props
>
</
property
>
</
bean
>
<!--
SpringmvcController
-->
<
bean
id
="springmvcController"
class
="org.improviser.webapp.controller.SpringmvcController"
>
</
bean
>
接下来该渲染一下页面了Q下面ؓ渲染所有以
WEB-INF/pages/
开?/font>Q?font color="#0000ff">q以. jspl尾的页面?/font>
<!--
ViewSolver
-->
<
bean
id
="viewResolver"
class
="org.springframework.web.servlet.view.InternalResourceViewResolver"
>
<
property
name
="viewClass"
>
<
value
>
org.springframework.web.servlet.view.JstlView
</
value
>
</
property
>
<
property
name
="prefix"
>
<
value
>
/WEB-INF/pages/
</
value
>
</
property
>
<
property
name
="suffix"
>
<
value
>
.jsp
</
value
>
</
property
>
</
bean
>
上面提到的SpringmvcControllerQ?/font>现在该作个定义了Q该c需要实现Controller 接口?/font>public class SpringmvcController implements Controller { /** Logger for this class and subclasses */ protected final Log logger = LogFactory.getLog(getClass()); public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Map model = new HashMap(); String str = " 卛_诗h " ; logger.info( " returning hello view with " + currTime); model.put(" coldice " , str); return new ModelAndView( " hello " , " message " , model); }
~写jsp 试面?/font>< html > < head > < title > Spring Application </ title > </ head > < body > < h1 > < br /> Hello < c:out value ="${message.coldice}" /></br> Spring MVC 试成功Q?br /> </ h1 > </ body > </ html >
现在对以上内容作个ȝQ正如上面所叙述QSpringMVC框架的处理过E机制如下图所C,接收h面Q通过DispatcherServlet映射到相应规则处理,q找到相应的控制器,l果控制器处理后q回相应的页面最后返回给用户?/font>
]]> SpringW记之十QSpring研读ȝQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/29/149474.htmlimproviser improviser Sat, 29 Sep 2007 02:07:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/29/149474.html http://www.aygfsteel.com/improviser/comments/149474.html http://www.aygfsteel.com/improviser/archive/2007/09/29/149474.html#Feedback 1 http://www.aygfsteel.com/improviser/comments/commentRss/149474.html http://www.aygfsteel.com/improviser/services/trackbacks/149474.html
通过q几天对Spring的研读,剖析了Spring的基本核心模块——IoC和AOP。今天将对其作个基础性的ȝ?br /> Spring 是一个开源框Ӟ是ؓ了解决企业应用程序开发复杂性而创建的。框架的主要优势之一是其分层架构,分层架构允许您选择使用哪一个组Ӟ模块构徏在核心容器之上,核心容器定义了创建、配|和理 bean 的方?同时?J2EE 应用E序开发提供集成的框架。其中作为Spring的核心模块即是Spring面向斚w~程(AOP)和控制反?IOC)容器。Spring 设计的核心是 org.springframework.beans
包,BeanFactory
BeanFactory
支持两个对象模型单态和原型?code>BeanFactory是Spring作ؓIOC 容器的基?br /> 控制反{模式Q不创徏对象Q但是描q创建它们的方式。在代码中不直接与对象和服务q接Q但在配|文件中描述哪一个组仉要哪一Ҏ务。容器(?Spring 框架中是 IOC 容器Q负责将q些联系在一赗在典型?IOC 场景中,容器创徏了所有对象,q设|必要的属性将它们q接在一P军_什么时间调用方法。IOC 的一个实现模?通过接口、通过 JavaBean 的属性、依赖性以构造函数的形式提供?br /> 面向斚w的编E,?AOPQ是一U编E技术,它允许程序员Ҏ切关注点或横切典型的职责分界U的行ؓQ例如日志和事务理Q进行模块化。AOP 的核心构造是斚wQ它那些媄响多个类的行为封装到可重用的模块中。AOP ?IOC 是补充性的技术,它们都运用模块化方式解决企业应用E序开发中的复杂问题。在典型的面向对象开发方式中Q可能要日志记录语句放在所有方法和 Java cM才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,q以声明的方式将它们应用到需要日志的lg上。当Ӟ优势是 Java cM需要知道日志服务的存在Q也不需要考虑相关的代码。所以,?Spring AOP ~写的应用程序代码是松散耦合的。AOP 的功能完全集成到?Spring 事务理、日志和其他各种Ҏ的上下文中?/font>
]]> SpringW记之九QAOP in SpringQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/29/149406.htmlimproviser improviser Fri, 28 Sep 2007 17:50:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/29/149406.html http://www.aygfsteel.com/improviser/comments/149406.html http://www.aygfsteel.com/improviser/archive/2007/09/29/149406.html#Feedback 1 http://www.aygfsteel.com/improviser/comments/commentRss/149406.html http://www.aygfsteel.com/improviser/services/trackbacks/149406.html Spring IoC?Spring
AOPl合Q一起Ş成了SpringQ这样一个有机整体,使得构徏轻量U的J2EE架构成ؓ可能Q而且事实证明Q非常有效。没有Spring
IoC的Spring AOP是不完善的,没有Spring AOP的Spring IoC是不健壮的?本文研究Spring框架中的面向斚w~?Aspect-Oriented ProgrammingQAOP)Q进而通过例子解析如何q用Spring中的所有通知cd和切入点来实现更实用的方面和面向斚w设计模式?/font> AOP概念Q?/font> AdviceQ?/b> 如何before通知、afterReturning通知和afterThrowing通知声明为bean?/font> Pointcut Q?/b>如何声明静态切入点逻辑以将XML Spring Bean Configuration文g中的所有内容联pd一赗? AdvisorQ?/b> 兌切入点定义与通知bean的方式?/font> Spring AOP 是用代理来完成的,Spring 两种方式Q?span lang="EN-US"> JDK 动态代理,需要设定一l代理接口;CGLIB 代理Q可代理接口和类?span lang="EN-US"> Spring提供?UAdvicecdQInterception Around、Before、After
Returning、Throw和Introduction。它们分别在以下情况下被调用Q在JointPoint前后、JointPoint前?
JointPoint后、JointPoint抛出异常时、JointPoint调用完毕后?br />配置文gQ?/b> 1 < beans > 2 < bean id ="myAOPProxy" class="org.springframework.aop.framework.ProxyFactoryBean" > 3 < property name ="proxyInterfaces" > 4 < value > ITest </ value > 5 </ property > 6 < property name ="target" > 7 < ref local = "test" /> 8 </ property > 9 < property name ="interceptorNames" > 10 < value > myPotincutAdvisor </ value > 11 </ property > 12 </ bean > 13 14 < bean id ="test" class ="Test" /> 15 16 < bean id ="MyInterceptor" class ="MethodTimeCostInterceptor" /> 17 18 < bean id ="myPotincutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor" > 19 < property name ="advice" > 20 < ref local ="MyInterceptor" /> 21 </ property > 22 < property name ="patterns" > 23 < list > 24 < value > .* </ value > 25 < value > .* </ value > 26 </ list > 27 </ property > 28 </ bean > 29 </ beans >
分析代码Q?/font> 1 ?span style="color: rgb(0, 0, 0);">< bean id ="myAOPProxy" class="org.springframework.aop.framework.ProxyFactoryBean" >声明注入了代理实例myAOPProxy ? 2?proxyInterfaces声明被代理接口ITest?/span>3?target声明被代理目的类?br /> 4 ?interceptorNames讄拦截器ؓ myPotincutAdvisor ?br />5? patterns为拦截器讄配匹方式Q即在所被配Ҏ功的Ҏ被调用时执行拦截器内宏V?/font> 该配|文Ӟ指定要加载一个接口与ITest相匹配的bean。该bean随后被关联到Test实现cR看h好像是费了很大力气只Z加蝲一个简单的beanq调用一个方法,但是q个配置文g只是?
Spring框架可以透明地对应用E序应用其组件的众多Ҏ的一个体?/font>?/font> ]]> SpringW记之八QInternationalization of springQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/27/148476.htmlimproviser improviser Wed, 26 Sep 2007 17:00:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/27/148476.html http://www.aygfsteel.com/improviser/comments/148476.html http://www.aygfsteel.com/improviser/archive/2007/09/27/148476.html#Feedback 1 http://www.aygfsteel.com/improviser/comments/commentRss/148476.html http://www.aygfsteel.com/improviser/services/trackbacks/148476.html
国际化支持在实际开发中可能是最常用的特性,本文分析Spring?/font>
ApplicationContext
提供国际化支持,
其提供了更加强大的功能,如信息的自动装配以及热部|功能(配置文g修改后自动读取,而无需重新启动应用E序Q?span lang="EN-US">
目前Spring 中提供了两个 MessageSource 接口的实玎ͼ?span lang="EN-US">ResourceBundleMessageSource ?span lang="EN-US">ReloadableResourceBundleMessageSourceQ后者提供了无需重启卛_重新加蝲配置信息的特性?/font>
在下面的配置文g中,通过MessageResource 的一个实现类org.springframework.context.support.ResourceBundleMessageSource 来获得国际化的信息?/font> 1 < beans > 2 < description > Spring Quick Start </ description > 3 < bean id ="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource" > 4 < property name ="basenames" > 5 < list > 6 < value > messages </ value > 7 </ list > 8 </ property > 9 </ bean > 10 </ beans > 11
q里声明了一个名?/span>
messageSource
?span lang="EN-US">Bean Q?/span>
注意Q?/span>
对于Message 定义Q?span lang="EN-US">Bean ID 必须?span lang="EN-US">messageSourceQ这是目?span lang="EN-US">Spring的编码规U)Q对应类?span lang="EN-US">ResourceBundleMessageSource?/font>
而其中的basename 属性用來设定资源信息文件的前置文g名称Q在本例中ؓmessages ?span lang="EN-US">Spring 会自动在CLASSPATH 根\径中按照如下序搜寻资源信息文gq进行加载(?span lang="EN-US">Locale?span lang="EN-US">zh_CNZQ其?span lang="EN-US">Spring在实际上调用?span lang="EN-US">JDK?span lang="EN-US">ResourceBundled配置文gQ?/font>
:
messages_zh_CN.properties
messages_zh.properties
messages.properties
messages_zh_CN.class
messages_zh.class
messages.class
资源配置信息文g中的内容
1 messages_zh_CN.propertiesQ?br /> 2 userinfo = 当前d用户: [ {0} ] d旉: [ {1} ] 3 messages_en_US.propertiesQ?br /> 4 userinfo = Current Login user: [ {0} ] Login time: [ {1} ] 5
试代码Q?/font> 1 ApplicationContext ctx = new FileSystemXmlApplicationContext( " bean.xml " ); 2 Object[] arg = new Object[] 3 { " Erica " , Calendar.getInstance().getTime() 4 }; 5 // 以系l默认Locale加蝲信息(对于中文WinXP而言Q默认ؓzh_CN) 6 String msg = ctx.getMessage( " userinfo " , arg); 7 System.out.println( " Message is ===> " + msg); 8
代码中,我们一?span lang="EN-US">Object 数组arg 作ؓ参数传递给ApplicationContext.getMessage ҎQ这个参C包含了出现在最l文字信息中的可变内容,ApplicationContext 根据参C?span lang="EN-US">Locale信息对其q行处理Q如针对不同 Locale 讑֮日期输出格式Q,q用其替换配|文件中?span lang="EN-US">{n}标识Q?span lang="EN-US">n代表参数数组中的索引Q从1 开始)?span lang="EN-US">
q行上面的代码,得到以下输出的内容: Message
is ===> | ì〃?span lang="EN-US">? | ì??? t??? ?span lang="EN-US">: [Erica] |ì??? to 〃?span lang="EN-US">??:[07-9-27 上午1:27]
针对ResourceBundle 的编码过E中发生的问题。这是由于{码过E中产生的编码问题引发的。比较简单的解决办法是通过JDK 提供的{码工?span lang="EN-US">native2ascii.exe q行转换。执行: native2ascii
messages_zh_CN.properties msg.txt?o:p>再用msg.txt 文g替换Messages_zh_CN.properties 文g?/font>
再次q行CZ代码Q得到正输出: Message is ===> 当前d用户: [Erica] d旉:[07-9-27 上午1:30]
试在代码中指定不同?span lang="EN-US">Locale 参数Q?span lang="EN-US">
String
msg = ctx.getMessage("userinfo", arg, Locale.US); 再次q行Q可以看刎ͼ
Message
is ===> Current Login user: [Erica] Login time::[9/27/07 1:35AM]
可见Q前者根据当前默?span lang="EN-US">Locale"zh_CN" Q?span lang="EN-US">getMessageҎ自动加蝲?span lang="EN-US">messages_zh_CN.properties文gQ后?/span>getMessage ҎҎ指定~码"en_US" 加蝲?span lang="EN-US">messages_en_US.properties 文g?/span>
]]> SpringW记之七QTypes of InjectionQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/26/148472.htmlimproviser improviser Wed, 26 Sep 2007 15:59:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/26/148472.html http://www.aygfsteel.com/improviser/comments/148472.html http://www.aygfsteel.com/improviser/archive/2007/09/26/148472.html#Feedback 0 http://www.aygfsteel.com/improviser/comments/commentRss/148472.html http://www.aygfsteel.com/improviser/services/trackbacks/148472.html
本文研究Spring的三U依赖注入实现类?/b>—?b style="">接口注入Q?span lang="EN-US">Interface Injection Q?/span> 讑ր注入(Setter Injection Q?/span> 构造子注入Q?span lang="EN-US">Constructor Injection Q?/span>
Type1
接口注入Q?/span>
传统的创建接口对象的ҎQ?/span>
借助接口来将调用者与实现者分R如下面的代码所C:
1 public class ClassA 2 { 3 private InterfaceB clzB; 4 public doSomething() 5 { 6 Ojbect obj = Class.forName(Config.BImplementation).newInstance(); 7 clzB = (InterfaceB)obj; 8 clzB.doIt(); 9 } 10 …?br /> 11 } 12
在代码中创徏InterfaceB 实现cȝ实例Qƈ该对象赋予clzB 。也是依据Java 中的对象动态多态技术: InterfaceB
clzB=new InterfaceBImpleClass();Z调用者与实现者在~译期分,于是有了上面的代码,我们Ҏ预先在配|文件中讑֮的实现类的类?span lang="EN-US">(Config.BImplementation) Q动?span lang="EN-US"> 加蝲实现c,q过InterfaceB 强制转型后ؓ ClassA 所用?/span>
Type2
讑ր注入:
在各U类型的依赖注入模式中,讑ր注入模式在实际开发中得到了最q泛的应用(其中很大一部分得力?span lang="EN-US">Spring 框架?/span>
影响Q?span lang="EN-US"> 使用IoC ?span lang="EN-US">Setter注射Q一些外部元数据被用于解决依赖性问题。ƈ且在Spring 中,q种元数据采取了单的XML 配置文g的Ş式?/font>
下面为某个类的示例代?span lang="EN-US">
(其中包含有一?span lang="EN-US">message 属性,该类通过?span lang="EN-US">setMessage()Ҏ获得叛_器所提供的倹{?
1 public class UpperAction implements Action 2 { 3 private String message; 4 public String getMessage() 5 { 6 return message; 7 } 8 public void setMessage(String string) 9 { 10 message = string; 11 } 12 } 13
其中message
属性的值通过配置文g来提?
1 < bean id ="theUpperAction" class ="springj2seapp.UpperAction" > 2 < property name ="message" > 3 < value > HeLLo,UpperAction </ value > 4 </ property > 5 </ bean > 6
Type3
构造子注入Q?/span>
?span lang="EN-US">Type3 cd的依赖注入机制中Q依赖关pL通过cL造函数徏立,容器通过调用cȝ构造方法,其所需的依赖关pL入其中?/font>
CZ代码Q?br />配置文g如下 1 < bean id ="exampleBean" class ="examples.ExampleBean" > 2 3 < constructor-arg > 4 5 < ref bean ="anotherExampleBean" /> 6 </ constructor-arg > 7 < constructor-arg >< ref bean ="yetAnotherBean" /></ constructor-arg > 8 < constructor-arg type ="int" > 9 < value > 1 </ value > 10 </ constructor-arg > 11 </ bean > 12 < bean id ="anotherExampleBean" class ="examples.AnotherBean" /> 13 < bean id ="yetAnotherBean" class ="examples.YetAnotherBean" /> 14
ExampleBean代码Q?/span>
1 public class ExampleBean 2 { 3 private AnotherBean beanOne; 4 private YetAnotherBean beanTwo; 5 private int i; 6 public ExampleBean(AnotherBean anotherBean, YetAnotherBean yetAnotherBean, int i) 7 { 8 this .beanOne = anotherBean; 9 this .beanTwo = yetAnotherBean; 10 this .i = i; 11 } 12 } 13
当构造方法中带多个不同的基本数据cd的参数时Qؓ了避免生二义性,可以采用type 或?span lang="EN-US">index 来指定构造方法的参数的类型和序?/font>
如:
typeҎ 1 < constructor-arg type ="int" > 2 < value > 7500000 </ value > 3 </ constructor-arg > 4 < constructor-arg type ="java.lang.String" > 5 < value > 42 </ value > 6 </ constructor-arg > 7
indexҎ 1 < bean id ="exampleBean" class ="examples.ExampleBean" > 2 < constructor-arg index ="0" > 3 < value > 7500000 </ value > 4 </ constructor-arg > 5 < constructor-arg index ="1" > 6 < value > 42 </ value > 7 </ constructor-arg > 8 </ bean > 9
ȝQ?/b>
type1在灵zL、易用性上不如其他两种注入模式Q?/font>
Type2
?span lang="EN-US">Type3 型的依赖注入实现则是目前L?span lang="EN-US">IOC实现模式Q?/span>
Type3
?span lang="EN-US">Type2 模式各有千秋Q?span lang="EN-US">Spring都对Type3 ?span lang="EN-US">Type2cd的依赖注入机制提供了良好支持?/span>
?span lang="EN-US">Type3 cdZQ辅之以Type2 cd机制作ؓ补充Q可以达到最好的依赖注入效果Q不q对于基?span lang="EN-US">Spring
Framework开发的应用而言Q?span lang="EN-US">Type2使用更加q泛?span lang="EN-US">
]]>SpringW记之六QIoC SingletonQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/26/148298.htmlimproviser improviser Wed, 26 Sep 2007 05:22:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/26/148298.html http://www.aygfsteel.com/improviser/comments/148298.html http://www.aygfsteel.com/improviser/archive/2007/09/26/148298.html#Feedback 0 http://www.aygfsteel.com/improviser/comments/commentRss/148298.html http://www.aygfsteel.com/improviser/services/trackbacks/148298.html Spring中BeanFactory支持两个对象模型
单态:
模型提供了具有特定名U的对象的共享实例,可以在查询时对其q行索?span lang="EN-US">Singleton 是默认的也是最常用的对象模型。对于无状态 ?服务对象很理惟?/font>
原型Q?/span>
模型保每次索都会创建单独的对象。在每个用户都需要自q对象Ӟ原型模型最适合?/span>
实例Q?/font>
1 < beans > 2 3 <!-- non-singleton examples --> 4 < bean id ="nonSingleton" class ="java.lang.String" singleton ="true" > 5 < constructor-arg > 6 < value > Value </ value > 7 </ constructor-arg > 8 </ bean > 9 10 </ beans > 11 12 singletonQ指定此JavaBean是否采用单例QSingletonQ模式,如果设ؓ"true"Q则在BeanFactory作用范围内,只维护此JavaBean 的一个实例,代码通过BeanFactory 获得此JavaBean 实例的引用。反之,如果设ؓ"false"Q则通过BeanFactory获取此Java Bean 实例ӞBeanFactory每次都将创徏一个新的实例返回?/span>
1 public class NonSingleton { 2 3 public static void main(String[] args) { 4 5 BeanFactory factory = new XmlBeanFactory( new FileSystemResource( 6 " build/beans.xml " )); 7 8 String s1 = (String)factory.getBean( " nonSingleton " ); 9 String s2 = (String)factory.getBean( " nonSingleton " ); 10 System.out.println( " Identity Equal?: " + (s1 == s2)); 11 System.out.println( " Value Equal:? " + s1.equals(s2)); 12 System.out.println(s1); 13 System.out.println(s2); 14 } 15 }
分析l果Q?/font>
Identity Equal?: true Value Equal:? true Value Value
q果可以看出由fantory产生的bean对象只有一个?br />
注意 Q?/span>
?span lang="EN-US">Spring 中消除了q戯己来实现Singleton 模式的应用,Spring Bean 的缺省行为就?span lang="EN-US">SingletonQ不必再ZSingleton ~码?/font>
]]> SpringW记之五QHierarchical Bean Factory UsageQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/25/147934.htmlimproviser improviser Mon, 24 Sep 2007 16:05:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/25/147934.html http://www.aygfsteel.com/improviser/comments/147934.html http://www.aygfsteel.com/improviser/archive/2007/09/25/147934.html#Feedback 1 http://www.aygfsteel.com/improviser/comments/commentRss/147934.html http://www.aygfsteel.com/improviser/services/trackbacks/147934.html
本文研究Spring分层Bean Factory用法Q先看有关代码:
1 parent.xml 2 3 <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd" > 4 < beans > 5 < bean id ="injectBean" class ="java.lang.String" > 6 < constructor-arg > 7 < value > Bean In Parent </ value > 8 </ constructor-arg > 9 </ bean > 10 < bean id ="injectBeanParent" class ="java.lang.String" > 11 < constructor-arg > 12 < value > Bean In Parent </ value > 13 </ constructor-arg > 14 </ bean > 15 </ beans >
1 beans.xml 2 3 <! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd" > 4 < beans > 5 <!-- hierarchical bean factories --> 6 < bean id ="target1" class ="SimpleTarget" > 7 < property name ="val" > 8 < ref bean ="injectBeanParent" /> 9 </ property > 10 </ bean > 11 12 < bean id ="target2" class ="SimpleTarget" > 13 < property name ="val" > 14 < ref local ="injectBean" /> 15 </ property > 16 </ bean > 17 18 < bean id ="target3" class ="SimpleTarget" > 19 < property name ="val" > 20 < ref parent ="injectBean" /> 21 </ property > 22 </ bean > 23 24 < bean id ="injectBean" class ="java.lang.String" > 25 < constructor-arg > 26 < value > Bean In Child </ value > 27 </ constructor-arg > 28 </ bean > 29 </ beans > 30
SimpleTarget中只有一属性String val
1 public static void main(String[] args) { 2 BeanFactory parent = new XmlBeanFactory( new FileSystemResource( 3 " build/parent.xml " )); 4 BeanFactory child = new XmlBeanFactory( new FileSystemResource( 5 " build/beans.xml " ), parent); 6 7 SimpleTarget target1 = (SimpleTarget) child.getBean( " target1 " ); 8 SimpleTarget target2 = (SimpleTarget) child.getBean( " target2 " ); 9 SimpleTarget target3 = (SimpleTarget) child.getBean( " target3 " ); 10 11 System.out.println(target1.getVal()); 12 System.out.println(target2.getVal()); 13 System.out.println(target3.getVal()); 14 }
q行l果Q?/span>
Bean In Parent
Bean In Child
Bean In Parent
分析q程Q?/b>
在bean factory被加载过E中分别加蝲各层Bean FactoryQ?/font>
BeanFactory parent
= new XmlBeanFactory( new FileSystemResource( " build/parent.xml " )); BeanFactory child = new XmlBeanFactory( new FileSystemResource( " build/beans.xml "
), parent );
其中parent参数指定了bean factory间的父子关系?/font>
分析l果Q?/b>
W一行结果ؓ在父factory中定义的参数Q说明在子fantory中可以直接调用父fantory元素Q类gjava中的l承关系?br />
W二行结果说?/font>
<
ref
local
="injectBean"
/>中local指向本fantory元素?br />
W三行结果ؓBean In ParentQ说?/span>
<
ref
parent
="injectBean"
/>中parent指向父fantory中元素?/span>
]]> SpringW记之四QSpring EventQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/24/147914.htmlimproviser improviser Mon, 24 Sep 2007 14:38:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/24/147914.html http://www.aygfsteel.com/improviser/comments/147914.html http://www.aygfsteel.com/improviser/archive/2007/09/24/147914.html#Feedback 3 http://www.aygfsteel.com/improviser/comments/commentRss/147914.html http://www.aygfsteel.com/improviser/services/trackbacks/147914.html 阅读全文 ]]> SpringW记之三QUsage of property configQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/24/147777.htmlimproviser improviser Mon, 24 Sep 2007 05:51:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/24/147777.html http://www.aygfsteel.com/improviser/comments/147777.html http://www.aygfsteel.com/improviser/archive/2007/09/24/147777.html#Feedback 3 http://www.aygfsteel.com/improviser/comments/commentRss/147777.html http://www.aygfsteel.com/improviser/services/trackbacks/147777.html 首先定义模型接口ModelQ视图接口ViewQ以及它们实现类ImpModelQImpView.
Model中定义方法getString();View中定义Model实例为其属性,在实现类ImpView中实现方? disPlay(),其方法体为Model实例的getString()ҎQƈ其打印出来?nbsp; 阅读全文 ]]> SpringW记之二QCollection InjectionQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/24/147710.htmlimproviser improviser Mon, 24 Sep 2007 02:23:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/24/147710.html http://www.aygfsteel.com/improviser/comments/147710.html http://www.aygfsteel.com/improviser/archive/2007/09/24/147710.html#Feedback 2 http://www.aygfsteel.com/improviser/comments/commentRss/147710.html http://www.aygfsteel.com/improviser/services/trackbacks/147710.html , , 以及 元素定义和设|与java collectioncd对应的ListQSetQMapQRproperties的倹{?nbsp; 阅读全文 ]]> SpringW记之一Q初探SpringQ?/title> http://www.aygfsteel.com/improviser/archive/2007/09/24/147650.htmlimproviser improviser Sun, 23 Sep 2007 17:31:00 GMT http://www.aygfsteel.com/improviser/archive/2007/09/24/147650.html http://www.aygfsteel.com/improviser/comments/147650.html http://www.aygfsteel.com/improviser/archive/2007/09/24/147650.html#Feedback 5 http://www.aygfsteel.com/improviser/comments/commentRss/147650.html http://www.aygfsteel.com/improviser/services/trackbacks/147650.html 初探SpringE序Q程序如下:
1 BeanNaming.java 2 package spring.beantest; 3 4 import org.springframework.beans.factory.BeanFactory; 5 import org.springframework.beans.factory.xml.XmlBeanFactory; 6 import org.springframework.core.io.FileSystemResource; 7 8 public class BeanNaming { 9 public static void main(String []args) 10 { 11 BeanFactory factory = new XmlBeanFactory( new FileSystemResource( " src/applicationContext.xml " )); 12 13 String s1 = (String)factory.getBean( " name1 " ); 14 String s2 = (String)factory.getBean( " name2 " ); 15 String s3 = (String)factory.getBean( " name3 " ); 16 String s4 = (String)factory.getBean( " name4 " ); 17 18 System.out.println((s1 == s2)); 19 System.out.println((s2 == s3)); 20 System.out.println((s3 == s4)); 21 22 String[] x = factory.getAliases( " name3 " ); 23 for (String str:x) 24 { 25 System.out.println(str); 26 } 27 28 } 29 } 30 31 applicationContext.xml 32 <? xml version = " 1.0 " encoding = " UTF-8 " ?> 33 <! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN " " http://www.springframework.org/dtd/spring-beans.dtd " > 34 < beans > 35 <!-- aliasing examples --> 36 < bean id = " name1 " name = " name2,name3,name4 " class = " java.lang.String " /> 37 </ beans >
输出l果为:
true
true
true
name1
name4
name2
可以看出Q用中id属性和name属性几乎没有Q何区别。调用beanfactory.getAliases(string)的方法时Q传入的参数可以是Q意一个bean名字Q输出的别名则是除去作ؓ参数本n之外的所?
bean名?/span>
?/span>Q?span style="color: rgb(74, 48, 255);">在写
applicationContxt.xml文gӞ如果没有定义<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">Q则会抛?/span>Cannot find the declaration of element 'beans' 异常?/span>
以上使用BeanFactory寚w|文件进行加载,BeanFactoryQ是Ҏ配置文g负责创徏Bean的实例,q负责Bean的生命周期的理-
--Q包括Bean的生成与销毁、Bean的创建方式的识别Q是否ؓsingletonQ、Bean的各个属性的讑֮、依赖关pȝ建立{?br />
ApplicationContext接口Q提供了国际化、事件处理及beans在context中的自查能力。它也可创徏h层次l构context?
境,bean的作用域和可讉K区域限制在应用程序的一个特定部分中。下面演C如何用ApplicationContext接口?/span>
1 <! DOCTYPE beans PUBLIC " -//SPRING//DTD BEAN//EN " " http://www.springframework.org/dtd/spring- beans.dtd " > 2 < beans > 3 < bean id = " bean_1 " class = " BeanTest " /> 4 < bean id = " bean_2 " class = " BeanTest " /> 5 </ beans > 6 7 8 public class BeanTest { 9 public void test() { 10 System.out.println( " test.. " ); 11 } 12 } 13 14 15 import org.springframework.context.ApplicationContext; 16 import org.springframework.context.support.FileSystemXmlApplicationContext; 17 18 public class BeanNameExample { 19 20 public static void main(String[] args) { 21 ApplicationContext ctx = new FileSystemXmlApplicationContext( 22 " build/applicationContext.xml " ); 23 24 BeanTest beanOne = (BeanTest)ctx.getBean( " bean_1 " ); 25 BeanTest beanTwo = (BeanTest)ctx.getBean( " bean_2 " ); 26 27 beanOne.test(); 28 beanTwo.test(); 29 } 30 } 31
lgQApplicationContext与BeanFactory的不同点
BeanFactory提供了针对JavaBean的管理功能,而ApplicationContext提供了一个更为框架化的实玎ͼ从上面的CZ中可?
看出QBeanFactory的用方式更加类g个APIQ而非Framework
styleQ。ApplicationContext覆盖了BeanFactory的所有功能,q提供了更多的特性。此外,
ApplicationContextZ现有应用框架相整合,提供了更为开攑ּ的实玎ͼ如对于Web应用Q我们可以在web.xml中对
ApplicationContextq行配置Q?/strong> ]]>
վ֩ģ壺
Ԫ |
|
|
|
˲ |
÷ |
|
ﴨ |
̫ |
|
Ž |
ⶫ |
|
̩ |
|
|
|
ع |
ˮ |
ͬ |
Ұ |
ˮ |
|
ʯȪ |
¡ |
|
ͨ |
|
ֱ |
|
ƽ |
̳ |
ɽ |
|
|
ɽʡ |
ͨ |
|
|
|
ԭ |