`
42087743
  • 浏览: 237095 次
  • 性别: Icon_minigender_1
  • 来自: 合肥&上海
社区版块
存档分类
最新评论

整了2天的aop-spring2

    博客分类:
  • SSH
阅读更多
项目的日志部分由我负责,哎,本来以为spring2的aop能有多难,spring1的会了,2的肯定也手到擒来,没想到,就这个整整花了我2天的时间才摆平,都崩溃了.
下面简单地写下代码和配置:
@Transactional          //spring事务的支持
@Aspect                 //声明切面
public class LogService {
	private ApamLogDAO apamLogDAO;    //依赖注入dao,为节省版面就省略get,set了
	private ApamLog apamLog;          //声明日志的model类
	private Asppoi asppoi;            
	private Account account;

	// insert切入点
	// 这里的execution表达式是最复杂的部分,其实不难,主要是没有什么文档能把描述得很详细,连spring2的官方文档也只是概括地点了下	
	@Pointcut("execution(* com.olemap.apam.dao.AsppoiDAO.save(..))")
	public void PointcutSave() {
	}

	// insert通告
	@AfterReturning(pointcut = "PointcutSave()", returning = "status")
	public void AdviceSave(ProceedingJoinPoint joinPoint, Object status) {
		asppoi = (Asppoi) joinPoint.getArgs()[0];
		account = (Account) joinPoint.getArgs()[1];
		apamLog = new ApamLog();
		apamLog.setAccount(account);
		apamLog.setAction("insert");
		apamLog.setAsppoi(asppoi);
		apamLog.setStatus(Byte.parseByte(status.toString()));
		apamLog.setTime(new Date());
		apamLogDAO.save(apamLog);
	}
}

另外在spring的配置文件里,需要加上
<aop:aspectj-autoproxy proxy-target-class="true"/>


下面慢慢来解释:
一.spring2支持的增强类型:
before  after  afterReturning  afterThrowing  around

光名字就很好理解了,主要就是after,afterReturning的区别,在我这个模块上,我用了afterReturning,它可以让你的增强(advise)可以获得切入点的返回值.

二.签名语法:
call/execution/withincode(MethodPart)-方法调用/方法执行/在方法体内,MethodPart代表方法签名,execution较常用  (call我用了,但是始终报错,还没能试出它的用法)
MethodPart的语法结构是
[Modifier] Type [ClassType.] methodName(ArgumentType1...N...) [throws ExceptionType]
public void com.olemap.apam.dao.TestDAO.save(..) throws Exception

上面的语法是对应的,需要注意的是
1.加中括号的就是可选的部分
2.'..'是指所有的参数类型
3.可以用*来代表泛指

三.获得原方法形参的方法ProceedingJoinPoint
org.aspectj.lang.ProceedingJoinPoint表示连接点对象,通过getArgs()可以获得个连接点方法参数的数组

四.获得切入点方法返回值
在afterReturning那设置returning属性,并加在增强方法的形参处

除了注解实现外,另外还有xml文件配置,aspect语言2种方法实现,我会进一步去研究的.

以上是我这2天的成果,一次又一次的错误磨出来的,假如有什么错误或者有什么更好的方法,希望您指点下我.
分享到:
评论
11 楼 chengct521 2008-09-23  
demo在网上一找就是一大堆
10 楼 grave 2008-08-20  
用JdbcAppender就能存数据库了
9 楼 zbmartin 2008-08-20  
@Aspect,spring的 切面一般是写入xml好,还是用annotation写在页面好
8 楼 dakulaliu 2008-08-07  
lkjust08 写道
能给小弟一个简单的例子么?

大体思路如下:通过Annotation的方式标明某些方法需要AOP操作。
1.写一个自定义的Annotation:
package com.jacky.menu.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface BusinessLogger {
   String value() default "Operation";
}


2.写你的AOP处理类:
第一种方式,使用Spring Framework提供的AfterReturningAdvice接口
package com.jacky.menu.aop;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

import com.jacky.menu.annotation.BusinessLogger;

public class BusinessAdvisor implements AfterReturningAdvice {

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.springframework.aop.AfterReturningAdvice#afterReturning(java.lang.Object,
	 *      java.lang.reflect.Method, java.lang.Object[], java.lang.Object)
	 */
	public void afterReturning(Object returnValue, Method method,
			Object[] args, Object target) throws Throwable {
		Method implMethod = target.getClass().getMethod(method.getName(),
				method.getParameterTypes());
		BusinessLogger annoLogger = implMethod
				.getAnnotation(BusinessLogger.class);
		String operation = annoLogger != null ? annoLogger.value() : "null";
		StringBuilder tmp = new StringBuilder();
		tmp.append(operation).append(":").append(target.getClass().getName())
				.append(".").append(method.getName());
		System.out.println(tmp.toString());
	}

}

第二种方式,使用AspectJ来实现Advisor:
package com.jacky.menu.aop;

import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;


@Aspect
public class AspectJTest {
	
	@AfterReturning("@annotation (com.jacky.menu.annotation.BusinessLogger)")
	public void afterReturning(){
		System.out.println("Aop invoked!!!");
	}
}


3.需要调用AOP处理的业务逻辑方法
	@BusinessLogger("Generate Tree Root")
	public Menu generateMenuTreeRoot() {
		return menuDao.getRootMenu();
	}


4.applicationContext.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
			http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
			
	<!-- 组件查找策略 -->
	<context:component-scan base-package="com.jacky.menu.bus" />
	
	<!-- 启用注解,Spring Annotation需使用 -->
	<context:annotation-config/>
	
	<!-- 使用Spring AOP方式实现AOP -->
	<aop:config proxy-target-class="true">
		<!-- 切入点定义为所有带有@BusinessLogger注解的业务逻辑方法 -->
		<aop:pointcut id="alterPoint"
				expression="@annotation(com.jacky.menu.annotation.BusinessLogger)"/>
		
		<!-- After Returning通知 -->
		<aop:advisor advice-ref="businessAdvisor" id="afterBusAdvisor" pointcut-ref="alterPoint"/>
	</aop:config>
	
	<!-- AOP Advisor 实现类 -->
	<bean id="businessAdvisor" class="com.jacky.menu.aop.BusinessAdvisor"></bean>
	
	<!-- 使用AspectJ方式 -->
	<aop:aspectj-autoproxy proxy-target-class="true"/>
	
	<!-- advisor using aspectJ -->
	<bean class="com.jacky.menu.aop.AspectJTest" />
</beans>


5.输出结果:
对于第一种Advisor实现方式:
Generate Tree Root:com.jacky.menu.bus.impl.MenuManagerImpl.generateMenuTreeRoot
对于第二种Advisor实现方式:
Aop invoked!!!
7 楼 lkjust08 2008-07-31  
能给小弟一个简单的例子么?
6 楼 glamey 2008-07-21  
他的demo很明显,就是自己或者公司以前写的一些小东西。主要的配置文件和一些关键的代码。
5 楼 42087743 2008-07-17  
因为项目经理需要把部分操作储存到数据库中,这样容易查看点,我也是奉命行事啊,哈哈!当然项目中也使用了common-logging.
4 楼 igogo007 2008-07-17  
为什么不直接使用
org.apache.commons.logging.Log;
org.apache.commons.logging.LogFactory;

我比较懒,没什么要求,就用这两个。
3 楼 42087743 2008-07-17  
有个demo当然不错,不过过于简单的demo网上到处都是,没有什么实用价值,不知道1楼的朋友,你的是什么demo,能不能贴出来看看.
很简单的demo,签名语法肯定不全,这还是需要在实践中来摸索的
2 楼 jxd1976 2008-07-16  
d8111 写道
AOP主要是概念一大堆,实际哪个小例子一看就会。

我现在就是随手带着demo,没有demo我还是要配很久

to d8111
  你所指的demo是什么样的,可否共享一下。
1 楼 d8111 2008-07-16  
AOP主要是概念一大堆,实际哪个小例子一看就会。

我现在就是随手带着demo,没有demo我还是要配很久

相关推荐

    spring aop 实现源代码--xml and annotation(带lib包)

    http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt; 6. 7. &lt;bean id="messageSenderImpl" class="com.savage.aop.HttpMessageSender"&gt;&lt;/bean&gt; 8. 9. ...

    struts2.3.7-spring3.1.0-hibernate4.0.0 整合源码

    3. **配置Spring**:创建spring-context.xml,定义bean的实例化、依赖注入和事务管理。 4. **配置Hibernate**:配置hibernate.cfg.xml,设置数据库连接、实体映射和事务策略。 5. **实体类和DAO**:编写实体类,基于...

    liferay-spring-portlet

    【标题】"liferay-spring-portlet"是一个基于Spring框架构建的portlet应用,适用于Liferay门户平台。这个项目展示了如何将Spring与Liferay Portal结合,创建一个可直接部署到Liferay中的WAR包。作者提到他们已经花费...

    day38 02-Spring快速入门

    "day01"暗示这是一个多天的系列教程,第一天可能涵盖安装环境、创建第一个Spring项目、理解和使用Bean定义、以及基本的依赖注入实践。 综上所述,这个“Spring快速入门”教程可能包括以下内容: 1. Spring框架简介...

    day38 19-Spring整合web开发

    Spring是一个开源的Java企业级应用框架,它提供了丰富的功能,包括依赖注入(DI)、面向切面编程(AOP)以及用于构建Web应用程序的MVC(Model-View-Controller)框架。这个主题通常涵盖如何将Spring的核心特性应用于...

    aop开发环境jar包

    2. **AspectJ**:一个独立的AOP框架,提供编译时和运行时的AOP支持。AspectJ的编译器ajc可以将切面编织到字节码中,提供更细粒度的控制和更高的性能。 3. **Aspect Oriented Maven (AOM)**:Maven插件,帮助在Maven...

    Spring 2.0 AOP 完整例子

    网上找了很多例子多数都不能运行。包括after,before,round,throw切入,可对类直接拦截,不需要定义接口文件,自己研究了2天整理出来的。 Spring AOP 的完整例子,可直接运行。带jar包。

    spring_day06_spring_

    标题中的"spring_day06_spring_"表明这是关于Spring框架的第六天学习内容,而描述中的"heima source code day 06"暗示我们将探讨的是有关Heima(可能是一个项目或公司的名称)的源代码,这与Spring框架的集成或者在...

    Spring第02天1

    2. **Spring AOP实现原理** - Spring AOP使用Java动态代理或CGLIB字节码增强实现代理机制。 - 当目标类实现了接口时,Spring使用JDK的Proxy类生成动态代理对象。 - 对于没有接口的类,Spring使用CGLIB库生成目标...

    spring-struts2-hibernate-maven.zip

    【标题】"Spring-Struts2-Hibernate-Maven整合教程" 在Java Web开发领域,Spring、Struts2、Hibernate这三大框架的组合,通常被称为SSH(Spring-Struts2-Hibernate),是构建企业级应用的常见选择。Maven作为项目...

    spring_day03_aop.zip_Who_spring

    在"spring_day03_aop"这个压缩文件名中,我们可以推测这是一个学习资料或教程的一部分,涵盖了Spring框架第三天的学习内容,主要集中在AOP上。通常,AOP课程会涉及以下关键知识点: 1. **AOP概念**:面向切面编程是...

    spring教学视频第四天

    在Spring教学视频第四天的内容中,我们将会深入探讨Spring框架的核心特性与实际应用。Spring作为Java企业级开发的主流框架,其灵活性、可扩展性和模块化设计使得它在现代软件开发中占据了重要的地位。本节课程主要...

    SSM框架整合所用的jar包

    相关的jar包可能包括spring-core、spring-context、spring-beans、spring-aop、spring-tx等。 2. Spring MVC:Spring MVC是Spring框架的一部分,专为构建Web应用程序设计。它提供了一个模型-视图-控制器(MVC)架构...

    aop切面demo,基于spring boot制作,很简单实用,可以自己尝试小写框架

    在Spring框架中,AOP被广泛应用,提供了一种声明式的方式来管理横切关注点。 本示例是一个基于Spring Boot实现的AOP切面演示项目。Spring Boot是Spring框架的一个简化版本,它内置了Tomcat服务器,自动配置了许多...

    权限角色系统,基于(spring mvc、 spring、 mybatis)框架开发

    2. **Spring**: - Spring是一个全面的企业级应用框架,提供依赖注入(DI)和面向切面编程(AOP)等核心功能。 - 依赖注入使对象之间的关系由容器管理,降低了对象间的耦合度。 - AOP用于实现横切关注点,如日志...

    Spring+MyBatis/Hibernate+Ehcache+Maven的Demo Web项目(稳定版)

    1.标题所提及技术的整合,Spring包括mvc、aop、ioc等。个人属于强迫症类型,技术水平怎么样再说,代码必须好看 2.Hibernate几个级别缓存对比。见DaoImpl类 3.Ehcache方法缓存及页面缓存。见applicationContext-cache...

    spring-mahout-demo

    下面我们将深入探讨"spring-mahout-demo"项目,理解如何将这两者有效地融合。 首先,"spring-mahout-demo"项目展示了如何在Spring应用中集成Apache Mahout。Spring框架的模块化设计使得添加新功能变得简单,通过...

    spring-framework-5.0.x.zip

    在这个压缩包文件“spring-framework-5.0.x.zip”中,包含了Spring框架的核心源码,这对于深入理解Spring的工作原理和进行高级定制开发至关重要。 首先,让我们了解一下Spring框架的基本结构。Spring由多个模块组成...

    传智播客2016spring资料4

    2. **Spring Bean**:介绍Spring容器如何创建、初始化、配置和管理Bean,以及Bean的作用域(如Singleton、Prototype等)。 3. **AOP**:讲解面向切面编程的概念,如何在不修改源代码的情况下,实现对程序行为的统一...

Global site tag (gtag.js) - Google Analytics