??xml version="1.0" encoding="utf-8" standalone="yes"?>精品一区二区三区中文字幕 ,亚洲欧美综合图区,校园春色综合http://www.aygfsteel.com/wyz191/category/18593.html走向一条通往JAVA的不归\...zh-cnTue, 03 Apr 2007 07:00:55 GMTTue, 03 Apr 2007 07:00:55 GMT60Spring _ AOP名词解释http://www.aygfsteel.com/wyz191/articles/107990.htmljava_蝈蝈java_蝈蝈Mon, 02 Apr 2007 07:27:00 GMThttp://www.aygfsteel.com/wyz191/articles/107990.htmlhttp://www.aygfsteel.com/wyz191/comments/107990.htmlhttp://www.aygfsteel.com/wyz191/articles/107990.html#Feedback0http://www.aygfsteel.com/wyz191/comments/commentRss/107990.htmlhttp://www.aygfsteel.com/wyz191/services/trackbacks/107990.htmlAOP是很多直觉难以理解的术语的根源。幸q的是,你只要理解三个概念,可以编写AOP模块。这三个概念是:adviceQpointcut?nbsp;advisor。advice是你惛_别的E序内部不同的地Ҏ(gu)入的代码。pointcut定义了需要注入advice的位|,通常是某个特定的cȝ一?nbsp;publicҎ(gu)。advisor是pointcut和advice的装配器Q是advice注入ȝ序中预定义位|的代码?br>
x?Concern):
         x点也是我们要考察或解决的问题.
         核心x?是指一个系l中的核心功?也就是一个系l中跟特定业务需求联pL紧密的商业逻辑.   
         横切x?lt;交叉x?gt;:分散在每个模块中解决同一L问题的关注点.

切面(Aspect):
       切面是关注点的模块化Q关注点可能横切多个对象。它除了包括属性、方法以外,同时q包括切入点Pointcut、增强Advice{,另外Q切面中q可以给一个现存的cL加属性、构造函敎ͼ指定一个类实现某一个接口、承某一个类{?/p>

q接?Join point):
         q接点也是q用E序执行q程中需要插入切面模块的某一?q接点主要强调的是一个具体的"?概念.q个点可以是一个方法、一个属性、构造函数、类静态初始化块,甚至一条语句?/p>

切入?Pointcuts):
         切入Ҏ(gu)一个或多个q接点,可以理解成一个点的集合?/p>

切面:
       x点的模块?x点可能横切多个对?

增强或通知(Advice):
         增强(Advice)里面定义了切面中的实际逻辑(卛_?,比如日志的写入的实际代码Q或是安全检查的实际代码。或者说Q增?Advice)是指在定义好的切入点处,所要执行的E序代码?br>          一般情况下增强(通知)主要有前增强、后增强、环l增ZU基本类型?br>          前增?Before advice)Q是指在q接点之前,先执行增Z的代??br>          后增?After advice)Q是指在q接Ҏ(gu)行后Q再执行增强中的代码。后增强一般分接点正常q回增强及连接点异常q回增强{类型?br>          环绕增强(Around advice)Q是一U功能强大的增强Q可以自由改变程序的程Q连接点q回值等。在环绕增强中出除了可以自由d需要的横切功能以外Q还需要负责主动调用连接点(通过proceed)来执行激z连接点的程序?/p>

引介(Introduction):
         引介是指l一个现有的cL加方法或字段属性,引介q可以在不改变现有类代码的情况下Q让现有的Javacd现新的接口,或者ؓ其指定一个父cM而实现多重ѝ相对于增强(Advice)可以动态改变程序的功能或流E来_引介(Introduction)则用来改变一个类的静态结构?/p>

l入(Weaving):
         l入是指把解x切问题的切面模板Q与pȝ中的其它核心模块通过一定策略或规则l合CLq程。在Java领域Q主要包括以下三U织入方式:
          1、运行时l入Q即在JAVAq行的过E中Q用JAVA提供代理来实现织入。根据代理生方式的不同Q运行时l入又可以进一步分?SE动态代理及动态字节码生成两种方式。由于J2SE动态代理只能代理接口,因此Q需要借助于一些动态字节码生成器来实现对类的动态代理。大多数AOP实现都是采用q种q行时织入的方式?br>          2、类加蝲器织入:指通过自定义的cd载器Q在虚拟机JVM加蝲字节码的时候进行织入?br>          3、编译器l入Q用专门的~译器来~译包括切面模块在内的整个应用程序,在编译的q程中实现织入,q种l入是功能最强大的?/p>

拦截?Interceptor):
          拦截器是用来实现对连接点q行拦截Q从而在q接点前或后加入自定义的切面模块功能?/p>

