在jdbc中,如果连接需要归还给连接池,那么直接调用close方法即可,但是调用connection.close()是关闭连接,而现在是将连接还回连接池,其原因就是对Connection的close方法进行了增强。
代理模式的作用:
代理对象可以在调用者和目标对象之间起到中介的作用。代理对象可以对目标对象的功能进行增强。
什么是动态代理:
在程序运行的过程中,动态创建出代理对象,我们可以对代理对象进行控制,对其方法进行增强。
动态代理相应的api:
1. Proxy
类
1. InvocationHandler
接口
4.2.3
动态代理模式的开发步骤
1.
直接创建真实对象
2.
通过
Proxy
类,创建代理对象
3.
调用代理方法
4.
在
InvocationHandler
的
invoke
进行处理
4.2.4
动态代理模式使用
static
Object
newProxyInstance
(
ClassLoader loader
,
Class
[]
interfaces
,
InvocationHandler h
)
作用:生成实现指定接口的代理对象
参数说明:
loader
参数:目标对象
(
被代理对象
)
的类加载器
,
一般使用代理对象的类加载器
interfaces
:目标对象
(
被代理对象
)
需要实现的接口数组
,
一般使用代理对象实现的接口数组
h
:
具体的代理操作,
InvocationHandler
是一个接口,需要传入一个实现了此接口的实现类。
返回值:实现指定接口的代理对象。
1. InvocationHandler
接口
Object
invoke
(
Object
proxy
,
Method method
,
Object
[]
args
)
作用:在这个方法中实现对真实方法的增强
参数说明:
proxy
:即方法
newProxyInstance
()
方法返回的代理对象,该对象一般不要在
invoke
方法中使用。
method
:
代理对象调用的方法对象。
args
:代理对象调用方法时传递的参数。
返回值:代理对象执行完此方法后的返回值
,
一般使用被代理对象方法的返回值。
4.2.3
动态代理模式的开发步骤
1.
直接创建真实对象
2.
通过
Proxy
类,创建代理对象
3.
调用代理方法
4.
在
InvocationHandler
的
invoke
进行处理
4.2.4
动态代理模式使用
1. Providable
接口
/*
提供商 品的接口
*/
public interface
Providable
{
//
卖电脑
public abstract
void
sellComputer
(
double
price
);
//
维修电脑
public abstract
void
repairComputer
(
double
price
);
}
1. ComputerFactory
目标对象
/*
电脑工厂,真正生产电脑的厂商
*/
public class
ComputerFactory
implements
Providable
{
@Override
public
void
sellComputer
(
double
price
) {
System
.
out
.
println
(
"
电脑工厂卖出一台电脑,价格:
"
+
price
);
}
@Override
public
void
repairComputer
(
double
price
) {
System
.
out
.
println
(
"
电脑工厂修好一台电脑,价格:
"
+
price
);
}
}
1.
调用者,动态生成代理对象
public class
Demo05
{
public static
void
main
(
String
[]
args
) {
// 1.
直接创建真实对象
ComputerFactory computerFactory
=
new
ComputerFactory
();
// 2.
通过
Proxy
类,创建代理对象
Providable proxy
=
(
Providable
)
Proxy
.
newProxyInstance
(
ComputerFactory
.
class
.
getClassLoader
(),
new
Class
[] {
Providable
.
class
},
new
MyInvocationHandler
(
computerFactory
)
);
// 3.
调用代理方法
proxy
.
sellComputer
(
5000
);
proxy
.
repairComputer
(
800
);
}
}
// InvocationHandler
实现类
class
MyInvocationHandler
implements
InvocationHandler
{
private
ComputerFactory computerFactory
;
public
MyInvocationHandler
(
ComputerFactory computerFactory
) {
this
.
computerFactory
=
computerFactory
;
}
// 4.
在
InvocationHandler
的
invoke
进行处理
@Override
public
Object
invoke
(
Object
proxy
,
Method method
,
Object
[]
args
)
throws
Throwable
{
if
(
method
.
getName
().
equals
(
"sellComputer"
)) {
//
对于是要增强的方法进行增强
//
代理对象处理卖电脑的方法。
double
price
=
(
double
)
args
[
0
];
double
realPrice
=
price
*
0.75
;
System
.
out
.
println
(
"
代理商收到:
"
+
price
+
"
元,实际使用
"
+
realPrice
+
"
去电脑工厂买
电脑
"
);
computerFactory
.
sellComputer
(
realPrice
);
System
.
out
.
println
(
"
代理商赚到:
"
+
(
price
-
realPrice
)
+
"
元钱
"
);
return
null
;
}
else
{
//
不需要增强的方法直接调用目标对象的方法
return
method
.
invoke
(
computerFactory
,
args
);
}
}
}
4.2.5 动态代理模式小结
1.
什么是动态代理 在程序运行的过程中,动态创建出代理对象。
2.
动态代理使用到的
API Proxy
类的
newProxyInstance(ClassLoader loader, Class[] interfaces,
InvocationHandler h)
方法
InvocationHandler
接口的
invoke(Object proxy, Method method, Object[] args)
方法
3. Proxy.newProxyInstance()
方法的本质 创建了代理对象,代理对象实现了传入的接口。
4. InvocationHandler
接口的作用 调用代理对象的方法就会执行到
InvocationHandler
接口的
invoke
方法。
5.
动态代理使用步骤
1.
直接创建真实对象
2.
通过
Proxy
类,创建代理对象
3.
调用代理方法
4.
在
InvocationHandler
的
invoke
进行处理
6.
代理模式的好处 在不改变目标类的代码情况下,
代理对象
可以对
目标对象
的功能进行
增强
。