JDK动态代理与CgLib动态代理的写法
一、环境准备代码
1.pom.xml依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.3.2</version>
</dependency>
2.pojo
package com.andy.pojo;
import java.io.Serializable;
/**
* @author Andy
*/
public class User implements Serializable {
private static final long serialVersionUID = -7924213939006543906L;
private Integer id;
private String name;
private String sex;
private Integer age;
public User(Integer id, String name, String sex, Integer age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
2.service
public interface UserService {
void getUser();
}
3.impl
package com.andy.service;
import com.andy.dao.UserDaoImpl;
import com.andy.pojo.User;
public class UserServiceImpl implements UserService{
@Override
public void getUser() {
User user = new User(1, "Andy", "男", 20);
System.out.println(user);
}
}
二、Jdk动态代理
1.写法
package com.andy.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @author Andy
*/
public class JdkProxy implements InvocationHandler {
private Object obj;
public Object JdkProxy(Object obj) {
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
handle();
System.out.println("执行前");
Object invoke = method.invoke(obj, args);
System.out.println("执行后");
return invoke;
}
private void handle(){
System.out.println("JdkProxy处理业务逻辑");
}
}
2.测试代码
package com.andy.test;
import com.andy.proxy.JdkProxy;
import com.andy.service.UserService;
import com.andy.service.UserServiceImpl;
public class JdkTest {
public static void main(String[] args) {
UserService o = (UserService)new JdkProxy().JdkProxy(new UserServiceImpl());
o.getUser();
}
}
三、CgLib动态代理
1.写法
package com.andy.proxy;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;
/**
* @author Andy
*/
public class CglibProxy implements MethodInterceptor {
private Object obj;
public Object createProxy(Object obj) {
this.obj = obj;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(obj.getClass());
enhancer.setCallback(this);
return enhancer.create();
}
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
handle();
System.out.println("执行前");
Object invoke = method.invoke(obj, objects);
System.out.println("执行后");
return invoke;
}
private void handle(){
System.out.println("CglibProxy处理业务逻辑");
}
}
2.测试代码
package com.andy.test;
import com.andy.proxy.CglibProxy;
import com.andy.service.UserService;
import com.andy.service.UserServiceImpl;
public class CglibTest {
public static void main(String[] args) {
UserService proxy = (UserService)new CglibProxy().createProxy(new UserServiceImpl());
proxy.getUser();
}
}