Spring學習筆記--Spring簡介


1.spring:給軟件行業帶來了春天;

2.spring的理念:spring框架的初衷是使的現有的更加實用,spring不是創造輪子(技術或框架),而是使現有的輪子更好的運轉;spring本身是一個大雜燴,整合現有的框架技術;

3.Spring優點:

  輕量級框架:不具備侵入性(使用某個框架,我們不需要實現它的某個接口,方便框架的替換,原有的代碼不需要替換);

  Ioc容器:控制反轉;

  Aop:面向切面編程;

  對事務的支持;

  對礦建的支持;

  ...................

4.主要內容:

                       

從下向上看spring的主要內容:

Test:Spring支持Junit單元測試

核心容器(IOC):Bean(Bean工廠,創建對象)、Core(一切的基礎)、Context(上下文)、SpEL(Spring的表達式語言);

AOP:AOP、Aspects

對數據訪問的支持:JDBC、ORM、Transaction、JMS(java郵件服務)

對web的支持:Spring MVC

5.Ioc--inversion of control控制反轉:

首先引用一篇文章的內容,簡單了解一下DAO和Service層,Controller層、View層(http://www.jianshu.com/p/403acf6df656),另一篇文章http://www.cnblogs.com/xdp-gacl/p/4249939.html對Spring IOC設計思想的總結比較全面和通俗易懂;

1、Dao層
Dao層主要是做數據持久層的工作,負責與數據庫進行聯絡的一些任務都封裝在此,Dao層的設計首先是設計Dao的接口,然后在Spring的配置文件中定義此接口的實現類,然后就可在模塊中調用此接口來進行數據業務的處理,而不用關心此接口的具體實現類是哪個類,顯得結構非常清晰,Dao層的數據源配置,以及有關數據庫連接的參數都在Spring的配置文件中進行配置。

2、Service層
Service層主要負責業務模塊的邏輯應用設計。同樣是首先設計接口,再設計其實現的類,接着再Spring的配置文件中配置其實現的關聯。這樣我們就可以在應用中調用Service接口來進行業務處理。Service層的業務實現,具體要調用到已定義的Dao層的接口,封裝Service層的業務邏輯有利於通用的業務邏輯的獨立性和重復利用性,程序顯得非常簡潔。

3、Controller層
Controller層負責具體的業務模塊流程的控制,在此層里面要調用Service層的接口來控制業務流程,控制的配置也同樣是在Spring的配置文件里面進行,針對具體的業務流程,會有不同的控制器,我們具體的設計過程中可以將流程進行抽象歸納,設計出可以重復利用的子單元流程模塊,這樣不僅使程序結構變得清晰,也大大減少了代碼量。

4、View層 
View層與控制層結合比較緊密,需要二者結合起來協同工作。View層主要負責網頁前台的Jsp頁面的表示。

文/睡在客廳里的人(簡書作者)
原文鏈接:http://www.jianshu.com/p/403acf6df656
著作權歸作者所有,轉載請聯系作者獲得授權,並標注“簡書作者”。
View Code

鑒於上面文章中的介紹我們首先給出IOC(控制反轉)思想的代碼示例:

第一步:定義DAO接口UserDao

package cn.sxt.dao;
//降低耦合性
public interface UserDao {
    public void getUser();
}

第二步:定義DAO接口的實現類UserDaoMysqlImpl和UserDaoOracleImpl
UserDaoMysqlImpl:

package cn.sxt.dao.impl;

import cn.sxt.dao.UserDao;

public class UserDaoMySqlImpl implements UserDao {
    @Override
    public void getUser(){
        System.out.println("mysql獲取用戶數據");
    }
}

UserDaoOracleImpl:

package cn.sxt.dao.impl;

import cn.sxt.dao.UserDao;

public class UserDaoMySqlImpl implements UserDao {
    @Override
    public void getUser(){
        System.out.println("mysql獲取用戶數據");
    }
}

第三步:定義Service層接口UserService,實現具體的業務

package cn.sxt.service;

public interface UserService {
    public void getUser();
}

第四步:定義Service接口的實現類UserServiceImpl,Service層的業務實現,具體要調用到已定義的Dao層的接口

我們傳統的JavaSe設計思想,代碼是這樣組織的:我們直接在對象內部(應用程序本身)通過new進行創建對象,是程序主動去創建依賴對象

package cn.sxt.service.impl;

import cn.sxt.dao.UserDao;
import cn.sxt.service.UserService;

public class UserServiceImpl implements UserService{
    //直接依賴(耦合)
    private UserDao userDao=new UserDaoMySqlImpl();
    @Override
    public void getUser(){
        userDao.getUser();
    }
}

在我們的測試類Test(可以理解成客戶端)中

package cn.sxt.test;

import cn.sxt.dao.impl.UserDaoMySqlImpl;
import cn.sxt.dao.impl.UserDaoOracleImpl;
import cn.sxt.service.impl.UserServiceImpl;

//原來是在UserServiceImpl中創建Userdao對象(應用程序本身)
//現在是客戶端(調用端)來創建
public class Test {
    public static void main(String args[]){
    UserServiceImpl userService=new UserServiceImpl();
    userService.getUser();
}

如果需要替換DAO接口的具體實現類的時候,我們需要將UserServiceImpl中的

private UserDao userDao=new UserDaoMySqlImpl();

修改為:

private UserDao userDao=new UserDaoOracleImpl();

控制反轉(IOC)的設計思想,我們不需要應用程序本身來創建對象,而是將創建對象的任務交付給IOC容器:此時,我們在UserServiceImpl可以這樣編寫代碼

package cn.sxt.service.impl;

import cn.sxt.dao.UserDao;
import cn.sxt.service.UserService;

public class UserServiceImpl implements UserService{
    //直接依賴(耦合)
            //    private UserDao userDao=new UserDaoMySqlImpl();
    //瞬間隔離開來
    private UserDao userDao=null;  
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    @Override
    public void getUser(){
        userDao.getUser();
    }
}

添加一個set方法,當調用端需要創建對象的時候,創建具體實現類的對象,此時我們在Test類中就可以這樣組織代碼:

package cn.sxt.test;

import cn.sxt.dao.impl.UserDaoMySqlImpl;
import cn.sxt.dao.impl.UserDaoOracleImpl;
import cn.sxt.service.impl.UserServiceImpl;

//原來是在UserServiceImpl中創建Userdao對象(應用程序本身)
//現在是客戶端(調用端)來創建
public class Test {
    public static void main(String args[]){
        UserServiceImpl userService=new UserServiceImpl();
        userService.setUserDao(new UserDaoMySqlImpl());
        userService.getUser();
        System.out.println("-----分割線------");
        userService.setUserDao(new UserDaoOracleImpl());
        userService.getUser();

    }
}

Test測試類運行結果:

mysql獲取用戶數據
-----分割線------
Oracle獲取用戶數據
View Code

   通過上面的例子:

 1).對象由原來程序本身創建,變為了程序接收對象
 2).程序員主要精力集中與業務的實現
 3).實現了service和dao的解耦工作,沒有直接依賴關系,層與層之間實現了分離(service和DAO沒有關系,完全分離)
 4).如果dao的實現發生改變,應用程序本身不用改變(更改Spring的配置文件)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM