spring AOP 学习笔记

原创 2013年12月04日 09:44:36
public class User {
	private int id;
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
}

 

public interface UserManager {

	public void aadUser(User user);
	
	public void deleteById(int id);
	
	public void updateUser(User user);
	
	public User findById(int id);
}

 

package hb.xmlaop;

public class UserManagerImp implements UserManager {

	@Override
	public void aadUser(User user) {
		System.out.println("----------addUser------------");
	}

	@Override
	public void deleteById(int id) {
		System.out.println("----------deleteById------------");
	}

	@Override
	public User findById(int id) {
		System.out.println("----------findById------------");
		User user = new User();
		user.setName("huangbiao");
		System.out.println(user.getName());
		return user;
	}

	@Override
	public void updateUser(User user) {
		System.out.println("----------updateUser------------");
	}

}

 

 

package hb.xmlaop;

import org.aspectj.lang.JoinPoint;

public class SecurityHandler {
	public void checkSecurity(){
		System.out.println("-----------checkSecurity()----------");
	}
	
	//有参无返回值的方法
	public void checkSecurityArg(JoinPoint point){
		System.out.println("-----------checkSecurityArg()----------");
		//此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
        Object[] args = point.getArgs();
        System.out.println("目标参数列表:");
        if (args != null) {
            for (Object obj : args) {
                System.out.println(obj + ",");
            }
            System.out.println();
        }
	}
	
	//有参并有返回值的方法
	public void checkSecurityArgAndReturn(JoinPoint point, Object returnObj){
		System.out.println("-----------checkSecurityArgAndReturn()----------");
		//此方法返回的是一个数组,数组中包括request以及ActionCofig等类对象
        Object[] args = point.getArgs();
        System.out.println("目标参数列表:");
        if (args != null) {
            for (Object obj : args) {
                System.out.println(obj + ",");
            }
            System.out.println();
            System.out.println("执行结果是:" + ((User)returnObj).getName());
        }
	}
}

 

<?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:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
	     http://www.springframework.org/schema/beans 
	     http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
         http://www.springframework.org/schema/aop 
         http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
         http://www.springframework.org/schema/tx 
         http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

	<bean id="userManager" class="hb.xmlaop.UserManagerImp" />
	<bean id="securityHandler" class="hb.xmlaop.SecurityHandler" />

	<aop:config>
		<!-- 切入点  精确到具体的方法,而不是包-->
		<aop:pointcut id="allAddMethod"
			expression="execution(* hb.xmlaop.UserManagerImp.*(..))" />

		<!-- 切面: 将哪个对象中的哪个方法,织入到哪个切入点 -->
		<aop:aspect id="asp" ref="securityHandler">

			<!--
				前置通知 <aop:before method="checkSecurity" pointcut-ref="allAddMethod"
				/> 后置通知 <aop:after method="checkSecurityArg"
				pointcut-ref="allAddMethod"/>
			-->
			<!-- 遍历参数,并且有返回值 -->
			<aop:after-returning method="checkSecurityArgAndReturn"
				returning="returnObj" pointcut-ref="allAddMethod" />

		</aop:aspect>
	</aop:config>

</beans>

  

 

 

package hb.xmlaop;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TestMain{

	public static void main(String[] args) throws Exception{
		//产生一个安全代理的对象方法
		ApplicationContext ctx = new FileSystemXmlApplicationContext("AplicationContext2.xml");
		//强制类型转换为接口,而不是具体的实现类,否则会出错		
 UserManager userManager = (UserManager)ctx.getBean("userManager");
		
		User user = new User();
		user.setAge(23);
		user.setId(1);
		user.setName("huangbiao");
//		userManager.aadUser(user);
		userManager.findById(2222);
	}
}
显示结果:
----------findById------------
huangbiao
-----------checkSecurityArgAndReturn()----------
目标参数列表:
2222,
执行结果是:huangbiao 
备注:AOP底层实现实际上是动态代理,JAVA的动态代理是需要接口的,因此这里获取的bean应该是接口,否则会报错。

 

在开发中如果遇到创建bean不成功,提示——java.lang.NoSuchMethodError:org.objectweb.asm.ClassVisitor.visit

