标签:modify ota 它的 call author 处理 bit ret 操作
package com.xbmu.a.aop;
public interface Subject {
String request();
}
RealSubject.javapackage com.xbmu.a.aop;
/**
* 真实主题
* @author bitaotao
*
*/
public class RealSubject implements Subject{
@Override
public String request() {
return "请收取1000元整";
}
}
ProxySubject.javapackage com.xbmu.a.aop;
/**
* 代理主题
* @author bitaotao
*
*/
public class ProxySubject implements Subject{
private Subject subject;
private String str;
@Override
public String request() {
if(subject == null){
subject = new RealSubject();
}
str = subject.request();
//添加的业务逻辑
str = str.replaceAll("1000", "2000");
return str;
}
}
App.javapackage com.xbmu.a.aop;
public class App {
public static void main(String[] args) {
Subject subject = new RealSubject();
System.out.println("真实主题:"+subject.request());
System.out.println("===================");
Subject proxySubject = new ProxySubject();
System.out.println("代理主题:"+proxySubject.request());
}
}
package com.xbmu.b.staticproxy;
public interface IUserManager {
void addUser(String username,String passwd);
void deleteUser(String username,String passwd);
void modifyUser(String username,String passwd);
String findUser(String username);
}
UserManagerImpl.javapackage com.xbmu.b.staticproxy;
public class UserManagerImpl implements IUserManager {
@Override
public void addUser(String username, String passwd) {
System.out.println("这是UserManagerImpl类中的addUser方法");
}
@Override
public void deleteUser(String username, String passwd) {
System.out.println("这是UserManagerImpl类中的deleteUser方法");
}
@Override
public void modifyUser(String username, String passwd) {
System.out.println("这是UserManagerImpl类中的modifyUser方法");
}
@Override
public String findUser(String username) {
System.out.println("这是UserManagerImpl类中的findUser方法");
return "btt";
}
}
UserManagerProxy.javapackage com.xbmu.b.staticproxy;
public class UserManagerProxy implements IUserManager {
private IUserManager userManager;
public UserManagerProxy() {
super();
}
public UserManagerProxy(IUserManager userManageImpl) {
super();
if(userManager == null){
this.userManager = userManageImpl;
}
}
@Override
public void addUser(String username, String passwd) {
checkSecurity();
userManager.addUser(username, passwd);
}
@Override
public void deleteUser(String username, String passwd) {
checkSecurity();
userManager.deleteUser(username, passwd);
}
@Override
public void modifyUser(String username, String passwd) {
checkSecurity();
userManager.modifyUser(username, passwd);
}
@Override
public String findUser(String username) {
checkSecurity();
userManager.findUser(username);
return "bitaotao";
}
private void checkSecurity(){
System.out.println("检查用户信息");
}
}
App.javapackage com.xbmu.b.staticproxy;
public class App {
public static void main(String[] args) {
IUserManager userManager = new UserManagerImpl();
userManager.addUser("btt", "123");
System.out.println("==========================");
IUserManager userManagerProxy = new UserManagerProxy(userManager);
userManagerProxy.addUser("btt", "123");
}
}
package com.xbmu.c.jdkProxy;
public interface IUserManager {
void saveUser(String username,String password);
void updateUser(String username,String password);
void deleteUser(String username);
String findUser(String username);
}
UserManagerImpl.javapackage com.xbmu.c.jdkProxy;
public class UserManagerImpl implements IUserManager{
@Override
public void saveUser(String username, String password) {
System.out.println("UserManagerImpl---saveUser");
}
@Override
public void updateUser(String username, String password) {
System.out.println("UserManagerImpl---updateUser");
}
@Override
public void deleteUser(String username) {
System.out.println("UserManagerImpl---deleteUser");
}
@Override
public String findUser(String username) {
System.out.println("UserManagerImpl---findUser");
return username;
}
}
JdkProxy.javapackage com.xbmu.c.jdkProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**Aspect(切面): 通知要放置到一个类中,那么该类就是切面,JdkProxy*/
public class JdkProxy implements InvocationHandler {
Object userManage = null;
/**
* 百度解释:
* Weaving(织入):
* 织入,AOP术语。把切面(aspect)连接到其它的应用程序类型或对象上,
* 并创建一个被通知 (advised)的对象,这样的行为叫做织入。
* Weaving(织入):
* 是指把切面应用到目标对象来创建新的代理对象的过程.切面在指定的连接点织入到目标对象。
* 织入相当于将目标对象和代理对象关联起来
* */
public Object createProxyInstance(Object userManage) {
//将真实对象传给代理
this.userManage = userManage;
/*
* 第一个参数设置代码使用的类加载器,一般采用跟目标类相同的类加载器
* 第二个参数设置代理类实现的接口,跟目标类使用相同的接口
* 第三个参数设置回调对象,当代理对象的方法被调用时,会调用该参数指定对象的invoke方法
*/
return Proxy.newProxyInstance(this.userManage.getClass().getClassLoader(),
this.userManage.getClass().getInterfaces(),
this);
}
/**
* @param proxy 目标对象的代理类实例
* @param method 对应于在代理实例上调用接口方法的Method实例
* @param args 传入到代理实例上方法参数值的对象数组
* @return 方法的返回值 没有返回值时是null
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
/**
* Pointcut(切入点):目标对象中存在多个方法,只需要对目标对象中多个方法的某些方法进行拦截,
* 此时该操作,就叫做切入点
* */
if(method.getName().startsWith("save") || method.getName().startsWith("find")){
checkSecurity();
}
System.out.println("代理类:"+proxy.getClass());
System.out.println("方法的名称:"+method.getName());
if(args!=null && args.length>0){
for(Object arg:args){
System.out.println("方法的参数:"+arg);
}
}
//调用目标对象的方法
Object returnValue = method.invoke(this.userManage, args);
System.out.println("方法的返回值:"+returnValue);
return returnValue;
}
/**Advice(通知):切入点要做的事情,就是通知(一般指的是方法)*/
public void checkSecurity(){
System.out.println("开始进行安全检查...");
}
}
App.javapackage com.xbmu.c.jdkProxy;
public class App {
public static void main(String[] args) {
IUserManager userManager = new UserManagerImpl();
// userManager.saveUser("zhangsan", "123");
JdkProxy jdkProxy = new JdkProxy();
IUserManager userManageProxy = (IUserManager) jdkProxy.createProxyInstance(userManager);
userManageProxy.saveUser("lisi", "456");
System.out.println("/***********************************/");
String user = userManageProxy.findUser("wangwu");
System.out.println("查询用户:"+user);
System.out.println("/***********************************/");
userManageProxy.updateUser("zhaoliu", "789");
}
}
package com.xbmu.d.cglibProxy;
import java.lang.reflect.Method;
import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**切面*/
public class CglibProxy implements MethodInterceptor {
private Object userManager = null;
/**织入:将相当于将目标对象和代理对象关联起来*/
public Object createProxyInstance(Object userManage) {
this.userManager = userManage;
Enhancer enhancer = new Enhancer();
//设置目标对象的父类
enhancer.setSuperclass(this.userManager.getClass());
//开始调用回调函数,调用intercept的方法
enhancer.setCallback(this);
//创建代理对象
return enhancer.create();
}
/**
* @param obj 目标对象代理类的实例
* @param method 代理实例上调用父类方法的Method实例
* @param args 传入到代理实例上方法参数值的对象数组
* @param methodProxy 使用它调用父类的方法
* @return
* @throws Throwable
*/
public Object intercept(Object proxy, Method method, Object[] args,
MethodProxy methodPrxoy) throws Throwable {
/**
* Pointcut(切入点):目标对象中存在多个方法,只需要对目标对象中多个方法的某些方法进行拦截,
* 此时该操作,就叫做切入点
* */
if(method.getName().startsWith("save") || method.getName().startsWith("find")){
checkSecurity();
}
System.out.println("代理类:"+proxy.getClass());
System.out.println("方法的名称:"+method.getName());
if(args!=null && args.length>0){
for(Object arg:args){
System.out.println("方法的参数:"+arg);
}
}
//methodPrxoy方法的使用
Signature signature = methodPrxoy.getSignature();//获取签名
System.out.println("methodPrxoy:"+signature.getName() + " "
+ signature.getReturnType() + " " + signature.getArgumentTypes());
//调用目标对象的方法
Object returnValue = method.invoke(this.userManager, args);
System.out.println("方法的返回值:"+returnValue);
return returnValue;
}
/**Advice(通知):切入点要做的事情,就是通知(一般指的是方法)*/
public void checkSecurity(){
System.out.println("开始进行安全检查...");
}
}
App.javapackage com.xbmu.d.cglibProxy;
public class App {
public static void main(String[] args) {
/**目标对象:表示访问的真实对象*/
IUserManager userManager = new UserManagerImpl();
userManager.saveUser("张三", "123");
/****************************************************/
//使用jdk代理对象访问
/**
* 代理对象:在访问真实对象的前后可以添加业务逻辑,添加业务逻辑的类,称之为代理对象,
* 简而言之,通过代理对象来访问真实对象
*/
CglibProxy cglibProxy = new CglibProxy();
IUserManager userManageProxy = (IUserManager) cglibProxy.createProxyInstance(userManager);
/**joinpoint(连接点):程序访问目标的方法,就是连接点,saveUser,findUser,updateUser*/
userManageProxy.saveUser("李四", "456");
String user = userManageProxy.findUser("赵六");
System.out.println("查询用户:"+user);
System.out.println("/**********************************/");
userManageProxy.updateUser("王五", "789");
System.out.println("/**********************************/");
}
}
重温Spring之旅5——AOP代理对象、JDK动态代理、使用cglib生产代理
标签:modify ota 它的 call author 处理 bit ret 操作
原文地址:http://blog.csdn.net/btt2013/article/details/54666568