在超輕量級開源ORM系統EasyDBO,可以根據情況把屬性設置成延遲加載,從而大大提高應用程序的性能。比如一個域對象中所包括一個order屬性,則可以像下面這樣設置:? <one-to-one name="order" type="com.easyjf.dbo.example.Order" column="orderId" key="cid" lazy="true">????????
??????? </one-to-one>
EasyDBO中的延遲加載是使用CGLIB實現的,下面我們來看看延遲加載的實現原理:
1、設計一個延遲加載器(回調),實現CGLIB的LazyLoader接口。
2、在第一次創建域對象DOM(PO)的時候,使用CGLIB的Enhancer創建一個需要延遲加載的屬性對象,這其中需要使用上面的延遲加載器作為參數。
3、當用戶在第一次訪問到延遲加載的對象時,則會調用延遲加載器中的loadObject方法來實際加載對象。
?
下面是一個非常簡單例子,通過后臺可以看到:在使用new TB(),然后訪問其cid屬性的時候,延遲加載的Bean還沒有創建,只有在訪問其TB的bean屬性時,才會創建TestBean對象,并作相應的初始化處理工作:
?
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
簡易java框架 閱讀(2491)
評論(1) 編輯 收藏