静态代理
概念
:
静态代理,是代理模式的一种实现方式,
它要求代理类
和 被代理类
实现同一个接口,
这样代理类
就可以代替被代理类对象
对外提供服务,
当代理类的方法
被调用时,代理类
会在调用被代理类方法的前后,添加一些公共的业务逻辑,
例如:日志记录、安全检查、事务管理等
静态代理的缺点
:
当,被代理的接口,有很多方法时,代理类需要实现所有的方法,并添加相应的代理逻辑,
这会导致代理类非常庞大且难以维护,
此外,每增加一个新的接口,都需要创建一个新的代理类,这也增加了代码的复杂度,
因此,在实际应用中,动态代理(如:JDK动态代理、CGLIB动态代理)往往更加灵活和方便。
静态代理举例
首先,定义一个接口
public interface UserService { void addUser(String username, String password);void deleteUser(String username); }
然后,实现被代理类(真实对象)
,实现UserService接口
public class UserServiceImpl implements UserService { @Override public void addUser(String username, String password) { System.out.println("UserServiceImpl: Adding user with username = " + username); } @Override public void deleteUser(String username) { System.out.println("UserServiceImpl: Deleting user with username = " + username); } }
再然后,创建静态代理类
,同样实现UserService接口,并在内部持有被代理类的实例
public class UserServiceProxy implements UserService { private UserService userService; public UserServiceProxy(UserService userService) { this.userService = userService; } @Override public void addUser(String username, String password) { // 在调用目标方法前添加一些逻辑 System.out.println("UserServiceProxy: Before adding user..."); // 调用目标方法 userService.addUser(username, password); // 在调用目标方法后添加一些逻辑 System.out.println("UserServiceProxy: After adding user..."); } @Override public void deleteUser(String username) { // 类似地,在调用目标方法前后添加逻辑 System.out.println("UserServiceProxy: Before deleting user..."); userService.deleteUser(username); System.out.println("UserServiceProxy: After deleting user..."); } }
最后,在测试类中,通过静态代理类
来调用被代理类的方法:
public class Client { public static void main(String[] args) { // 创建被代理对象 UserService userService = new UserServiceImpl(); // 创建代理对象,并将被代理对象传递给代理对象 UserService proxy = new UserServiceProxy(userService); // 通过代理对象调用方法 proxy.addUser("Alice", "password123"); proxy.deleteUser("Alice"); }
}