springAOP理解——java中的proxy实现AOP功能

之前学习的例子,贴上来供大家共同学习。大家都知道,spring的AOP功能实际上是实现了java的动态代理功能,下面分别给出java动态代理、spring中CGLIB实现AOP功能、及spring 中实现AOP的配置(配置文件方式和注解方式)。

1.动态代理:在调用接口前,提前对要代理的接口进行拦截,拦截中做一些事,处理后继续调用接口方法,不影响正常逻辑

可用于权限控制

2.实现例子(没有列出相关jar)

1接口

package com.mooing.service;

public interface MyService {
public void save();
public void findAll();
public void update();
public void delete();
}

2实现类

package com.mooing.service;

public class MyServiceImpl implements MyService {

private String temp = null;

public MyServiceImpl() {
}

public MyServiceImpl(String temp) {
this.temp = temp;
}

public void save() {
System.out.println("this is save()");
}

@Override
public void findAll() {
System.out.println("this is findAll()");
}

@Override
public void update() {
System.out.println("this is update()");
}

@Override
public void delete() {
System.out.println("this is delete()");
}

public String getTemp() {
return temp;
}
}

3代理类

package com.mooing.service;

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

/**

为目标对象创建代理类
* 代理类,需实现InvocationHandle接口
* @author mooing
*
*/
public class MyProxyService implements InvocationHandler {

private Object targetObj;

/**
* 为目标对象创建代理类
*
* 传入要代理类,创建此类的代理实例
*
* @param targetObj 目标对象
* @return 返回目标对象的代理类
*/public Object createProxyInstances(Object targetObj) {
this.targetObj = targetObj;

/**
* 参数1 要代理对象的类装载器
* 参数2 要代理对象的所有接口
* 参数3 触发哪个类里的拦截方法(回调方法invoke,处理实际调用方法前的操作) this代表当前类
*/

return Proxy.newProxyInstance(targetObj.getClass().getClassLoader(), targetObj.getClass().getInterfaces(), this);
}

/**
* 回调方法
*/

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// MyService ms=(MyService) createProxyInstances(new MyServiceImpl());
//MyServiceImpl myservice = (MyServiceImpl) targetObj;
//Object result = null;
//if (myservice.getTemp() != null) {
//result = method.invoke(targetObj, args);
//}
//return result;

System.out.println("进入拦截方法");
return method.invoke(targetObj, args);
}
}

测试类

package com.mooing.test;

import org.junit.Test;

import com.mooing.service.MyProxyService;
import com.mooing.service.MyService;
import com.mooing.service.MyServiceImpl;

public class MyProxyTest {

@Test
public void testJdkProxy() {
MyProxyService proxy = new MyProxyService();

//代理目的:如果给MyServiceImpl类中temp赋值,则调用接口方法,否则不调用,类似权限控制
MyService ms = (MyService) proxy.createProxyInstances(new MyServiceImpl("xxx"));
ms.delete();
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值