关闭

spring AOP 学习笔记

230人阅读 评论(0) 收藏 举报
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 ----动态添加方法

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:329625次
    • 积分:8942
    • 等级:
    • 排名:第2254名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:5条
    最新评论