目标对象(Target object):
         指在Z拦蝲器机制实现的AOP框架中,位于拦截器链上最未端的对象实例。一般情况下Q拦截器未端都包含一个目标对象,通常也就实际业务对象。当Ӟ也可以不使用目标对象Q直接把多个切面模块l织CP形成一个完整最l应用程序,整个pȝ完全使用ZAOP~程Ҏ(gu)实现Q这U情况少见?nbsp;

AOP代理(Proxy):
         AOP代理是指在基于拦截器机制实现的AOP框架中,实际业务对象的代理对象。这个代理对象一般衩切面模块引用QAOP的切面逻辑正是插入在代理对象中来执行的。AOP代理的包括J2SE的代理以及其它字节码生成工具生成的代理两U类型?/p>

面向对象~程(OOP)解决问题的重点在于对具体领域模型的抽象,而面向切面编E?AOP)解决问题的关键则在于对关注点的抽象?/p>


Spring-AOP:使用Z代理及拦截器的机?与Spring IOC容器融入一体的AOP框架.Spring AOP采用q行?nbsp;   l入方式,使得可以在基?/p>

Sping框架的应用程序中使用各种声明式系l服务.


 



java_蝈蝈 2007-04-02 15:27 发表评论
]]>
springW记一Q?/title><link>http://www.aygfsteel.com/wyz191/articles/spring_1.html</link><dc:creator>java_蝈蝈</dc:creator><author>java_蝈蝈</author><pubDate>Fri, 19 Jan 2007 06:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/wyz191/articles/spring_1.html</guid><wfw:comment>http://www.aygfsteel.com/wyz191/comments/94925.html</wfw:comment><comments>http://www.aygfsteel.com/wyz191/articles/spring_1.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/wyz191/comments/commentRss/94925.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/wyz191/services/trackbacks/94925.html</trackback:ping><description><![CDATA[ <p align="center"> <strong> <font color="#000000" size="6">bean属性及构造器参数详解</font> </strong> </p> <p> <font color="#0000ff" size="4"> <strong>1、value元素</strong> </font> </p> <p><value/>元素通过字符串来指定属性或构造器参数的倹{?/p> <p><bean id="myDataSource" detroy-method="close" class="org.apache.commons.dbcp.BasicDataSource"><br /> <property name="driverClassName"><br />  <value>com.mysql.jdbc.Driver</value><br /> </proerpty><br /> <property name="url"><br />  <value>jdbc:mysql://localhost:3306/mydb</value><br /> </property><br /> <property name="username"><br />  <vlaue>root</value><br /> </property><br /></bean></p> <p> <font color="#0000ff" size="4"> <strong>2、idref元素</strong> </font> </p> <p>idref元素用来容器内其它bean的id传给<constructor-arg/>?lt;property/>元素Q同时提供错误难功能?/p> <p><bean id="theTargetBean" class="..."/><br /><bean id="theClientBean" class="..."><br /> <property name="targetName"><br />  <idref bean="theTargetBean" /><br /> </property><br /></bean></p> <p>{同?</p> <p><bean id="theTargetBean" class="..." /><br /><bean id="theClientBean" class="..."><br /> <property name="targetName"><br />  <value>theTargetBean</value><br /> </property><br /></bean></p> <p>使用idref标记允许容器在部|时验证所被引用的bean是否存在。此外,如果被引用的bean在同一XML文g内,且bean名字是bean id,那么可以使用local属性?br />此属性允许XML解析器在解析XML文g时来对引用的beanq行验证?/p> <p><property name="targetName"><br /> <idref local="theTargetBean" /><br /></property></p> <p> <font color="#0000ff" size="4"> <strong>3、ref元素</strong> </font> </p> <p>形式一Q?lt;ref bean="someBean"><br />q是最常见的Ş式是通过使用ref标记指定bean属性的目标beanQ通过该标{֏以引用同一容器或父容器内的MbeanQ无论是否在同一XML文g中)?br />XML‘bean’元素的值即可以是指定的bean的idg可以是其name倹{?/p> <p>形式二:<ref local="someBean"><br />使用ref的local属性指定目标beanQ它可以利用XML解析器来难所引用的bean是否存在同一文g中。local属性值必L目标bean的id属性倹{?/p> <p>形式三:<bean parent="someBean"><br />通过使用ref的parent属性来引用当前H口的父容器中的bean。parent属性值即可以是目标bean的id|也可以是name属性倹{?/p> <p> <font color="#0000ff" size="4"> <strong>4、内?bean:</strong> </font> </p> <p>所谓内部bean(inner bean)是指在一个bean?lt;property/>?lt;constructor-arg/>中?lt;bean/>元素定义的bean.内部bean不需要有id或name属性,即有也会被H口忽略.<br />内部beanL匿名的且它们Lprototype模式?同时内部bean注入到包含该内部bean之外的bean是不可能?<br /><bean id="outer" class="..."><br /> <property name="target"><br />  <bean class="com.mycoompany.Person"><br />   <property name="name" value="Fiona Apple"/><br />   <property name="age" value="25"/><br />  </bean><br /> </property><br /></bean></p> <p> <font color="#0000ff" size="4"> <strong>5、集合合qӞ</strong> </font> </p> <p>从Spring2.0开始,Spring IoC容器支持集合的合ƈ。父子集合元素合q后的值就是子集合中的最l结果,而且子集合中的元素值将覆盖爉合中的对应的倹{?br /><beans><br /><bean id="parent" abstract="true" class="example.ComplexObject"><br /> <property name="adminEmails"><br />  <props><br />   <prop key="administrator">administrator@somecompany.com</prop><br />   <prop key="support">support@somecompany.com</prop><br />  </props><br /> </property><br /></bean><br /><bean id="child" parent="parent"><br /> <property name="adminEmails"><br />  <props merge="trur"><br />   <prop key="sales">sales@somecompany.com</prop><br />   <prop key="support">support@somecompany.co.uk</prop><br />  </props><br /> </property><br /></bean><br /></beans></p> <p>合ƈ后内容:</p> <p> <a href="mailto:administrator=administrator@somecompany.com">administrator=administrator@somecompany.com</a> <br /> <a href="mailto:sales=sales@somecompany.com">sales=sales@somecompany.com</a> <br /> <a href="mailto:support=support@somecompany.co.uk">support=support@somecompany.co.uk</a> </p> <p>list集合有排序功能,父bean的列表内容将排在子bean列表内容的前面;<br />merge属性必dl承的子bean中定义?/p> <p> <font color="#0000ff" size="4"> <strong>6、Nulls</strong> </font> </p> <p><null/>用于处理null倹{Spring会把属性的I参数当作空字符串处理?/p> <p><bean class="ExampleBean"><br /> <property name="email"><br />  <value></value><br /> </property><br /></bean></p> <p>{同?/p> <p>excapleBean.setEamil("");</p> <p>而null值则可以使用<null/>元素来表C:</p> <p><bean class="ExampleBean"><br /> <property name="email"><null/></property><br /></bean></p> <p> <br /> <font color="#0000ff" size="4"> <strong>7、简写:</strong> </font> </p> <p>针对常见的value值或bean的引用,Spring提供了简化格式用于替?lt;value/>?lt;ref/>元素?br /><property/>?lt;constructor-arg/>?lt;entry/>元素都支持value属性,它可以用来替代内嵌的<value/>元素?/p> <p><property name="myProperty">                            <br /> <value>hello</value>           =====            <property name="myProperty" value="helo" /><br /></property></p> <p><constructor-arg><br /> <value>hello</value>           =====            <constructor-arg value="hello" /><br /></construtctor-arg></p> <p><entry key="myKey"><br /> <value>hello</value>           =====            <entry key="myKey" value="hello" /><br /></entry></p> <p> <br /><property/>?lt;constructor-arg/>支持cM的简写属性refQ它可以替找整个内嵌?lt;/ref>元素?/p> <p><property name="myProperty"><br /> <ref bean="myBean">            =====            <property name="myProperty" ref="myBean" /><br /></property></p> <p><constructor-arg><br /> <ref bean="myBean">            =====            <constructor-arg ref="myBean" /><br /></constructor-arg></p> <p>切记Q尽存在等同于<ref bean="xxx" >元素的简写Ş式,但ƈ没有<ref local="xxx">的简写Ş式?/p> <p>map中的entry元素的简写Ş式ؓkey/key-ref和value/value-ref属性?/p> <p><entry><br /> <key><br />  <ref bean="myKeyBean" />            =====          <entry key-ref="myKeyBean" value-ref="myValueBean" /><br /> </key><br /> <ref bean="myValueBean" /><br /></entry></p> <p> <font color="#0000ff" size="4"> <strong>8、组合属性名U?/strong> </font> </p> <p>当设|bean的组合属性时Q除了最后一下属性外Q只要其他属性g为nullQ组合或嵌套属性名是完全合法的?/p> <p><bean id="foo" class="foo.Bar"><br /> <property name="fred.bob.sammy" value="123" /><br /></bean><br /><br /><font color="#0000ff" size="4"><strong>9、depends-on属性:</strong></font></p> <p>depends-on属性可以用于当前bean初始化之前显式的强制一个或多个bean被初始化?/p> <p><bean id="beanOne" class="ExampleBean" depends-on="manager"><br /> <property name="manager" ref="manager" /><br /></bean><br /><bean id="manager" class="ManagerBean" /></p> <p>若需要表辑֯多个bean的依赖,可民认在<depends-on />中将指定的多个bean名字用分隔符q行分隔Q分隔符可以是逗号、空格及分号{?/p> <p><bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao"><br /> <property name="manager" ref="manager" /><br /></bean><br /><bean id="manager" class="ManagerBean" /><br /><bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" /></p> <p> <font color="#0000ff" size="4"> <strong>10、gq初始化bean--lazy-init 属性:</strong> </font> </p> <p><bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true"><br /> <!-- various properties here... --><br /></bean><br /><bean name="noo.lazy" class="com.foo.AnotherBean"><br /> <!-- various properties here... --><br /></bean></p> <p>如果一个bean被设|ؓ延迟初始化,而另一个非延迟初始化的singleton bean依赖于它Q那么当ApplicationContext提前实例化singleton beanӞ它必M保所有上qsingleton依赖bean也被预先初始化,当然也包括设|ؓ延迟实例化的bean.</p> <p>在容器层ơ中通过?lt;beans />元素上用‘default-lazy-init’属性来控制延迟初始化也是可能的?br /><beans default-lazy-init="true"><br /> <!-- no beans will be eagerly pre-instantiated... --><br /></beans></p> <p> <font color="#0000ff" size="4"> <strong>11、autowire<自动装配> 属性:</strong> </font> </p> <p>模式     说明</p> <p>no      不用自动装配,必须通过ref元素指定依赖Q这是默认设|?/p> <p>byName     Ҏ(gu)属性名自动装配。Spring检查容器ƈҎ(gu)名字查找与属性完全一致的beanQƈ其与属性自动装配?/p> <p>byType     如果容器中存在一个与指定属性类型相同的beanQ那么将与该属性自动装配。如果存在多个,则抛出异常?/p> <p>constructor    与byType的方式类|不同之处在于它应用于构造器参数。如果在容器中未扑ֈ与构造器参数cd一致的beanQ那么将抛出异常?/p> <p>autodetect    通过beancȝ自省机制(introspection)来决定是使用constructorq是byType方式q行自动装配。如果发现默认的构造器Q那么将使用byType方式?/p> <p> <br />--通过讄<bean />元素的autowire-candidate="false"Q可以针对单个bean讄其是否ؓ被自动装配对象?/p> <p> <font color="#0000ff" size="4"> <strong>12、dependency-check <依赖?gt; 属性:</strong> </font> </p> <p>此属性用于检查bean定义中实际属性值的讄?/p> <p>模式     说明</p> <p>none     没有依赖查,如果bean的属性没有值的话可以不用设|?/p> <p>simple     对于原始cd及集?除协作者外的一切东?执行依赖查?/p> <p>object     仅对协作者执行依赖检查员?/p> <p>all      对协作者,原始cd及集合执行依赖检查?/p> <img src ="http://www.aygfsteel.com/wyz191/aggbug/94925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/wyz191/" target="_blank">java_蝈蝈</a> 2007-01-19 14:08 <a href="http://www.aygfsteel.com/wyz191/articles/spring_1.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">۳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̶</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʲ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank">޻</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">⳵</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩˳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ʲ</a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӣ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">ʩ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">߮</a>| <a href="http://" target="_blank">°Ͷ</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>