AOP代理模式
代理模式:
1.静态代理
原理:创建一个代理类实现目标类的接口,在代理类中包含目标类的对象
案例:
1)需要创建一个接口
public interface IUserService { public void insert(); }
2)创建目标类来实现接口
import com.test.staticproxy.IUserService; public class UserService implements IUserService { @Override public void insert() { } }
3)创建代理类
public class UserProxy implements IUserService { //静态代理 //缺点 代理的是固定的对象 private IUserService userService=new UserService(); @Override public void insert() { System.out.println("代理给代理对象加的内容"); userService.insert(); System.out.println("代理给代理对象加的内容"); } }
2.动态代理
静态代理代理的是固定对象,可以用动态代理实现 代理不同的对象
2.1 jdk自带的代理方式
原理:通过jdk中自带的Proxy类创建一个代理对象,代理类实现了目标类的接口
前提:目标对象一定要有接口
1)需要创建一个接口
public interface IUserService { public void insert(); }
2)创建目标类来实现接口
import com.test.staticproxy.IUserService; public class UserService implements IUserService { @Override public void insert() { } }
创建一个代理类生成器
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class Handler implements InvocationHandler { //存放目标对象 Object subject; public Handler(Object subject) { this.subject=subject; } // 用jdk写好的Proxy类生成一个代理对象 public static Object bind(Object subject) { //创建一个类实现目标类的接口,返回这个类的对象 return Proxy.newProxyInstance(Handler.class.getClassLoader(), subject.getClass().getInterfaces(), new Handler(subject)); } //通过反射的方式 实现 调用代理对象的方法时 实际会去调用目标对象中的方法,并且在调用目标对象方法前后加上自定义内容 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.print("打印日志"); //调用原目标对象中的方法 Object object= method.invoke(subject,args); return object; } }
使用
@Test public void fun() { //只能用目标对象的接口接收 不能用目标对象接收 IStudentService studentService=(IStudentService) Handler.bind(new StudentService()); studentService.add(); }