wmcoo
岁月神偷
:: :: :: :: ::
管理
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
文章分类
(22)
Hibernate(4)
J2EE(3)
Java(1)
JavaScript
MySQL
Spring(13)
SQLServer(1)
Struts
WebService
搜索
最新评论
1. re: Spring 声明式事务,propagation属性列表
可以对一些专业名词在做具体分析,就完美啦
--野狼
2. re: Spring 在配置中使用*.properties
王二伟
--儿
3. dsad
fdsfa
--fdsaf
4. re: Spring MVC 的请求参数获取
评论内容较长,点击标题查看
--zuidaima
5. re: Spring MVC 拦截器
评论内容较长,点击标题查看
--legend
CGLIB应用
CGLIB被Spring AOP做为底层的一种实现。采用asm,动态生成字节码,比jdk proxy效率高,hibernate使用cglib动态生成DO/PO (接口层对象)字节码.
cglib依赖包
asm
http://forge.ow2.org/projects/asm/
cglib
http://cglib.sourceforge.net
/
CglibProxy.java
package
com.java.demo.mode.proxy.cglib;
import
java.lang.reflect.Method;
import
com.java.demo.mode.builder.Builder;
import
com.java.demo.mode.builder.IMadeRobot;
import
com.java.demo.mode.builder.MadeRobot;
import
net.sf.cglib.proxy.MethodInterceptor;
import
net.sf.cglib.proxy.MethodProxy;
public
class
CglibProxy
implements
MethodInterceptor {
@Override
public
Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy)
throws
Throwable {
doBefore();
Object ob
=
proxy.invokeSuper(obj, args);
doAfter();
return
ob;
}
private
void
doBefore() {
System.out.println(
"
开始制造机器人.
"
);
IMadeRobot imr
=
new
MadeRobot();
Builder builder
=
new
Builder(imr);
builder.build();
imr.finish();
}
private
void
doAfter() {
System.out.println(
"
完成机器人制造.\n
"
);
}
}
RobotFactory.java
package
com.java.demo.mode.proxy.cglib;
import
com.java.demo.data.Product;
public
class
RobotFactory{
public
Product getRobot(String className){
Product robot
=
null
;
try
{
robot
=
(Product)(Class.forName(className).newInstance());
}
catch
(ClassNotFoundException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(InstantiationException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IllegalAccessException e) {
//
TODO Auto-generated catch block
e.printStackTrace();
}
return
robot;
}
}
CglibFilter.java
package
com.java.demo.mode.proxy.cglib;
import
java.lang.reflect.Method;
import
net.sf.cglib.proxy.CallbackFilter;
public
class
CglibFilter
implements
CallbackFilter {
private
final
static
int
YES
=
1
;
//
不执行代理
private
final
static
int
NO
=
0
;
//
执行代理
@Override
public
int
accept(Method arg0) {
//
TODO Auto-generated method stub
//
对所调用的方法名进行过滤
return
YES;
}
}
Demo.java
package
com.java.demo.mode.proxy.cglib;
import
net.sf.cglib.proxy.Callback;
import
net.sf.cglib.proxy.Enhancer;
import
net.sf.cglib.proxy.NoOp;
import
com.java.demo.data.Product;
public
class
Demo {
/**
*
@param
args
*/
public
static
void
main(String[] args) {
//
cglib中的NoOp.INSTANCE就是一个空的拦截器
//
setCallbacks中的拦截器(interceptor)的顺序,一定要和CallbackFilter里面指定的顺序一致!!切忌。
Enhancer enhancer
=
new
Enhancer();
enhancer.setSuperclass(RobotFactory.
class
);
enhancer.setCallbacks(
new
Callback[]{
new
CglibProxy(), NoOp.INSTANCE});
enhancer.setCallbackFilter(
new
CglibFilter());
RobotFactory factory
=
(RobotFactory) enhancer.create();
Product robot
=
factory.getRobot(
"
com.java.demo.data.robot.RobotA
"
);
robot.desc();
}
}
posted on 2010-09-29 10:55
岁月神偷
阅读(433)
评论(0)
编辑
收藏
所属分类:
J2EE
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
软件工程之开发流程
maven
CGLIB应用