AOP(Apsect Oriented Programming)概念的正式出现也有一些时日了,但是它在程序构造过程中似乎仍未找到合适的切入点,一般系统的设计实现很少将AOP作为必要的技术元素。AOP作为一种普适的技术思想,它所代表的是程序结构空间中的定位和组装技术。http://canonical.iteye.com/blog/34941
AOP使我们可以通过非侵入性的方式动态修改“任意”已经构建好的程序,而不需要事前有大量的设计准备。原则上说,这种技术思想是可以在任何程序语言基础上进行表达的,并不是只有java, C#这样的面向对象语言才允许AOP操作. Witrix平台中所应用的部分技术与AOP有些类似,只是大量的结构调整表现为xml生成和xml变换,在具体的使用方式上也有一些微妙的差异。http://canonical.iteye.com/blog/126467
相对于通用程序语言,xml语言其实是AOP技术的一个更加合适的形式载体。
1. xml格式特殊的规范性确保了在最细的逻辑粒度上,程序结构也是可识别的,可操纵的(在这一点上非常类似于函数式语言)。而所有的命令式语言(imperative language)中,函数内部的结构都是很难采用统一方式进行描述和定位的。
<ns1:loop>
<rpt:Row/>
</ns1:loop>
2. xml节点的坐标可以采用xpath或者css选择符等通用方式进行描述,而一般程序结构无法达到xml格式这样的均一性,其中的坐标定位方式要复杂得多。
3. xml节点上可以增加任意属性,不同的属性可以属于不同的命名空间(namespace),这些属性可以辅助AOP的定位机制。而一般程序语言中如果没有Annotation机制, 则定位只能依赖于函数名和类名(函数参数只有类型没有名称),而类名和函数名随时可能因为业务变化而调整(不是专为定位而存在), 由此构建的切点描述符是不稳定的。
<ui:PageTable pager="${pager}" cache:timeout="1000" />
4. xml节点的增删改查显然要比字节码生成技术要简单和直观得多。
AOP技术难以找到应用的一个重要原因在于很多人机械式的将它定位为一种横切技术,认为它的价值完全在于某个确定的切面可以插入到多个不同的切点,实现系统的横向分解。而在实际应用中,业务层面上很少具有可抽象的固定的共同性,我们所迫切需要的一般是对已有程序结构进行动态扩展的一种能力。横切是AOP的一种特殊的应用,但不是它的全部。相对于继承(inheritance)等依赖于概念诠释的结构扩展机制,AOP所代表正是对程序结构空间进行任意操纵的一种能力。AOP可以为基础结构增加功能,改变原有功能实现,也可以取消原有功能实现,它不需要把所有的扩展逻辑按照树形结构进行组织,不要求在基础结构中为扩展编写特殊的代码。这种自由的结构扩展能力在Witrix平台中被发展为“实现业务代码与平台基础架构之间的动态融合”。
在Witrix平台的实际应用中,AOP的切点匹配能力并不是十分重要。一般情况下我们主要通过整体结构规划来确保控制点意义明确且相对集中,因此不需要额外通过切点匹配进行业务功能的再组织,不需要再次从杂乱的程序逻辑中重新发现特殊的控制点。例如在Witrix平台的Jsplet框架中所有后台事件响应都通过objectName和objectEvent参数触发,在触发后台事件响应函数之前都会调用bizflow文件中的beforeAction段。
在bizflow文件中,aop操作是明确指定到具体函数的,使用模糊匹配在一般情况下只会使问题变得不必要的复杂化。例如扩展actQuery函数
<action id="aop-Query-default">
<source>
通过自定义标签抽象出多个Action之间的共用代码
<app:DoWorkA/>
</source>
</action>
在Witrix平台中结构组装主要是通过自定义标签库和extends算子来实现,它们都依赖于xml格式的规范性。
1. 通过在custom目录下实现同名的自定义标签,即可覆盖Witrix平台所提供的缺省标签实现,这里所依赖的并不是复杂的匹配过程,而是自然直观的映射过程。http://canonical.iteye.com/blog/196826
2. 所有的xml配置文件支持extends操作,它允许定制两个具有业务含义的xml节点之间的结构融合规则。例如
<biz-flow extends="docflow">
实际使用中, AOP技术的一个应用难点在于状态空间的管理问题。一般interceptor中所能访问的变量局限为this指针所携带的成员变量,以及函数调用时传入的调用参数。interceptor很难在状态空间中创建新的变量,也很难读取在其他地方所产生的状态变量。例如对于如下扩展 A(arg1); B(arg2); C(arg3); =〉 Ax(arg1); B(arg2); Cx(arg3); 因为原有的调用序列中没有传递额外的参数,因此A和C的扩展函数之间很难实现共享内部变量x。在TPL模板语言中,tpl本身是无状态的,状态变量通过外部的$thisContext对象统一管理。通过这种行为与状态的分离,结合灵活的变量作用域控制机制,可以以比较简单的方式实现扩展函数之间的信息共享。
分享到:
相关推荐
2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 2.5.2. ...
- **Easier AOP XML Configuration**:同样地,AOP的XML配置也变得更加简单明了。 - **Support for @AspectJ Aspects**:增加了对@AspectJ注解的支持,这为编写更灵活的AOP切面提供了便利。 ##### 2.3 中间层改进 ...
- **Easier AOP XML配置**: 改进了AOP的XML配置方式,使得配置更简单直观。 - **Support for @AspectJ aspects**: 直接支持AspectJ注解,方便开发者编写切面逻辑。 **2.4 中间层增强** - **Easier configuration ...
Use the factory-method attribute on the <bean> tag C. Use the init-method attribute on the <bean> tag D. Use autowiring Correct Answer: B 解释:在 Spring 框架中,可以使用 factory-method 属性在 XML ...
2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 ...
2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.3.3. 对bean命名pointcut( bean name pointcut element)的支持 2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 ...
2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.4. 中间层 2.4.1. 在XML里更为简单的声明性事务配置 2.4.2. JPA 2.4.3. 异步的JMS 2.4.4. JDBC 2.5. Web层 2.5.1. Spring MVC的表单标签库 ...
2.3.1. 更加简单的AOP XML配置 2.3.2. 对@AspectJ 切面的支持 2.3.3. 对bean命名pointcut( bean name pointcut element)的支持 2.3.4. 对AspectJ装载时织入(AspectJ load-time weaving)的支持 2.4. 中间层 ...
<load-on-startup>1</load-on-startup> <servlet-name>dispatcher <url-pattern>/ ``` 然后,在WEB-INF/spring/appServlet目录下创建servlet-context.xml,这是Spring MVC的配置文件。在这里,你可以定义...
`<load-on-startup>1</load-on-startup>`表明该Servlet在Web应用启动时会自动加载。 - `<servlet-mapping>`部分将`.jsf`扩展名映射到`FacesServlet`,这意味着所有以.jsf结尾的URL都会由这个Servlet处理。 - `...
S2Struts的目标是在保持Struts的易用性和熟悉度的同时,引入Seasar2带来的高级特性,如依赖注入(DI)和面向切面编程(AOP)。 ### S2Struts与Struts的连动 S2Struts允许开发者在不改变现有Struts Action类的前提下,...
< load-on-startup > 1 </ load-on-startup > < servlet-name > springmvc < url-pattern > / ``` 接着,我们需要在`springmvc-servlet.xml`中定义SpringMVC的核心配置,包括视图解析器、拦截器、处理器...
9.5.1. Using Spring Security’s JSP tag library 9.5.2. Working with Thymeleaf’s Spring Security dialect 9.6. Summary 3. Spring in the back end Chapter 10. Hitting the database with Spring and JDBC ...
本项目“毕业设计,采用JavaWeb技术编写”是一个典型的在线票务系统,名为"Cinema-online-ticketing-system-master",它展示了如何利用JavaWeb进行实际的项目开发。 1. **JavaWeb基础** - **Servlet**:JavaWeb的...
7. **JSP标签库**:如JSTL(JavaServer Pages Standard Tag Library)提供了一组标签,简化了常见的任务,如迭代、条件判断、XML处理等。 8. **EL(Expression Language)**:与JSP表达式一起使用,提供了一种简洁...
- 在"Online-Q-A-Forum-master"目录下,通常会有以下几个主要部分:src(源代码)、webapp(Web应用资源)、lib(第三方库)、README.md(项目说明)、pom.xml(Maven项目配置文件)等。 - `src`目录包含Java源...
3. **JSP标签库**:JSP提供了自定义标签库(Tag Libraries),例如JSTL(JavaServer Pages Standard Tag Library)和Struts Tags,使得开发者可以使用简洁的标签来替代复杂的Java代码,提高可读性和可维护性。...