Spring框架-04-01-代理模式 & AOP概述


代理模式

在这里插入图片描述
创建代理对象控制目标对象(被代理对象),代理对象可以增加格外的功能。

静态代理简单实现

在这里插入图片描述
在这里插入图片描述

项目结构

在这里插入图片描述

日志工具类 LogUtil.java

package com;

import java.util.Date;


//日志工具类
public class LogUtil {
    
    
	public static void log() {
    
    
		System.out.println("登陆成功,当前时间为:"+new Date().toLocaleString());
	}
}

代理模式的接口 UserService .java

package com;


//代理模式的接口
public interface UserService {
    
    
	public boolean login(String loginName, String pwd);
	//public boolean regist(String loginName, String pwd);
}

代替代理类得那个类

package com;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//本质是反射
public class LogHanler implements InvocationHandler{
    
    
	
	private Object delegate;
	//创建目标的代理对象(被代理对象)
	public Object bind(Object delegate) {
    
    
		this.delegate = delegate;
		//单数1:目标对象的类加载器,参数2:目标接口,参数3:代理类
		return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
	}

	
	//上面方法执行时,下面得方法也会自动执行
	//参数2:登陆方法,参数3:登陆方法参数
	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    
    
		//通过反射调用方法,被代理得目标方法
		Object result = method.invoke(delegate, args);
		LogUtil.log();	
		
		return result;
	}

}

被代理类 UserServiceImpl .java

package com;



//这是被代理类
public class UserServiceImpl implements UserService{
    
    
	
	public boolean login(String loginName, String pwd) {
    
    
		//登录的业务逻辑
		boolean result = "zs".equals(loginName) && "123".equals(pwd);
		System.out.println("登录的业务逻辑");
		return result;
	}
	
	public boolean regist(String loginName, String pwd) {
    
    
		return true;
	}

}

测试类 Test.java

package com;

public class Test {
    
    

	public static void main(String[] args) {
    
    
		//调用的是代理类
		UserService us = new UserServiceProxy();
		boolean result = us.login("zs", "123");
		System.out.println(result);
	}
}

动态代理

在这里插入图片描述

可以自动生成,

项目结构

在这里插入图片描述

日志工具类 LogUtil.java

package com;

import java.util.Date;


//日志工具类
public class LogUtil {
    
    
	public static void log() {
    
    
		System.out.println("登陆成功,当前时间为:"+new Date().toLocaleString());
	}
}

代理模式的接口 UserService .java

package com;


//代理模式的接口
public interface UserService {
    
    
	public boolean login(String loginName, String pwd);
	//public boolean regist(String loginName, String pwd);
}

代理类 UserServiceProxy .java

package com;


//代理对象,这是代理类,调用了原来的功能
public class UserServiceProxy implements UserService{
    
    
	
	//放入被代理对象
	private UserServiceImpl userServiceImpl;

	@Override
	public boolean login(String loginName, String pwd) {
    
    
		userServiceImpl = new UserServiceImpl();
		boolean result = userServiceImpl.login(loginName, pwd);
		LogUtil.log();
		return result;
	}
	
	public boolean regist(String loginName, String pwd) {
    
    
		return true;
	}

}

被代理类 UserServiceImpl .java

package com;



//这是被代理类
public class UserServiceImpl implements UserService{
    
    
	
	public boolean login(String loginName, String pwd) {
    
    
		//登录的业务逻辑
		boolean result = "zs".equals(loginName) && "123".equals(pwd);
		System.out.println("登录的业务逻辑");
		return result;
	}
	
	public boolean regist(String loginName, String pwd) {
    
    
		return true;
	}

}

测试类 Test.java

package com;

public class Test {
    
    

	public static void main(String[] args) {
    
    
		
		//动态代理
		LogHanler logHanler = new LogHanler();
		//创建代理对象,参数是目标对象
		UserService us = (UserService)logHanler.bind(new UserServiceImpl());
		boolean result = us.login("zs", "123");
		System.out.println(result);		
//		us.regist("zs", "123");
	}
}

猜你喜欢

转载自blog.csdn.net/qq_44627608/article/details/115268755