在超輕量級(jí)開源ORM系統(tǒng)EasyDBO,可以根據(jù)情況把屬性設(shè)置成延遲加載,從而大大提高應(yīng)用程序的性能。比如一個(gè)域?qū)ο笾兴ㄒ粋€(gè)order屬性,則可以像下面這樣設(shè)置:? <one-to-one name="order" type="com.easyjf.dbo.example.Order" column="orderId" key="cid" lazy="true">????????
??????? </one-to-one>
EasyDBO中的延遲加載是使用CGLIB實(shí)現(xiàn)的,下面我們來(lái)看看延遲加載的實(shí)現(xiàn)原理:
1、設(shè)計(jì)一個(gè)延遲加載器(回調(diào)),實(shí)現(xiàn)CGLIB的LazyLoader接口。
2、在第一次創(chuàng)建域?qū)ο驞OM(PO)的時(shí)候,使用CGLIB的Enhancer創(chuàng)建一個(gè)需要延遲加載的屬性對(duì)象,這其中需要使用上面的延遲加載器作為參數(shù)。
3、當(dāng)用戶在第一次訪問(wèn)到延遲加載的對(duì)象時(shí),則會(huì)調(diào)用延遲加載器中的loadObject方法來(lái)實(shí)際加載對(duì)象。
?
下面是一個(gè)非常簡(jiǎn)單例子,通過(guò)后臺(tái)可以看到:在使用new TB(),然后訪問(wèn)其cid屬性的時(shí)候,延遲加載的Bean還沒(méi)有創(chuàng)建,只有在訪問(wèn)其TB的bean屬性時(shí),才會(huì)創(chuàng)建TestBean對(duì)象,并作相應(yīng)的初始化處理工作:
?
BeanTest.java
public class BeanTest extends TestCase {
?
?public void testBean()
?{?
?TB tb=new TB();
?System.out.println(tb.getCid());
?System.out.println("--");
?System.out.println(tb.getBean().getUserName());?
?}
?
Lazy implements net.sf.cglib.proxy.LazyLoaderLazyLoader
?{
??public Object loadObject() throws Exception {
???// TODO Auto-generated method stub
???System.out.println("開始延遲加載!");
???TestBean bean=new TestBean();
???bean.setUserName("test");
???return bean;
??}
?}
?
class TB{
?private String cid;
?private TestBean bean;
?LazyLoader lazy=new Lazy();
?public TB()
?{
??cid="1245454";
??bean=(TestBean)net.sf.cglib.proxy.Enhancer.create(TestBean.class,lazy);
?}
?public TestBean getBean() {
??return bean;
?}
?public void setBean(TestBean bean) {
??this.bean = bean;
?}
?public String getCid() {
??return cid;
?}
?public void setCid(String cid) {
??this.cid = cid;
?}
?}
?
}
?
TestBean.java
public class TestBean {
?private String userName;
?private Integer sequence;
?public Integer getSequence() {
??return sequence;
?}
?public void setSequence(Integer sequence) {
??this.sequence = sequence;
?}
?public String getUserName() {
??return userName;
?}
?public void setUserName(String userName) {
??this.userName = userName;
?}
?public void test() {
??// TODO Auto-generated method stub
??
?}?
}
posted on 2006-10-20 09:35
簡(jiǎn)易java框架 閱讀(2491)
評(píng)論(1) 編輯 收藏