Spring Framework-04-01-Proxy Mode & AOP Overview


Agency model

Insert picture description here
Create a proxy object to control the target object (the proxied object), and the proxy object can add extra functions.

Simple implementation of static proxy

Insert picture description here
Insert picture description here

Project structure

Insert picture description here

Log tool class LogUtil.java

package com;

import java.util.Date;


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

Proxy mode interface UserService.java

package com;


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

Replace the proxy class

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;
	}

}

The proxy class 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 class 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);
	}
}

Dynamic proxy

Insert picture description here

Can be generated automatically,

Project structure

Insert picture description here

Log tool class LogUtil.java

package com;

import java.util.Date;


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

Proxy mode interface UserService.java

package com;


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

Proxy class 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;
	}

}

The proxy class 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 class 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");
	}
}

Guess you like

Origin blog.csdn.net/qq_44627608/article/details/115268755