富客戶端程序設計實例 - Bean(DAO+Service層) - Spring 為什么要對 Bean 進行托管?

Yangcl 11年前發布 | 7K 次閱讀 Jackson gp|Easy CMS WP7 viewport Evince


        換句話就是Spring進行依賴注入的好處是什么。以BaseService、EmployeeServiceImplEmployeeAction
這三個類為例,部分代碼如下所示:

</div> </div>

  1. public interface BaseService  
  2. {   
  3.     public <T> List<T> find(Class<T> cla);   
  4.       
  5.     public <T> void saveOrUpdate(List<T> list);  
  6.    
  7.     public <T> void delete(List<T> list);  
  8.   
  9.     public <T> void saveInfo(List<T> list);  
  10.   
  11.     public <T> void updateInfo(List<T> list);  
  12. }  
  13. ===========================================================  
  14. @Service  
  15. public class EmployeeServiceImpl implements BaseService  
  16. {  
  17.     private BaseDao employeeDao;  
  18.   
  19.     public BaseDao getBaseDao()  
  20.     {  
  21.         return employeeDao;  
  22.     }  
  23.     @Resource  
  24.     public void setBaseDao(BaseDao employeeDao)  
  25.     {  
  26.         this.employeeDao = employeeDao;  
  27.     }  
  28.   
  29.   
  30.     public <T> List<T> find(Class<T> cla)  
  31.     {  
  32.         return employeeDao.find(cla);  
  33.     }  
  34.   
  35.     public <T> void saveOrUpdate(List<T> list)  
  36.     {  
  37.         employeeDao.saveOrUpdate(list);  
  38.     }  
  39.   
  40.     public <T> void delete(List<T> list)  
  41.     {  
  42.          employeeDao.delete(list);  
  43.     }  
  44.   
  45.     public <T> void saveInfo(List<T> list)  
  46.     {  
  47.          employeeDao.saveInfo(list);  
  48.     }  
  49.   
  50.     public <T> void updateInfo(List<T> list)  
  51.     {  
  52.           employeeDao.updateInfo(list);  
  53.     }  
  54. }  
  55.   
  56. ================================================================  
  57. public class EmployeeAction extends BaseAction  
  58. {  
  59.     private Logger log = LoggerFactory.getLogger(Employee.class);    
  60.    
  61.     public void read()  
  62.     {  
  63.         String jsonStr = ajaxJson(service.find(Employee.class));  
  64.     }  
  65.    
  66.     public void add()  
  67.     {  
  68.         System.out.println("add() begain |");   
  69.         String jsonStr = getJsonFromRequest();  
  70.         List<Employee> empList = new ArrayList<Employee>();   
  71.         empList.add(getObjectFromJson(jsonStr, Employee.class));   
  72.         service.saveInfo(empList);   
  73.     }  
  74.    
  75.     public void update()  
  76.     {  
  77.         System.out.println("update() begain |");  
  78.         String jsonStr = getJsonFromRequest();  
  79.         List<Employee> empList = new ArrayList<Employee>();  
  80.         empList.add(getObjectFromJson(jsonStr, Employee.class));   
  81.         service.updateInfo(empList);   
  82.     }  
  83.    
  84.     public void destroy()  
  85.     {  
  86.         String jsonStr = getJsonFromRequest();  
  87.         List<Employee> empList = getListFromJson(jsonStr, Employee.class);  
  88.         service.delete(empList);    
  89.     }    
  90. }  
  91. </ol> </div>

            可以看到,在Action層的這個類( EmployeeAction繼承了BaseAction EmployeesAction是被間接托管 )里面,我們并沒有看到EmployeeServiceImpl的身影,也就是說我們并不關心這個實現類是誰,我們通過BaseService這個接口去引用注入進來的對象,在通過接口調用它的方法;這是設計模式中典型的簡單工廠模式。這樣Action層的組件和服務層的組件就徹底的解耦了。同樣的道理,服務層和DAO層也是這樣解耦的。


           這種解耦方式和你使用 new 關鍵字的區別

           如果項目很大,Action很多,而且大部分Action都用到了EmployeeServiceImpl 這個服務層的類,你用new這種方法進行創建那么每個Action里都會耦合到“EmployeeServiceImpl”。現在需求有變,用其他的服務類了,比如:ManagerServiceImpl.java。你怎么更改這些new的對象?一個Action中的代碼幾百行,你怎么去找到?精力上的消耗會非常大。但是用Spring對Bean進行托管的方式則會簡單的多。假設:ManagerServiceImpl.java 和 EmployeeServiceImpl.java 一樣,他們都繼承自BaseService.java。如果我現在要替換一個類,只需要更改為需要的類就可以了,一般只需要改一次即可。


    如果你用配置文件的方式托管Bean,則:

    <bean id="managerAction" class="org.hongbo.Yangcl.action.ManagerAction">     

                <property name="BaseService" ref="BaseService"></property>     

    </bean> 

    如果你使用注解的方式托管Bean,則:直接刪除掉EmployeeServiceImpl類上的@Service標記即可,在 ManagerServiceImpl 上加上@Service標記

    個人推薦使用注解的方式,因為配置文件的方式還是比較紛亂。



 本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!