1. 동적 프록시 소개
package cn2; public interface IUserDAO { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class UserDAOImpl implements IUserDAO { @Override public void login() { System.out.println("用户登录"); } @Override public void register() { System.out.println("用户注册"); } } package cn2; public class Test { public static void main(String[] args) { IUserDAO dao = new UserDAOImpl(); dao.register(); dao.login(); } }
사용자 등록
사용자 로그인
각 방법을 제공하고 싶다면 권한 확인 및 로깅이 추가되면 코드 구현은 다음과 같습니다.
package cn2; public interface IUserDAO { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class UserDAOImpl implements IUserDAO { @Override public void login() { System.out.println("用户登录"); } @Override public void register() { System.out.println("用户注册"); } } package cn2; public class UserDAOImpl2 implements IUserDAO { private void actionCheck(){ System.out.println("权限检查"); } private void record(){ System.out.println("日志记录"); } @Override public void login() { this.actionCheck(); System.out.println("登录"); this.record(); } @Override public void register() { this.actionCheck(); System.out.println("注册"); this.record(); } } package cn2; public class Test { public static void main(String[] args) { IUserDAO dao = new UserDAOImpl2(); dao.register(); dao.login(); } }
권한 확인
등록
로그 기록
권한 확인
로그인
로깅
인터페이스 구현과 권한 확인 및 로깅 추가를 위해 별도의 클래스를 작성해야 하는 이유는 무엇인가요? 왜냐하면 우리가 디자인할 때 확장된 기능을 개발하고 코드 수정을 마무리하는 원칙을 보장해야 하기 때문입니다. 원래 구현 클래스를 수정하는 대신 원래 인터페이스의 기능을 확장하기 위해 인터페이스를 구현하기 위해 새 클래스를 정의했습니다.
그러나 이렇게 설계하는 것은 끔찍할 것입니다. 요구사항이 변경되면 구현 클래스를 많이 정의해야 하므로 너무 복잡해집니다. 무엇을 해야 할까요?
살다보면 집을 빌리고 싶은데 집주인을 모르는데 어떻게 해야 할까요? 대리인을 찾으세요. 마찬가지로 권한 확인 및 로깅 기능을 추가하기 위해 코드를 수정하고 싶지 않은 경우 이를 구현하는 데 도움이 되는 프록시 개체를 찾을 수 있나요?
동적 프록시: 이 개체는 프로그램 실행 중에 생성됩니다.
Java에서는 java.lang.reflect 패키지 아래에 Proxy 클래스와 InvocationHandler 인터페이스가 제공되며 이 클래스와 인터페이스를 사용하여 동적 프록시 객체를 생성할 수 있습니다. JDK는 인터페이스의 프록시 역할만 합니다.
Proxy 클래스의 메소드는 동적 프록시 객체를 생성합니다
public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)
>
Object invoke(Object proxy,Method method,Object[] args)
package cn2; public interface IUserDAO { /** * 登录方法 */ public void login(); /** * 注册方法 */ public void register(); } package cn2; public class UserDAOImpl implements IUserDAO { @Override public void login() { System.out.println("用户登录"); } @Override public void register() { System.out.println("用户注册"); } } package cn2; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyInvocationHandler implements InvocationHandler { private Object target; public MyInvocationHandler(Object target) { this.target = target; } /** *返回动态代理对象 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("权限检查"); Object invoke = method.invoke(target, args); System.out.println("日志记录"); return invoke; } } package cn2; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { //使用动态代理之前 IUserDAO dao = new UserDAOImpl(); dao.register(); dao.login(); System.out.println("-------------------"); //使用动态代理之后 IUserDAO proxy = (IUserDAO)Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(), new MyInvocationHandler(dao)); proxy.register(); proxy.login(); } }
사용자 로그인
---------------------------- ----
권한 확인
사용자 등록
로깅
권한 확인
사용자 로그인
로깅