﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-lcs868-文章分类-spring</title><link>http://www.blogjava.net/lcs868/category/36646.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 16 Dec 2008 11:03:59 GMT</lastBuildDate><pubDate>Tue, 16 Dec 2008 11:03:59 GMT</pubDate><ttl>60</ttl><item><title>spring cron表达式</title><link>http://www.blogjava.net/lcs868/articles/246649.html</link><dc:creator>lcs868</dc:creator><author>lcs868</author><pubDate>Tue, 16 Dec 2008 08:06:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/246649.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/246649.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/246649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/246649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/246649.html</trackback:ping><description><![CDATA[<br />
<p><span style="font-size: 10pt">Cron表达式是一个字符串，字符串以5或6个空格隔开，分开工6或7个域，每一个域代表一个含义,Cron有如下两种语法 <br />
格式： <br />
Seconds Minutes Hours DayofMonth Month DayofWeek Year 或 <br />
Seconds Minutes Hours DayofMonth Month DayofWeek <br />
每一个域可出现的字符如下： </span></p>
<p><br />
<span style="font-size: 10pt">代码<br />
Seconds:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为0-59的整数&nbsp;&nbsp;&nbsp; <br />
Minutes:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为0-59的整数&nbsp;&nbsp;&nbsp; <br />
Hours:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为0-23的整数&nbsp;&nbsp;&nbsp; <br />
DayofMonth:可出现,-&nbsp; *&nbsp; / ? L W C八个字符，有效范围为0-31的整数&nbsp;&nbsp;&nbsp;&nbsp; <br />
Month:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为1-12的整数或JAN-DEc&nbsp;&nbsp;&nbsp; <br />
DayofWeek:可出现,-&nbsp; *&nbsp; / ? L C #四个字符，有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天，2表示星期一， 依次类推&nbsp;&nbsp;&nbsp; <br />
Year:可出现,-&nbsp; *&nbsp; / 四个字符，有效范围为1970-2099年&nbsp;&nbsp; <br />
&nbsp;</span></p>
<p><span style="font-size: 10pt">每一个域都使用数字，但还可以出现如下特殊字符，它们的含义是： </span></p>
<p><br />
<span style="font-size: 10pt">代码<br />
(1)*：表示匹配该域的任意值，假如在Minutes域使用*,即表示每分钟都会触发事件。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值，但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度，不管20日到底是星期几，则只能使用如下写法： 13&nbsp; 13 15 20 * ?,其中最后一位只能用？，而不能使用*，如果使用*表示不管星期几都会触发，实际上并不是这样。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(3)-:表示范围，例如在Minutes域使用5-20，表示从5分到20分钟每分钟触发一次&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(4)/：表示起始时间开始触发，然后每隔固定时间触发一次，例如在Minutes域使用5/20,则意味着5分钟触发一次，而25，45等分别触发一次.&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(5),:表示列出枚举值值。例如：在Minutes域使用5,20，则意味着在5和20分每分钟触发一次。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(6)L:表示最后，只能出现在DayofWeek和DayofMonth域，如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域，系统将在离指定日期的最近的有效工作日触发事件。例如：在DayofMonth使用5W，如果5日是星期六，则将在最近的工作日：星期五，即4日触发。如果5日是星期天，则在6日触发；如果5日在星期一到星期五中的一天，则就在5日触发。另外一点，W的最近寻找不会跨过月份&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(8)LW:这两个字符可以连用，表示在某个月最后一个工作日，即最后一个星期五。&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
(9)#:用于确定每个月第几个星期几，只能出现在DayofMonth域。例如在4#2，表示某月的第二个星期三。&nbsp;&nbsp;&nbsp; <br />
举几个例子: </span></p>
<p><br />
<span style="font-size: 10pt">代码<br />
0 0&nbsp; 2&nbsp; 1 *&nbsp; ? *&nbsp; 表示在每月的1日的凌晨2点调度任务&nbsp;&nbsp;&nbsp;&nbsp; <br />
0 15 10 ? *&nbsp; MON-FRI 表示周一到周五每天上午10：15执行作业&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
0 15 10 ? 6L 2002-2006 表示200-2006年的每个月的最后一个星期五上午10:15执行作业&nbsp;&nbsp; <br />
91linux </span></p>
<p><br />
<span style="font-size: 10pt">一个cron表达式有至少6个（也可能7个）有空格分隔的时间元素。</span></p>
<p><span style="font-size: 10pt">按顺序依次为 <br />
秒（0~59） <br />
分钟（0~59） </span></p>
<p><span style="font-size: 10pt">小时（0~23） </span></p>
<p><span style="font-size: 10pt">天（月）（0~31，但是你需要考虑你月的天数） </span></p>
<p><span style="font-size: 10pt">月（0~11） </span></p>
<p><span style="font-size: 10pt">天（星期）（1~7 1=SUN 或 SUN，MON，TUE，WED，THU，FRI，SAT） </span></p>
<p><span style="font-size: 10pt">7.年份（1970－2099）</span></p>
<p><span style="font-size: 10pt">其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. </span></p>
<p><span style="font-size: 10pt">0 0 10,14,16 * * ? 每天上午10点，下午2点，4点<br />
0 0/30 9-17 * * ?&nbsp;&nbsp; 朝九晚五工作时间内每半小时<br />
0 0 12 ? * WED 表示每个星期三中午12点 <br />
"0 0 12 * * ?" 每天中午12点触发 <br />
"0 15 10 ? * *" 每天上午10:15触发 <br />
"0 15 10 * * ?" 每天上午10:15触发 <br />
"0 15 10 * * ? *" 每天上午10:15触发 <br />
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发 <br />
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发 <br />
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发 <br />
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 <br />
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发 <br />
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发 <br />
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发 <br />
"0 15 10 15 * ?" 每月15日上午10:15触发 <br />
"0 15 10 L * ?" 每月最后一日的上午10:15触发 <br />
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发 <br />
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发 <br />
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发 </span></p>
<p><br />
<span style="font-size: 10pt">有些子表达式能包含一些范围或列表 </span></p>
<p><span style="font-size: 10pt">例如：子表达式（天（星期））可以为 &#8220;MON-FRI&#8221;，&#8220;MON，WED，FRI&#8221;，&#8220;MON-WED,SAT&#8221; </span></p>
<p><span style="font-size: 10pt">&#8220;*&#8221;字符代表所有可能的值 </span></p>
<p><span style="font-size: 10pt">因此，&#8220;*&#8221;在子表达式（月）里表示每个月的含义，&#8220;*&#8221;在子表达式（天（星期））表示星期的每一天 </span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<p><span style="font-size: 10pt">&#8220;/&#8221;字符用来指定数值的增量 </span></p>
<p><span style="font-size: 10pt">例如：在子表达式（分钟）里的&#8220;0/15&#8221;表示从第0分钟开始，每15分钟 </span></p>
<p><span style="font-size: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在子表达式（分钟）里的&#8220;3/20&#8221;表示从第3分钟开始，每20分钟（它和&#8220;3，23，43&#8221;）的含义一样 </span></p>
<p><br />
<span style="font-size: 10pt">&#8220;？&#8221;字符仅被用于天（月）和天（星期）两个子表达式，表示不指定值 </span></p>
<p><span style="font-size: 10pt">当2个子表达式其中之一被指定了值以后，为了避免冲突，需要将另一个子表达式的值设为&#8220;？&#8221; </span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<p><span style="font-size: 10pt">&#8220;L&#8221; 字符仅被用于天（月）和天（星期）两个子表达式，它是单词&#8220;last&#8221;的缩写 </span></p>
<p><span style="font-size: 10pt">但是它在两个子表达式里的含义是不同的。 </span></p>
<p><span style="font-size: 10pt">在天（月）子表达式中，&#8220;L&#8221;表示一个月的最后一天 </span></p>
<p><span style="font-size: 10pt">在天（星期）自表达式中，&#8220;L&#8221;表示一个星期的最后一天，也就是SAT </span></p>
<p><span style="font-size: 10pt">如果在&#8220;L&#8221;前有具体的内容，它就具有其他的含义了 </span></p>
<p><span style="font-size: 10pt">例如：&#8220;6L&#8221;表示这个月的倒数第６天，&#8220;ＦＲＩＬ&#8221;表示这个月的最一个星期五 </span></p>
<p><span style="font-size: 10pt">注意：在使用&#8220;L&#8221;参数时，不要指定列表或范围，因为这会导致问题 </span></p>
<p><span style="font-size: 10pt">&nbsp;</span></p>
<p><span style="font-size: 10pt">字段&nbsp;&nbsp; 允许值&nbsp;&nbsp; 允许的特殊字符 <br />
秒&nbsp;&nbsp;&nbsp; 0-59&nbsp;&nbsp;&nbsp; , - * / <br />
分&nbsp;&nbsp;&nbsp; 0-59&nbsp;&nbsp;&nbsp; , - * / <br />
小时&nbsp;&nbsp;&nbsp; 0-23&nbsp;&nbsp;&nbsp; , - * / <br />
日期&nbsp;&nbsp;&nbsp; 1-31&nbsp;&nbsp;&nbsp; , - * ? / L W C <br />
月份&nbsp;&nbsp;&nbsp; 1-12 或者 JAN-DEC&nbsp;&nbsp;&nbsp; , - * / <br />
星期&nbsp;&nbsp;&nbsp; 1-7 或者 SUN-SAT&nbsp;&nbsp;&nbsp; , - * ? / L C # <br />
年（可选）&nbsp;&nbsp;&nbsp; 留空, 1970-2099&nbsp;&nbsp;&nbsp; , - * / </span></p>
<img src ="http://www.blogjava.net/lcs868/aggbug/246649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">lcs868</a> 2008-12-16 16:06 <a href="http://www.blogjava.net/lcs868/articles/246649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring配置文件注意事项</title><link>http://www.blogjava.net/lcs868/articles/246050.html</link><dc:creator>lcs868</dc:creator><author>lcs868</author><pubDate>Fri, 12 Dec 2008 14:56:00 GMT</pubDate><guid>http://www.blogjava.net/lcs868/articles/246050.html</guid><wfw:comment>http://www.blogjava.net/lcs868/comments/246050.html</wfw:comment><comments>http://www.blogjava.net/lcs868/articles/246050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs868/comments/commentRss/246050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs868/services/trackbacks/246050.html</trackback:ping><description><![CDATA[<p><span style="font-size: 12pt; color: #808000"><strong>1。不要使用autowiring</strong> </span></p>
<p><span style="font-size: 8pt">　　Spring可以通过类的自省来自动绑定其依赖部分，使得你不必明确指明bean的属性和构造器。Bean的属性可以通过属性名称或类型匹配来实现自动绑定。构造器通过类型匹配来实现自动绑定。你甚至可以指定自动检测自动绑定模式，它可以引导Spring选择一种适当的运行机制。先来看看下面的一个例子： </span></p>
<p><span style="font-size: 8pt">&lt;bean id="orderService" class="com.lizjason.spring.OrderService" autowire="byName"/&gt;　　OrderService类的属性名在容器中用于匹配bean实例。自动绑定可以潜在地节省一些打字和减少一些混乱。但是在现实世界的工程里你不应该使用这种方式，这是因为它牺牲了配置的清晰性和可维护性。许多指南和介绍中大量吹捧自动绑定是Spring的一种极好的特征而没有提到这一特性所带来的牺牲。依我的观点，这就像Spring中的object－pooling，它更像是一种为了占据更多市场的商业特征。它对于XML配置文件的小巧化是一个好办法，但实际上也增加了复杂程度，尤其当你运行有大量类声明的工程时。虽然Spring允许你混合自动绑定和手动绑定，但是这个矛盾会使XML配置更加晦涩难懂。 </span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>2.使用通俗的命名</strong> </span></p>
<p><span style="font-size: 8pt">　　这个方式对于Java编码也一样适用。在工程中使用清晰的、描述性的、协调的通俗名称对于开发者理解XML配置是十分有益的。例如对于bean ID，你可以根据通俗的Java类名来命名它。对于例子中OrderServiceDAO的bean ID命名为orderServiceDAO。对于大的工程，你可以在bean ID前面加上包名作为前缀。 </span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>3. 使用简洁的形式</strong> </span></p>
<p><span style="font-size: 8pt">　　简洁形式避免了冗长，是因为它从子元素中将属性值和参考写到属性中。例如下面的例子： </span></p>
<p><span style="font-size: 8pt">&lt;bean id="orderService" class="com.lizjason.spring.OrderService"&gt;<br />
&lt;property name="companyName"&gt;<br />
&lt;value&gt;lizjason&lt;/value&gt;<br />
&lt;/property&gt;<br />
&lt;constructor-arg&gt;<br />
&lt;ref bean="orderDAO"&gt;<br />
&lt;/constructor-arg&gt;<br />
&lt;/bean&gt; </span></p>
<p><span style="font-size: 8pt">&nbsp;</span></p>
<p><span style="font-size: 8pt">　　可以使用简洁形式将上述代码重写为： </span></p>
<p><span style="font-size: 8pt">&nbsp;</span></p>
<p><span style="font-size: 8pt">&lt;bean id="orderService" class="com.lizjason.spring.OrderService"&gt;<br />
&lt;property name="companyName" value="lizjason"/&gt;<br />
&lt;constructor-arg ref="orderDAO"/&gt;<br />
&lt;/bean&gt;</span></p>
<p><span style="font-size: 8pt">　　简洁形式功能在1.2版本中可以使用。对于&lt;ref local="..."&gt;没有简洁形式。 <br />
简洁形式不但可以节约你的打字，而且可以使XML配置文件清晰。它最引人注目的是当在一个配置文件中有大量定义的类时可以提高易读性。 </span></p>
<p><span style="font-size: 8pt"><span style="color: #808000"><span style="font-size: 12pt"><strong>4. 对于构造器参数匹配，类型名比序号好。</strong></span></span> </span></p>
<p><span style="font-size: 8pt">　　当一个构造器含有一个以上的同种类型的参数，或者属性值的标签已经被占用时，Spring允许你使用从0计数的序号来解决这些会带来混淆的问题。例如： </span></p>
<p><span style="font-size: 8pt">&lt;bean id="billingService" class="com.lizjason.spring.BillingService"&gt;<br />
&lt;constructor-arg index="0" value="lizjason"/&gt;<br />
&lt;constructor-arg index="1" value="100"/&gt;<br />
&lt;/bean&gt; </span></p>
<p><br />
<span style="font-size: 8pt">　　像下面这样，利用类型属性来编写会更好一些： </span></p>
<p><span style="font-size: 8pt">&lt;bean id="billingService" class="com.lizjason.spring.BillingService"&gt;<br />
&lt;constructor-arg type="java.lang.String" value="lizjason"/&gt;<br />
&lt;constructor-arg type="int" value="100"/&gt;<br />
&lt;/bean&gt;</span></p>
<p><span style="font-size: 8pt">　　使用索引可以稍稍减少一些冗长，但是和使用类型属性相比，它还是有容易发生错误的倾向和难于阅读的缺点。你应该只在构造器参数不明确的时候，才使用索引这一方法<br />
<span style="font-size: 12pt; color: #808000"><strong>5. 尽可能重用已定义过的bean </strong></span></span></p>
<p><span style="font-size: 8pt">　　Spring提供一种类似继承一样的机制来减少配置信息的复制并简化XML配置。定义一个子类可以从它父类那里继承配置信息，而父类实质上作为子类的一个模板。这就是大工程中所谓的重用。你所需要做的就是在父类bean中设置abstract=true，然后在子bean注明它自己的父类bean。例如： </span></p>
<p><span style="font-size: 8pt">&nbsp;</span></p>
<p><span style="font-size: 8pt">&lt;bean id="abstractService" abstract="true" class="com.lizjason.spring.AbstractService"&gt;<br />
&lt;property name="companyName" value="lizjason"/&gt;<br />
&lt;/bean&gt;<br />
&lt;bean id="shippingService" parent="abstractService" class="com.lizjason.spring.ShippingService"&gt;<br />
&lt;property name="shippedBy" value="lizjason"/&gt;<br />
&lt;/bean&gt;</span></p>
<p><br />
<span style="font-size: 8pt">　　ShippingService类从abstractService类那里继承companyName属性的值——lizjason。如果你没有为一个bean指明类或factory方法，那么这个bean便是抽象的。 </span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>6. 尽量使用ApplicationContext来装配定义的bean</strong> </span></p>
<p><span style="font-size: 8pt">　　像在Ant脚本中的引用一样，Spring的引用对于装配模块化的bean来说是很有用的。例如： </span></p>
<p><span style="font-size: 8pt">&nbsp;</span></p>
<p><span style="font-size: 8pt">&lt;beans&gt;<br />
&lt;import resource="billingServices.xml"/&gt;<br />
&lt;import resource="shippingServices.xml"/&gt;<br />
&lt;bean id="orderService" class="com.lizjason.spring.OrderService"/&gt;<br />
&lt;beans&gt;</span></p>
<p><span style="font-size: 8pt">　　相对于使用import在XML配置中来预装配，通过ApplicationContext来配置这些beans，显得更加灵活。利用ApplicationContext也使得XML配置易于管理。你可以像下面的例子那样在ApplictionContext构造器里布置bean： </span></p>
<p><span style="font-size: 8pt">&nbsp;</span></p>
<p><span style="font-size: 8pt">String[] serviceResources =<br />
...{"orderServices.xml", "billingServices.xml", "shippingServices.xml"};<br />
&nbsp;ApplicationContext orderServiceContext =<br />
new ClassPathXmlApplicationContext(serviceResources);</span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>7. 利用id作为bean的标识符</strong> </span></p>
<p><span style="font-size: 8pt">　　你可以指定一个id或名称来作为bean的标识符。虽然使用id不会提高易读性，但是它可以让XML parser对bean的引用有效方面进行更好的验证。如果由于XML IDREF的限制而不能使用某个id，你可以利用names来作为bean的标识符。XML IDREF的限制是id必须以字母开头（或者在XML规范中定义的标点符号），后面接着字母，数字，连字号，下划线，冒号等。实际上，遇到XML IDREF限制的问题是很少见的。 </span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>8. 在开发阶段使用依赖检验</strong> </span></p>
<p><span style="font-size: 8pt">　　你可以在bean中给依赖检验的属性设置值，而不采用原先默认的空值，属性设置例如simple，object或all，以便容器进行依赖检验。当bean的全部的属性（或某类属性）需要被明确设置或自动绑定时，依赖检验便显得很有用。 </span></p>
<p><span style="font-size: 8pt">&nbsp;</span></p>
<p><span style="font-size: 8pt">&lt;bean id="orderService" class="com.lizjason.spring.OrderService"<br />
&nbsp; dependency-check="objects"&gt;<br />
&lt;property name="companyName" value="lizjason"/&gt;<br />
&lt;constructor-arg ref="orderDAO"/&gt;<br />
&lt;/bean&gt;</span></p>
<p><span style="font-size: 8pt">　　在这个例子里，容器确保为orderService bean设置的属性不是primitives 或者 collections。为所有的bean设置默认依赖检测也是可以的，但是我们很少这样做，是因为有些bean的属性根本就不必设置。</span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>9. 为每个配置文件加上一个header comment</strong> </span></p>
<p><span style="font-size: 8pt">　　最好使用descriptive id和名称来代替在XML配置文件中的注释。此外，加上一个配置文件header也很有用处，它可以概述文件中所定义的bean。你可以选择将描述内容加入description标签中。例如： </span></p>
<p><span style="font-size: 8pt">&lt;beans&gt;<br />
&lt;description&gt; This file defines billing service related beans and it depends on<br />
&nbsp;baseServices.xml,which provides service bean templates...<br />
&lt;/description&gt; ...<br />
&lt;/beans&gt;</span></p>
<p><br />
<span style="font-size: 8pt">　　使用description标签的一个好处是可以容易地利用工具从标签中选取出description（的内容）。 </span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>10. 对于任何变化，要与队友积极交流</strong> </span></p>
<p><span style="font-size: 8pt">　　当你重构Java代码时，你需要随时更新配置文件并且通知队友。XML配置文件也是代码，它们是应用程序的至关重要的部分，但是它们难于阅读和维护。大部分时间你既要阅读XML配置文件又要阅读运行中的Java代码。 </span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>11. Setter injection优于constructor injection</strong> </span></p>
<p><span style="font-size: 8pt">　　Spring提供3种类型的依赖注入： constructor injection,setter injection, 和method injection。我们一般只用前两种类型。 </span></p>
<p><span style="font-size: 8pt">&nbsp;</span></p>
<p><span style="font-size: 8pt">&lt;bean id="orderService" class="com.lizjason.spring.OrderService"&gt;<br />
&lt;constructor-arg ref="orderDAO"/&gt;<br />
&lt;/bean&gt;<br />
&lt;bean id="billingService" class="com.lizjason.spring.BillingService"&gt;<br />
&lt;property name="billingDAO" ref="billingDAO"&gt;<br />
&lt;/bean&gt;</span></p>
<p><br />
<span style="font-size: 8pt">　　这个例子中，orderService类使用的是constructor injection，而BillingService类使用的是setter injection。constructor injection可以确保bean不会在一个非法状态下被创建，但是setter injection更加灵活并且更易管理，尤其当类存在很多属性并且其中一些是可选的情况下。 </span></p>
<p><span style="font-size: 12pt; color: #808000"><strong>12. 不要滥用依赖注入</strong> </span></p>
<p><span style="font-size: 8pt">　　作为最后一点，Spring ApplicationContext可以替你创建Java对象，但是并不是所有的Java对象都通过依赖注入来创建的。例如，全局的对象不应该通过ApplicationContext来创建。Spring是一个很棒的框架，但是，就易读性和易管理性而言，当定义大量bean的时候，基于XML的配置问题就会突出。过度的依赖注入会使XML配置变得复杂而且臃肿。记住！使用强大的IDE时，例如Eclipse和IntelliJ，与XML文件相比，Java代码更加易读，易维护，易管理。 </span></p>
<p><span style="font-size: 8pt">　　总结 </span></p>
<p><span style="font-size: 8pt">　　对于Spring的配置，XML是很优秀的方式。但当定义大量bean时，基于XML配置会变得冗长，笨拙。Spring提供了丰富的配置选项。适当地利用其中的选项可以使XML配置清晰，但是，有些选项，例如autowiring（自动绑定），往往会降低易读性和易维护性。文章中所列举的实例，可以帮助你创建出清晰易读的XML配置文件。 </span></p>
<img src ="http://www.blogjava.net/lcs868/aggbug/246050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs868/" target="_blank">lcs868</a> 2008-12-12 22:56 <a href="http://www.blogjava.net/lcs868/articles/246050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>