﻿<?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-lsbwahaha-随笔分类-spring</title><link>http://www.blogjava.net/lsbwahaha/category/38818.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 05 Nov 2009 16:35:55 GMT</lastBuildDate><pubDate>Thu, 05 Nov 2009 16:35:55 GMT</pubDate><ttl>60</ttl><item><title>谈谈Spring配置中的id和name属性有意思的地方(转)</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/11/03/300935.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Tue, 03 Nov 2009 09:10:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/11/03/300935.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/300935.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/11/03/300935.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/300935.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/300935.html</trackback:ping><description><![CDATA[<br />
&nbsp;&nbsp;&nbsp; 其实这篇文章很早看到的，但仔细想想其实没多大意思，有一次维护代码的时候，发现一些看似有意思的写法，就在本博记录下，容易遗忘。<br />
小技巧感觉上很有意思，但并不是很实用，容易理解的配合，方便维护的配置，才是最好的代码。搞点小技巧，不方便维护。<br />
<br />
&nbsp;&nbsp;&nbsp; 在BeanFactory的配置中，&lt;bean&gt;是我们最常见的配置项，它有两个最常见的属性，即id和name，最近研究了一下，发现这两个属性还挺好玩的，特整理出来和大家一起分享。
<br />
<br />
1.id属性命名必须满足XML的命名规范，因为id其实是XML中就做了限定的。总结起来就相当于一个Java变量的命名：不能以数字，符号打头，不能有空格，如123，?ad,"ab
"等都是不规范的，Spring在初始化时就会报错，<span class="ident"><br />
&nbsp;&nbsp;&nbsp; org</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">.</span><span class="ident">sax</span><span class="punct">.</span><span class="ident">SAXParseException</span><span class="punct">:</span> <span class="ident">Attribute</span> <span class="ident">value</span> <span class="punct">"</span><span class="string">?ab</span><span class="punct">"</span> <span class="ident">of</span> <span class="ident">type</span> <span class="constant">ID</span> <span class="ident">must</span> <span class="ident">be</span> <span class="ident">a</span> <span class="ident">name</span><span class="punct">.</span><br />
<br />
2.name属性则没有这些限定，你可以使用几乎任何的名称，如?ab,123等，但不能带空格，如"a b","
abc"，，这时，虽然初始化时不会报错，但在getBean()则会报出诸如以下的错误： <br />
<span class="ident">&nbsp;&nbsp; org</span><span class="punct">.</span><span class="ident">springframework</span><span class="punct">.</span><span class="ident">beans</span><span class="punct">.</span><span class="ident">factory</span><span class="punct">.</span><span class="ident">NoSuchBeanDefinitionException</span><span class="punct">:</span> <span class="ident">No</span> <span class="ident">bean</span> <span class="ident">named</span> <span class="punct">'</span><span class="string">a b</span><span class="punct">'</span> <span class="ident">is</span> <span class="ident">defined</span><br />
<br />
3.配置文件中不允许出现两个id相同的&lt;bean&gt;，否则在初始化时即会报错，如： <br />
<span class="ident">&nbsp; org</span><span class="punct">.</span><span class="ident">xml</span><span class="punct">.</span><span class="ident">sax</span><span class="punct">.</span><span class="ident">SAXParseException</span><span class="punct">:</span> <span class="ident">Attribute</span> <span class="ident">value</span> <span class="punct">"</span><span class="string">aa</span><span class="punct">"</span> <span class="ident">of</span> <span class="ident">type</span> <span class="constant">ID</span> <span class="ident">must</span> <span class="ident">be</span> <span class="ident">unique</span> <span class="ident">within</span> <span class="ident">the</span> <span class="ident">document</span><span class="punct">.<br />
<br />
</span>4.但配置文件中允许出现两个name相同的&lt;bean&gt;，在用getBean()返回实例时，后面一个Bean被返回,应该是前面那个&lt;bean&gt;被后面同名的
&lt;bean&gt;覆盖了。有鉴于此，为了避免不经意的同名覆盖的现象，尽量用id属性而不要用name属性。<br />
<br />
<p>5.name属性可以用,隔开指定多个名字，如&lt;bean name="b1,b2,b3"&gt;,相当于多个别名，这时通过getBean("a1")
getBean("a2") getBean("a3")返回的都是同一个实例（假设是singleton的情况） <br />
<br />
6.如果id和name都没有指定，则用类全名作为name，如&lt;bean
class="com.stamen.BeanLifeCycleImpl"&gt;,则你可以通过
<br />
getBean("<span class="string">com.biao.GroupThreadImpl</span>")返回该实例。</p>
<p>7.如果存在多个id和name都没有指定，且实例类都一样的&lt;bean&gt;，如: <br />
</p>
<pre> <span class="punct">&lt;</span><span class="ident">bean</span> <span class="keyword">class</span><span class="punct">="</span><span class="string">com.biao.GroupThreadImpl</span><span class="punct">"/&gt;</span><br />
<br />
<span class="punct">&lt;</span><span class="ident">bean</span> <span class="keyword">class</span><span class="punct">="</span><span class="string">com.biao.GroupThreadImpl</span><span class="punct">"/&gt;</span><br />
<br />
<span class="punct">&lt;</span><span class="ident">bean</span> <span class="keyword">class</span><span class="punct">="</span><span class="string">com.biao.GroupThreadImpl</span><span class="punct">"/&gt;<br />
<br />
</span>则第一个bean通过getBean("<span class="string">com.biao.GroupThreadImpl</span>")获得， <br />
<br />
第二个bean通过getBean("<span class="string">com.biao.GroupThreadImpl</span>#1")获得， <br />
<br />
第三个bean通过getBean("<span class="string">com.biao.GroupThreadImpl</span>#2")获得，以此类推。 <br />
</pre>
<br />
<span class="punct"><br />
<br />
</span><br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/300935.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-11-03 17:10 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/11/03/300935.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中的AOP</title><link>http://www.blogjava.net/lsbwahaha/archive/2009/04/06/264091.html</link><dc:creator>胡鹏</dc:creator><author>胡鹏</author><pubDate>Mon, 06 Apr 2009 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/lsbwahaha/archive/2009/04/06/264091.html</guid><wfw:comment>http://www.blogjava.net/lsbwahaha/comments/264091.html</wfw:comment><comments>http://www.blogjava.net/lsbwahaha/archive/2009/04/06/264091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lsbwahaha/comments/commentRss/264091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lsbwahaha/services/trackbacks/264091.html</trackback:ping><description><![CDATA[<p>Spring 对AOP的支持（采用Annotation的方式）</p>
<p>&nbsp;<wbr></p>
<p>1.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> spring依赖库</p>
<p>*SPRING_HOME/dist/spring.jar</p>
<p>*SPRING_HOME/lib/Jakarta-commons/commons-logging.jar</p>
<p>*SPRING_HOME/lib/log4j/log4j-1.2.14.jar</p>
<p>*SPRING_HOME/lib/aspectj/*.jar<wbr></p>
<p>2.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 采用Aspect定义切面<wbr></p>
<p>3.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 在Aspect定义Pointcut和Advice<wbr></p>
<p>4.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/lsbwahaha/3333.jpg" border="0" /><br />
<br />
</p>
<p>注意：在这种方法定义中，切入点的方法是不被执行的，它存在的目的仅仅是为了重用切入点&nbsp;<wbr> 即Advice中通过方法名引用这个切入点</p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr></p>
<p>AOP：</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Cross cutting concern</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Aspect</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Advice</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Pointcut</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Joinpoint</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Weave</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Target Object</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Proxy</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> Introduction</p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr></p>
<p>Spring 对AOP的支持（采用配置文件的方式）</p>
<p>&nbsp;<wbr></p>
<p>1.spring依赖库</p>
<p>*SPRING_HOME/dist/spring.jar</p>
<p>*SPRING_HOME/lib/Jakarta-commons/commons-logging.jar</p>
<p>*SPRING_HOME/lib/log4j/log4j-1.2.14.jar</p>
<p>*SPRING_HOME/lib/aspectj/*.jar</p>
<p>&nbsp;<wbr></p>
<p>2.配置如下：</p>
<p align="left">&lt;aop:config&gt;</p>
<p align="left">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;aop:aspect id="security" ref="securityHandler"&gt;</p>
<p align="left">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;aop:pointcut id="allAddMethod" expression="execution(* com.lsb.spring.UserManagerImpl.add*(..))"/&gt;</p>
<p align="left">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;aop:before method="checkSecurity" pointcut-ref="allAddMethod" /&gt;</p>
<p align="left">&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/aop:aspect&gt;</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &lt;/aop:config&gt;</p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr></p>
<p>Spring 对AOP的支持(JoinPoint参数介绍)</p>
<p>&nbsp;<wbr></p>
<p>Aspect默认情况不用实现接口，但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口, 如果没有实现接口必须引入CGLIB库</p>
<p>&nbsp;<wbr></p>
<p>我们可以通过Advice中添加一个JoinPoint参数，这个值会由spring自动传入，从JoinPoint中可以取得参数值、方法名等等</p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr></p>
<p>&nbsp;<wbr></p>
<p>Spring 对AOP的支持</p>
<p>&nbsp;<wbr></p>
<p>1.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果目标对象实现了接口，默认情况下会采用JDK的动态代理实现AOP</p>
<p>2.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果目标对象实现了接口，可以强制使用CGLIB实现AOP</p>
<p>3.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> 如果目标对象没有实现了接口，必须采用CGLIB库，spring会在JDK动态代理和CGLIB之间转换</p>
<p>4.&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr></p>
<p>&nbsp;<wbr></p>
<p>如何强制使用CGLIB实现AOP？</p>
<p>*添加CGLIB库，SPRING_HOME/lib/cglib/*.jar</p>
<p>*在spring配置文件中加入&lt;aop:aspectj-autoproxy proxy-target-class="true"/&gt;</p>
<p>&nbsp;<wbr></p>
<p>JDK动态代理和CGLIB字节码生成的区别?</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> *JDK动态代理只能对实现了接口的类生成代理，而不能针对类</p>
<p>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> *CGLIB是针对类实现代理，主要是对指定的类生成一个子类，覆盖其中的方法，因为是继承，所以该类最好不要申明成final</p>
<p>&nbsp;<wbr></p>
<p><br />
</p>
<img src ="http://www.blogjava.net/lsbwahaha/aggbug/264091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lsbwahaha/" target="_blank">胡鹏</a> 2009-04-06 12:07 <a href="http://www.blogjava.net/lsbwahaha/archive/2009/04/06/264091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>