??xml version="1.0" encoding="utf-8" standalone="yes"?>
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服务.
1、value元素
<value/>元素通过字符串来指定属性或构造器参数的倹{?/p>
<bean id="myDataSource" detroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</proerpty>
<property name="url">
<value>jdbc:mysql://localhost:3306/mydb</value>
</property>
<property name="username">
<vlaue>root</value>
</property>
</bean>
2、idref元素
idref元素用来容器内其它bean的id传给<constructor-arg/>?lt;property/>元素Q同时提供错误难功能?/p>
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<idref bean="theTargetBean" />
</property>
</bean>
{同?
<bean id="theTargetBean" class="..." />
<bean id="theClientBean" class="...">
<property name="targetName">
<value>theTargetBean</value>
</property>
</bean>
使用idref标记允许容器在部|时验证所被引用的bean是否存在。此外,如果被引用的bean在同一XML文g内,且bean名字是bean id,那么可以使用local属性?br />此属性允许XML解析器在解析XML文g时来对引用的beanq行验证?/p>
<property name="targetName">
<idref local="theTargetBean" />
</property>
3、ref元素
形式一Q?lt;ref bean="someBean">
q是最常见的Ş式是通过使用ref标记指定bean属性的目标beanQ通过该标{֏以引用同一容器或父容器内的MbeanQ无论是否在同一XML文g中)?br />XML‘bean’元素的值即可以是指定的bean的idg可以是其name倹{?/p>
形式二:<ref local="someBean">
使用ref的local属性指定目标beanQ它可以利用XML解析器来难所引用的bean是否存在同一文g中。local属性值必L目标bean的id属性倹{?/p>
形式三:<bean parent="someBean">
通过使用ref的parent属性来引用当前H口的父容器中的bean。parent属性值即可以是目标bean的id|也可以是name属性倹{?/p>
4、内?bean:
所谓内部bean(inner bean)是指在一个bean?lt;property/>?lt;constructor-arg/>中?lt;bean/>元素定义的bean.内部bean不需要有id或name属性,即有也会被H口忽略.
内部beanL匿名的且它们Lprototype模式?同时内部bean注入到包含该内部bean之外的bean是不可能?
<bean id="outer" class="...">
<property name="target">
<bean class="com.mycoompany.Person">
<property name="name" value="Fiona Apple"/>
<property name="age" value="25"/>
</bean>
</property>
</bean>
5、集合合qӞ
从Spring2.0开始,Spring IoC容器支持集合的合ƈ。父子集合元素合q后的值就是子集合中的最l结果,而且子集合中的元素值将覆盖爉合中的对应的倹{?br /><beans>
<bean id="parent" abstract="true" class="example.ComplexObject">
<property name="adminEmails">
<props>
<prop key="administrator">administrator@somecompany.com</prop>
<prop key="support">support@somecompany.com</prop>
</props>
</property>
</bean>
<bean id="child" parent="parent">
<property name="adminEmails">
<props merge="trur">
<prop key="sales">sales@somecompany.com</prop>
<prop key="support">support@somecompany.co.uk</prop>
</props>
</property>
</bean>
</beans>
合ƈ后内容:
administrator=administrator@somecompany.com
sales=sales@somecompany.com
support=support@somecompany.co.uk
list集合有排序功能,父bean的列表内容将排在子bean列表内容的前面;
merge属性必dl承的子bean中定义?/p>
6、Nulls
<null/>用于处理null倹{Spring会把属性的I参数当作空字符串处理?/p>
<bean class="ExampleBean">
<property name="email">
<value></value>
</property>
</bean>
{同?/p>
excapleBean.setEamil("");
而null值则可以使用<null/>元素来表C:
<bean class="ExampleBean">
<property name="email"><null/></property>
</bean>
7、简写:
针对常见的value值或bean的引用,Spring提供了简化格式用于替?lt;value/>?lt;ref/>元素?br /><property/>?lt;constructor-arg/>?lt;entry/>元素都支持value属性,它可以用来替代内嵌的<value/>元素?/p>
<property name="myProperty">
<value>hello</value> ===== <property name="myProperty" value="helo" />
</property>
<constructor-arg>
<value>hello</value> ===== <constructor-arg value="hello" />
</construtctor-arg>
<entry key="myKey">
<value>hello</value> ===== <entry key="myKey" value="hello" />
</entry>
<property/>?lt;constructor-arg/>支持cM的简写属性refQ它可以替找整个内嵌?lt;/ref>元素?/p>
<property name="myProperty">
<ref bean="myBean"> ===== <property name="myProperty" ref="myBean" />
</property>
<constructor-arg>
<ref bean="myBean"> ===== <constructor-arg ref="myBean" />
</constructor-arg>
切记Q尽存在等同于<ref bean="xxx" >元素的简写Ş式,但ƈ没有<ref local="xxx">的简写Ş式?/p>
map中的entry元素的简写Ş式ؓkey/key-ref和value/value-ref属性?/p>
<entry>
<key>
<ref bean="myKeyBean" /> ===== <entry key-ref="myKeyBean" value-ref="myValueBean" />
</key>
<ref bean="myValueBean" />
</entry>
8、组合属性名U?/strong>
当设|bean的组合属性时Q除了最后一下属性外Q只要其他属性g为nullQ组合或嵌套属性名是完全合法的?/p>
<bean id="foo" class="foo.Bar">
<property name="fred.bob.sammy" value="123" />
</bean>
9、depends-on属性:
depends-on属性可以用于当前bean初始化之前显式的强制一个或多个bean被初始化?/p>
<bean id="beanOne" class="ExampleBean" depends-on="manager">
<property name="manager" ref="manager" />
</bean>
<bean id="manager" class="ManagerBean" />
若需要表辑֯多个bean的依赖,可民认在<depends-on />中将指定的多个bean名字用分隔符q行分隔Q分隔符可以是逗号、空格及分号{?/p>
<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
<property name="manager" ref="manager" />
</bean>
<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />
10、gq初始化bean--lazy-init 属性:
<bean id="lazy" class="com.foo.ExpensiveToCreateBean" lazy-init="true">
<!-- various properties here... -->
</bean>
<bean name="noo.lazy" class="com.foo.AnotherBean">
<!-- various properties here... -->
</bean>
如果一个bean被设|ؓ延迟初始化,而另一个非延迟初始化的singleton bean依赖于它Q那么当ApplicationContext提前实例化singleton beanӞ它必M保所有上qsingleton依赖bean也被预先初始化,当然也包括设|ؓ延迟实例化的bean.
在容器层ơ中通过?lt;beans />元素上用‘default-lazy-init’属性来控制延迟初始化也是可能的?br /><beans default-lazy-init="true">
<!-- no beans will be eagerly pre-instantiated... -->
</beans>
11、autowire<自动装配> 属性:
模式 说明
no 不用自动装配,必须通过ref元素指定依赖Q这是默认设|?/p>
byName Ҏ(gu)属性名自动装配。Spring检查容器ƈҎ(gu)名字查找与属性完全一致的beanQƈ其与属性自动装配?/p>
byType 如果容器中存在一个与指定属性类型相同的beanQ那么将与该属性自动装配。如果存在多个,则抛出异常?/p>
constructor 与byType的方式类|不同之处在于它应用于构造器参数。如果在容器中未扑ֈ与构造器参数cd一致的beanQ那么将抛出异常?/p>
autodetect 通过beancȝ自省机制(introspection)来决定是使用constructorq是byType方式q行自动装配。如果发现默认的构造器Q那么将使用byType方式?/p>
--通过讄<bean />元素的autowire-candidate="false"Q可以针对单个bean讄其是否ؓ被自动装配对象?/p>
12、dependency-check <依赖?gt; 属性:
此属性用于检查bean定义中实际属性值的讄?/p>
模式 说明
none 没有依赖查,如果bean的属性没有值的话可以不用设|?/p>
simple 对于原始cd及集?除协作者外的一切东?执行依赖查?/p>
object 仅对协作者执行依赖检查员?/p>
all 对协作者,原始cd及集合执行依赖检查?/p>