借助delphixe提供的优秀的语言特性,实现java spring框架中ioc及aop。整个框架的配置和用法在兼顾Delphi语法的前提下,尽量和java spring保持一致。
SpringXE是使用Delphi完全模拟Java的Spring框架的项目,由于预计需要使用Delphi的反射机制实例化对象、拦截虚方法进行AOP,目前项目只支持XE2以上版本,对低版本支持后续实现。
1.配置文件中scope取值prototype(多例)或singleton(单例),
在ApplicationContext?类构造的时候,加载XML后,构造出singleton类型的bean。单例中引用的多例bean也是单例;多例中引用的单例bean还是单例。bean节点增加lifecycle属性,设置为interface表示使用接口引用计数管理生命周期,框架不释放单例的bean对象。 a)scope b)属性类型支持integer int64 float double boolean c)单例的lazy-init d)枚举类型属性赋值 e)集合(set)类型属性赋值 f)基本类型数组 对象数组使用map list注入 2.配置文件bean节点增加init-method属性,并提供代码实现,在创建类实例时调用
<bean id="class1" class="Unit2.TClass1" scope="singleton" lazy-init="false" init-method="Init"> 约定:指定的init-method方法名称任意,无参数,无返回值。创建实例进行调用 3.配置文件中bean节点增加contructor节点,设置类构造函数参数
<bean id="class1" class="Unit2.TClass1" scope="singleton" lazy-init="false" init-method="Init"> <contructor-arg index="0" value="a"> </ <contructor> <contructor-arg index="1" value="b"> </ <contructor> ...... <contructor-arg index="n" ref="bean-name"> </ <contructor> Unknown end tag for </bean>
4.配置文件的property节点,增加map、list子节点,提供给集合属性赋值功能
<property name="lists"> <list> <value> 第一个list </value> <value> 第二个list </value> <value> 第三个list </value> </list> </property> <property name="maps"> <map> <entry key="key1" value="value1"> </entry> <entry key="key2" value="value2"> </entry> <entry key="key3" value="value3"> </entry> </map> </property> 5 aop实现和配置
约定:在代码中定义拦截器,这是一个普通的class,其中定义TVirtualMethodInterceptor成员,并实现拦截逻辑
在配置中,定义拦截器bean,这是一个普通的bean。 在目标bean中加入 <interceptor> 节点,创建实例时,如果有interceptor节点,则执行拦截器逻辑 <bean id="myinterceptor" class="Unit2.TMyInterceptor" scope="singleton" lazy-init="false"> </bean> <bean id="myclass" class="Unit2.TTestClass" scope="prototype"> <interceptor> myinterceptor </interceptor> </bean> 6 library配置实现 约定:如果需要带包发布产品,则可以在配置文件中设置要加载的bpl包,框架负责运行时加载bpl,这样bpl中的类也可以使用rtti进行加载。
修改配置文件格式:添加 <spring> 根节点,其下有 <beans> 和 <librarys> 子节点 <?xml version="1.0" encoding="UTF-8"?> <spring> <packages> <package> xxx.bpl <package> Unknown end tag for </packages>
<beans> <bean id="class1" class="Unit2.TClass1" scope="singleton" lazy-init="false"> <property name="F1" value="hello world"> </property> </bean> <bean id="class2" class="Unit2.TClass2" scope="singleton" lazy-init="false"> <property name="FClass1" ref="class1"> </property> </bean> <bean id="intf1" class="Plugin.TPluginClass" scope="singleton" lazy-init="false"> <property> </property> </bean> </beans>
svn地址: https://code.google.com/p/spring-for-delphi-xe/ |