1. 程式人生 > 其它 >7.泛型的依賴注入

7.泛型的依賴注入

示例:
1.bean層:
    1.1
        public class Book {}-------->模擬的兩個實體類中沒有具體屬性
    1.2
       public class User {} 
2.service層
    2.1Book的service類:
        @Service---------------->加入了service標籤
        public class BookService extends BaseService<Book>{
        }   
    2.2User的service類:
        @Service---------------->加入了service標籤
        public class UserService extends BaseService<User>{-------------->兩個均沒有自己的獨有方法,因為集成了BaseService類
        }
    2.3BaseService
        public class BaseService<T> {---------->注意1:該類沒有註解   注意2:該類有泛型
            @Autowired----------------------->自動注入的註解
            private BaseDao<T> baseDao;
            public void service(){
                baseDao.save();
            }
        }
3.dao層
    3.1抽象出基本的dao層方法
        public abstract class BaseDao<T> {--------->注意1:該類沒有註解   注意2:該類有泛型
            public abstract void save();----------->定義了抽象方法:供其他類重寫
        }
    3.2book的dao層方法
        @Repository----------------------------->加入標籤,將元件載入到容器中
        public class BookDao extends BaseDao<Book>{----------->加入book的泛型
            public void save() {------------------------------>重寫父類方法
                System.out.println("book的儲存方法!");
            }
        }
    3.3user的dao層方法
        @Repository----------------------------->加入標籤,將元件載入到容器中
        public class UserDao extends BaseDao<User>{----------->加入user的泛型
            public void save() {------------------------------>重寫父類方法
                System.out.println("使用者的儲存方法!");
            }
        }
        
3.測試程式碼:使用的是springtest的測試
    @ContextConfiguration(locations = "classpath:ioc.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    public class Test {
        @Autowired
        BookService bookService;
        @Autowired
        UserService userService;
        @org.junit.Test
        public void test(){
            bookService.service();--->輸出:book的儲存方法!
            userService.service();--->輸出:使用者的儲存方法!
        }
    }


結論:
1.service層的繼承研究
    父類service:
        public class BaseService<T> {----->類上並沒有註解,即這個父類不會被載入到容器中
            @Autowired--------------->但是帶有@Autowired標籤,按照之前的結論:當一個類有@Autowired自動注入時,這個類必須是容器中的元件:
                                ----->不然:1.無法從容器中獲取該元件 2.無法自動注入                                                        
            private BaseDao<T> baseDao;
            public void service(){
                System.out.println("自動注入dao:"+baseDao+" 當前物件:"+this);
                baseDao.save();
            }
        }
    子類service:
        @Service------------>有標籤,所以子類在容器中,並且繼承BaseService類,繼承父類的所有屬性和方法(雖然父類的屬性是私有屬性,按照常規無法繼承,
                ------------>實質是可以繼承,只是無法使用)
        public class BookService extends BaseService<Book>{
        }
    則真實子類為:
        @Service
        public class BookService extends BaseService<Book>{
            @Autowired
            private BaseDao<T> baseDao;
            public void service(){
                System.out.println("自動注入dao:"+baseDao+" 當前物件:"+this);
                baseDao.save();
            }
        }
        這時:@Autowired標籤的類在元件中,可以自動裝配