如果引入的包即有hibernate也有spring的,则删除asm-2.2.3.jar后,程序成功运行,这是由于Spring和Hibernate共用了一些jar包引发的错误 

 

spring AOP术语:

 

 
切面  aspect ---- 业务流程运行的某个特定步骤(权限、日志、事物等)
连接点(Joinpoint) : 程序执行过程中明确的点。spring aop中连接点总是方法的调用
增强处理 advice ---- aop框架在特定的切入点执行的增强处理,如around、before、after等类型
切入点(PointCut):可以插入的连接点。即当某个连接点满足指定的要求时,该连接点将被添加增强处理,该连接点也就变为切入点了。
weave ---- 把advice应用到目标方法上的过程叫做织入
target Object----目标对象
Proxy ----代理
Introduction ----动态添加方法

 

spring学习笔记(7)AOP前夕[2]CGLib动态代理实例解析

CGLib动态代理基本原理CGLib——Code Generation Library,它是一个动态字节代码生成库,基于asm。使用CGLib时需要导入asm相关的jar包。而asm又是何方神圣? ...
  • qwe6112071
  • qwe6112071
  • 2016年03月24日 18:51
  • 1618

Spring系统学习笔记一

本笔记学习自Spring in Action 第三版,包括spring核心,xml配置以及面向切面变成
  • u011768896
  • u011768896
  • 2015年03月02日 22:04
  • 2772

Spring MVC 学习笔记(一)

(* 笔记内容均来自 尚硅谷 佟刚老师的视频,例子是在学习中照着敲的) 内容概要 • 1.SpringMVC概述 • 2.SpringMVC的HelloWorld • 3.使用@RequestMapp...
  • u011870547
  • u011870547
  • 2016年01月07日 14:50
  • 1687

spring学习笔记(6)AOP前夕[1]jdk动态代理实例解析

JDK动态代理技术动态代理最常见应用是AOP(面向切面编程)。通过AOP,我们能够地拿到我们的程序运行到某个节点时的方法、对象、入参、返回参数,并动态地在方法调用前后新添一些新的方法逻辑,来满足我们的...
  • qwe6112071
  • qwe6112071
  • 2016年03月24日 16:40
  • 948

Spring源码学习笔记(四)-Aop获取增强、切点

获取增强共两步,第一步获取所有增强(findCandidateAdvisors()),第二步寻找适合该Bean的增强(findAdvisorsThatCanApply)。 在上一章中,//获取增强 ...
  • chenlin597898889
  • chenlin597898889
  • 2016年06月08日 14:13
  • 647

Spring学习笔记(二)后处理器与AOP

Spring 后处理器和AOP
  • z55887
  • z55887
  • 2016年09月27日 21:37
  • 769

Spring学习笔记---4-AOP代码实现及源码解释

一、AOP的实现者       AOP的工作目标就是将横切的问题,如:性能监控,事务处理,日志处理等,进行模块化。使用类似于OOP的方式进行切面的编程工作。位于AOP工具核心的是连接...
  • weikeke410
  • weikeke410
  • 2016年01月18日 14:48
  • 644

Spring.NET学习笔记13——AOP的概念(基础篇)

上篇我们简单的了解了AOP的应用场景,知道AOP编程的重要性。这篇我们先看一段代码,来开始今天的学习。  回顾与上篇类似的代码:SecurityService类的IsPass判断用户名为“admin”...
  • hliq5399
  • hliq5399
  • 2011年03月26日 21:03
  • 1183

Spring.NET学习笔记15——AOP的配置(基础篇) Level 200

上篇我学习了Spring.NET的四种通知类型,AOP的实现方案比较复杂,是通过代码实现的。而Spring.NET框架给我们提供了配置的方式来实现AOP的功能。到目前为止,我们已经讨论过使用Proxy...
  • orichisonic
  • orichisonic
  • 2016年07月13日 09:39
  • 358

Spring学习笔记4-AOP

AOP简介: 面向切面编程 首先介绍动态代理: 动态代理可以在类的所有方法之前增加业务逻辑。jdk中的类想要被动态代理,必须实现接口(假设Target实现了接口ITarget)。使用proxy与...
  • ligeforrent
  • ligeforrent
  • 2016年04月27日 23:36
  • 316
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring AOP 学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)