Documentation
¶
Overview ¶
Package proxy 提供 AOP 动态代理实现,用于 enhance 框架。
该模块提供两种代理实现和代理工厂:
- JdkDynamicProxy: 基于反射的 JDK 动态代理,支持接口代理
- CglibProxy: 基于结构体嵌入的 CGLIB 代理,支持非接口方法
- ProxyFactory: 代理工厂,统一创建代理对象
架构设计 ¶
- Proxy: 代理接口,定义统一的调用方法
- ProxyFactory: 代理工厂接口,负责创建代理对象
- InvocationHandler: 调用处理器接口,定义方法拦截逻辑
- JdkDynamicProxy: JDK 动态代理实现
- CglibProxy: CGLIB 代理实现
使用方式 ¶
创建 JDK 动态代理:
handler := &MyInvocationHandler{}
proxy := proxy.NewJdkDynamicProxy(target, iface, handler)
result, err := proxy.Invoke(target, "MethodName", []any{arg1, arg2})
创建 CGLIB 代理:
handler := &MyInvocationHandler{}
proxy := proxy.NewCglibProxy(target, handler)
result, err := proxy.Invoke(target, "MethodName", []any{arg1, arg2})
使用代理工厂:
factory := proxy.NewProxyFactory(target) factory.SetHandler(handler) proxy := factory.CreateProxy()
设计模式 ¶
- Proxy 模式:封装目标对象,控制方法访问
- Factory 模式:统一代理对象创建
- Chain of Responsibility:通过 InvocationHandler 实现调用链
Index ¶
- func IsCglibProxy(obj any) bool
- func IsJdkDynamicProxy(obj any) bool
- type CglibProxy
- func (p *CglibProxy) AdvisedAdvisors() []aop.Advisor
- func (p *CglibProxy) GetHandler() InvocationHandler
- func (p *CglibProxy) GetMethod(name string) (reflect.Method, error)
- func (p *CglibProxy) GetTarget() any
- func (p *CglibProxy) GetTargetType() reflect.Type
- func (p *CglibProxy) Invoke(target any, method string, args []any) (any, error)
- func (p *CglibProxy) InvokeMethod(name string, args []any) (any, error)
- func (p *CglibProxy) Target() any
- type InvocationHandler
- type JdkDynamicProxy
- func (p *JdkDynamicProxy) AdvisedAdvisors() []aop.Advisor
- func (p *JdkDynamicProxy) GetHandler() InvocationHandler
- func (p *JdkDynamicProxy) GetIface() reflect.Type
- func (p *JdkDynamicProxy) GetMethod(name string) (reflect.Method, error)
- func (p *JdkDynamicProxy) GetTarget() any
- func (p *JdkDynamicProxy) Invoke(target any, method string, args []any) (any, error)
- func (p *JdkDynamicProxy) InvokeMethod(name string, args []any) (any, error)
- func (p *JdkDynamicProxy) Target() any
- type Proxy
- type ProxyFactory
- type ProxyType
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func IsJdkDynamicProxy ¶
IsJdkDynamicProxy 检查对象是否为 JdkDynamicProxy。
Types ¶
type CglibProxy ¶
type CglibProxy struct {
// contains filtered or unexported fields
}
CglibProxy CGLIB 代理。
基于结构体嵌入实现的代理,支持非接口方法。 通过嵌入目标结构体并重写方法,实现 AOP 增强。
使用方式:
handler := &MyHandler{}
proxy := proxy.NewCglibProxy(&MyService{}, handler)
result, err := proxy.Invoke(target, "DoSomething", []any{arg1, arg2})
线程安全:是
func EnsureCglibProxy ¶
func EnsureCglibProxy(obj any) (*CglibProxy, bool)
EnsureCglibProxy 确保对象是 CglibProxy。
返回值:
- *CglibProxy: 代理实例
- bool: 是否为 CglibProxy
func NewCglibProxy ¶
func NewCglibProxy(target any, handler InvocationHandler, advisors ...aop.Advisor) *CglibProxy
NewCglibProxy 创建 CGLIB 代理。
参数:
- target: 目标对象(必须是结构体指针)
- handler: 调用处理器
返回值:
- *CglibProxy: 代理实例
panic: 如果 target 不是结构体指针
func (*CglibProxy) AdvisedAdvisors ¶
func (p *CglibProxy) AdvisedAdvisors() []aop.Advisor
AdvisedAdvisors 获取已应用的通知器列表。 实现 Proxy 接口。
func (*CglibProxy) GetHandler ¶
func (p *CglibProxy) GetHandler() InvocationHandler
GetHandler 获取调用处理器。
func (*CglibProxy) GetMethod ¶
func (p *CglibProxy) GetMethod(name string) (reflect.Method, error)
GetMethod 获取结构体方法(带缓存)。
查找指针接收者方法。
参数:
- name: 方法名
返回值:
- reflect.Method: 方法信息
- error: 方法不存在时返回错误
func (*CglibProxy) GetTargetType ¶
func (p *CglibProxy) GetTargetType() reflect.Type
GetTargetType 获取目标类型。
func (*CglibProxy) Invoke ¶
Invoke 调用代理方法。
通过反射查找结构体方法,并委托给 InvocationHandler 处理。
参数:
- target: 目标对象
- method: 方法名
- args: 方法参数列表
返回值:
- any: 方法返回值
- error: 调用错误
func (*CglibProxy) InvokeMethod ¶
func (p *CglibProxy) InvokeMethod(name string, args []any) (any, error)
InvokeMethod 直接通过反射调用结构体方法(不经过 handler)。
用于在 InvocationHandler 中调用原始方法。
参数:
- name: 方法名
- args: 方法参数列表
返回值:
- any: 方法返回值
- error: 调用错误
type InvocationHandler ¶
type InvocationHandler interface {
// Invoke 处理方法调用。
//
// 在目标方法调用前后执行自定义逻辑。
// 必须调用 target 的实际方法(如果需要)。
//
// 参数:
// - target: 目标对象
// - method: 方法名
// - args: 方法参数列表
//
// 返回值:
// - any: 方法返回值
// - error: 调用错误
Invoke(target any, method string, args []any) (any, error)
}
InvocationHandler 调用处理器接口。
定义方法拦截逻辑。在代理调用目标方法时,调用处理器可以:
- 在方法执行前执行前置逻辑
- 在方法执行后执行后置逻辑
- 替换方法执行结果
- 抛出异常阻止方法执行
类似于 java.lang.reflect.InvocationHandler。
type JdkDynamicProxy ¶
type JdkDynamicProxy struct {
// contains filtered or unexported fields
}
JdkDynamicProxy JDK 动态代理。
基于反射实现的动态代理,支持接口代理。 通过 InvocationHandler 拦截方法调用,实现 AOP 增强。
使用方式:
handler := &MyHandler{}
proxy := proxy.NewJdkDynamicProxy(target, handler)
result, err := proxy.Invoke(target, "DoSomething", []any{arg1, arg2})
线程安全:是
func EnsureJdkDynamicProxy ¶
func EnsureJdkDynamicProxy(obj any) (*JdkDynamicProxy, bool)
EnsureJdkDynamicProxy 确保对象是 JdkDynamicProxy。
返回值:
- *JdkDynamicProxy: 代理实例
- bool: 是否为 JdkDynamicProxy
func NewJdkDynamicProxy ¶
func NewJdkDynamicProxy(target any, iface reflect.Type, handler InvocationHandler, advisors ...aop.Advisor) *JdkDynamicProxy
NewJdkDynamicProxy 创建 JDK 动态代理。
参数:
- target: 目标对象(必须实现 iface 指定的接口)
- iface: 接口类型(通过 reflect.Type 传递)
- handler: 调用处理器
返回值:
- *JdkDynamicProxy: 代理实例
使用示例:
var svc TestService = &TestServiceImpl{}
proxy := proxy.NewJdkDynamicProxy(svc, reflect.TypeOf((*TestService)(nil)).Elem(), handler)
panic: 如果 target 或 iface 为 nil
func (*JdkDynamicProxy) AdvisedAdvisors ¶
func (p *JdkDynamicProxy) AdvisedAdvisors() []aop.Advisor
AdvisedAdvisors 获取已应用的通知器列表。 实现 Proxy 接口。
func (*JdkDynamicProxy) GetHandler ¶
func (p *JdkDynamicProxy) GetHandler() InvocationHandler
GetHandler 获取调用处理器。
func (*JdkDynamicProxy) GetIface ¶
func (p *JdkDynamicProxy) GetIface() reflect.Type
GetIface 获取接口类型。
func (*JdkDynamicProxy) GetMethod ¶
func (p *JdkDynamicProxy) GetMethod(name string) (reflect.Method, error)
GetMethod 获取接口方法(带缓存)。
参数:
- name: 方法名
返回值:
- reflect.Method: 方法信息
- error: 方法不存在时返回错误
func (*JdkDynamicProxy) Invoke ¶
Invoke 调用代理方法。
通过反射查找接口方法,并委托给 InvocationHandler 处理。
参数:
- target: 目标对象
- method: 方法名
- args: 方法参数列表
返回值:
- any: 方法返回值
- error: 调用错误
func (*JdkDynamicProxy) InvokeMethod ¶
func (p *JdkDynamicProxy) InvokeMethod(name string, args []any) (any, error)
InvokeMethod 直接通过反射调用接口方法(不经过 handler)。
用于在 InvocationHandler 中调用原始方法。
参数:
- name: 方法名
- args: 方法参数列表
返回值:
- any: 方法返回值
- error: 调用错误
func (*JdkDynamicProxy) Target ¶
func (p *JdkDynamicProxy) Target() any
Target 获取原始目标对象。 实现 Proxy 接口。
type Proxy ¶
type Proxy interface {
// Invoke 调用代理方法。
//
// 通过代理对象调用目标方法,拦截器会自动执行匹配的通知。
//
// 参数:
// - target: 目标对象
// - method: 方法名
// - args: 方法参数列表
//
// 返回值:
// - any: 方法返回值
// - error: 调用错误
Invoke(target any, method string, args []any) (any, error)
// Target 获取原始目标对象。
Target() any
// AdvisedAdvisors 获取已应用的通知器列表。
AdvisedAdvisors() []aop.Advisor
}
Proxy 代理接口。
定义代理对象的核心行为。代理对象封装目标对象,控制方法访问。 所有代理实现都必须实现此接口,提供统一的调用方式。
type ProxyFactory ¶
type ProxyFactory interface {
// CreateProxy 创建代理对象。
//
// 根据目标对象类型自动选择代理实现。
// 如果目标实现了接口,使用 JDK 动态代理;
// 否则使用 CGLIB 代理。
//
// 参数:
// - target: 目标对象
// - handler: 调用处理器
//
// 返回值:
// - Proxy: 代理对象
// - error: 创建错误
CreateProxy(target any, handler InvocationHandler) (Proxy, error)
// CreateProxyWithAdvisors 创建带通知器的代理对象。
//
// 创建代理对象并应用指定的通知器列表。
//
// 参数:
// - target: 目标对象
// - handler: 调用处理器
// - advisors: 通知器列表
//
// 返回值:
// - Proxy: 代理对象
// - error: 创建错误
CreateProxyWithAdvisors(target any, handler InvocationHandler, advisors []aop.Advisor) (Proxy, error)
}
ProxyFactory 代理工厂接口。
负责创建代理对象。根据目标对象的类型(接口或结构体), 自动选择最优的代理实现(JDK 动态代理或 CGLIB 代理)。
func NewProxyFactoryWithIface ¶
func NewProxyFactoryWithIface(iface reflect.Type) ProxyFactory
NewProxyFactoryWithIface 创建指定接口的代理工厂。