【j2ee spring】4、spring的aop学习

spring的aop学习

1、关于拦截权限

1、拦截类中所有的业务方法

2、判断用户是否有权限,有就允许执行业务方法,否则不准


PersonService.java

/**
* 书本:【SSH】
* 功能:spring的aop学习
* 文件:PersonService.java
* 时间:2015年3月23日08:52:08
* 作者:cutter_point
*/
package cn.cutter_point.service;

public interface PersonService 
{
	public void save(String name);
	public void update(String name, Integer personid);
	public String getPersonName(Integer personid);

}

PersonServiceBean.java

/**
* 书本:【SSH】
* 功能:spring的aop学习
* 文件:PersonServiceBean.java
* 时间:2015年3月23日08:52:08
* 作者:cutter_point
*/
package cn.cutter_point.service.impl;

import cn.cutter_point.service.PersonService;

public class PersonServiceBean implements PersonService
{
	private String user = null;
	
	public PersonServiceBean() {}
	
	public PersonServiceBean(String user)
	{
		this.user = user;
	}
	

	public void save(String name) 
	{
		// TODO Auto-generated method stub
		if(user != null)
		{
			System.out.println("cutter_point save() 方法!!!");
		}
		
	}


	public void update(String name, Integer personid) 
	{
		// TODO Auto-generated method stub
		if(user != null)
		{
			System.out.println("cutter_point update()方法!");
		}
	}

	public String getPersonName(Integer personid) 
	{
		// TODO Auto-generated method stub
		if(user != null)
		{
			System.out.println("cutter_point getPersonName()方法!");
		}
		return "cutter_point";
	}

}

但是这样做显然是不行的,如果我们要控制更多的业务bean的业务方法,那么这个会出现在各个业务bean中,所以这个方法就不灵活,并且如果我们不是用user是不是为空来判断是否有权限的话,那么我们就都得改,那么久更麻烦了

2、使用代理来控制权限


那么这个代理对象如何去创建呢???

这个时候jdk中有一个Proxy的类,这个类有一个方法就是创建代理实例的,其中这个方法有三个参数。

1、类的装载器

2、要实现的接口

3、回调的接口实现,拦截到方法之后会触发这个类

<pre name="code" class="java">/**
* 书本:【SSH】
* 功能:spring的aop学习
* 文件:JDKProxyFactory.java
* 时间:2015年3月23日09:26:03
* 作者:cutter_point
*/
package cn.aop;

import java.lang.reflect.Proxy;

public class JDKProxyFactory 
{
	public Object targetObject;		//目标对象
	private ProxyWays pw;	//实现拦截方法处理
	
	public Object createProxyIntance(Object targetObject)
	{
		this.targetObject = targetObject;
		pw = new ProxyWays(targetObject);
		//返回一个代理实例,类装载器,要拦截的接口,方法, 拦截之后执行的方法
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), this.targetObject.getClass().getInterfaces(), pw);
	}

}

 

拦截到的时候我们有一个pw的实例来处理事务

/**
* 书本:【SSH】
* 功能:spring的aop学习,拦截到对象之后要执行的方法
* 文件:ProxyWays.java
* 时间:2015年3月23日09:26:03
* 作者:cutter_point
*/
package cn.aop;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import cn.cutter_point.service.impl.PersonServiceBean;

public class ProxyWays implements InvocationHandler
{
	Object targetObject;
	
	public ProxyWays(Object targetObject)
	{
		this.targetObject = targetObject;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable 
	{
		PersonServiceBean bean = (PersonServiceBean)this.targetObject;
		
		Object result = null;
		
		if(bean.getUser() != null)	//用户不为空,有权限
		{
			result = method.invoke(targetObject, args);//那么久执行他
		}
		
		
		return result;
	}

}

3、测试

package junit.test;

import static org.junit.Assert.*;

import org.junit.BeforeClass;
import org.junit.Test;

import cn.aop.JDKProxyFactory;
import cn.cutter_point.service.PersonService;
import cn.cutter_point.service.impl.PersonServiceBean;

public class AOPTest 
{
	@BeforeClass
	public static void setUpBeforeClass() throws Exception
	{}

	@Test
	public void test() 
	{
		//fail("Not yet implemented");
		JDKProxyFactory factory = new JDKProxyFactory();	//创建一个代理工厂
		PersonService service = (PersonService) factory.createProxyIntance(new PersonServiceBean("cutter"));
		service.save("point");
	}

}






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值