[Spring+SpringMVC+Mybatis]框架學習筆記(一):SpringIOC概述

上一章:[Spring+SpringMVC+Mybatis]框架學習筆記:前言_目錄
下一章:[Spring+SpringMVC+Mybatis]框架學習筆記(二):Spring-IOC-DIhtml

第1章 SpringIOC概述

Spring是一個輕量級的控制反轉(IOC)和麪向切面(AOP)的容器框架。java

1.1 控制反轉IOC

IOC(inversion of controller)是一種概念,是把咱們程序中的類與類之間的依賴關係交給容器去處理,通常有兩種方式(面試):web

  • 依賴查找DL(dependency lookup):程序提供查找方式,交給容器去查找(至關於se中的回調函數);
  • 依賴注入DI(dependency injection):程序不提供查找方式,提供合適的構造方法或者set方法,讓容器進行注入來解決依賴關係。

Spring的控制反轉就是經過依賴注入來實現。面試

1.2 依賴

依賴:簡單的說,一個類實現某個功能須要依靠另一個類的幫助。spring

1.3 回顧:基於接口編程的開發方式

當一個方法有多種實現的狀況下,咱們通常是基於接口的方式進行編程。數據庫

簡單模擬用戶登陸的功能,這裏省略後臺數據庫鏈接部分。編程

1)DAO層app

接口IUserDao:框架

package com.steven.spring.sysmanage.dao;
/**
 * 用於登陸驗證的DAO的接口
 * @author Administrator
 *
 */
public interface IUserDao{
    public boolean loginUser(String userName, String password);
}
//接口實現的兩種方式:UserDaoImplJdbc.java和UserDaoImplOther.java
package com.steven.spring.sysmanage.dao.impl;

import com.steven.spring.sysmanage.dao.IUserDao;

public class UserDaoImplJdbc implements IUserDao {
    public boolean loginUser(String userName, String password) {
        System.out.println("這是經過JDBC進行登陸驗證的DAO方法");
        return true;
    }

}

package com.steven.spring.sysmanage.dao.impl;

import com.steven.spring.sysmanage.dao.IUserDao;

public class UserDaoImplOther implements IUserDao {
    public boolean loginUser(String userName, String password) {
        System.out.println("這是經過其它方式進行登陸驗證的DAO方法");
        return true;
    }

}

2) 服務層函數

package com.steven.spring.sysmanage.service;

import com.steven.spring.sysmanage.dao.IUserDao;

/**
 * 用於用戶登陸、增刪改查的服務類
 * @author Administrator
 *
 */
public class UserService {
    boolean flag = false;
    
    IUserDao userDao;
    
    public UserService(){
        
    }
    
    //方式1:經過構造器的方式
    public UserService(IUserDao userDao){
        this.userDao = userDao;
    }

    //方式2:經過set方式,這種方式更靈活
    public void setUserDao(IUserDao userDao) {
        this.userDao = userDao;
    }
    
    /**
     * 經過調用與數據庫交互的UserDao裏面的loginUser方法,判斷是否驗證成功
     * @param userName
     * @param password
     * @return
     */
    public boolean loginUser(String userName, String password){
        flag = userDao.loginUser(userName, password);
        return flag;
    }
    
}

3)測試類

package com.steven.spring.sysmgr.action;

import org.junit.Test;

import com.steven.spring.sysmgr.dao.impl.UserDaoImplJdbc;
import com.steven.spring.sysmgr.service.UserService;

public class LoginTest {
    @Test
    public void loginUsingJava(){
        //方式1:使用構造方法
//      UserService userService = new UserService(new UserDaoImplOther());
        
        //方式2:使用set方法
        UserService userService = new UserService();
        userService.setUserDao(new UserDaoImplJdbc());
        
        userService.loginUser("abc", "123");
        
    }
}

因爲Java是一種編譯性語言,維護時直接改編碼,須要再次編譯才能上線使用,這樣就增大了維護的工做難度和工做量。 ----> 而更改配置文件就不須要從新編譯!

1.4 依賴注入

依賴注入DI是指一個對象須要另一個對象時,無需在代碼中建立所需求對象,而是依賴於外部容器,由外部容器建立後傳遞給程序。

依賴注入是目前爲止最好的解耦方式,由於依賴關係是依靠配置文件的方式組織在一塊兒,而不是在程序中的硬編碼。

1.5 Spring的IOC

Spring的IOC容器經過依賴注入來實現程序之間的依賴關係,達到解耦的做用。

老項目:3.2版本;新項目:4.2版本

1)Spring項目環境搭建依賴的jar包

java工程jar包放在項目根目錄的libs文件夾下;web工程jar包放在WebContent/WEB-INF/libs文件夾下。

再加上junit的jar包:(注意junit4.10之後是拆分了兩個包)

再加上日誌包:

2)配置文件applicationContext.xml,加上bean約束

在spring-framework-4.2.1.RELEASE\docs\spring-framework-reference\html下有xsd-configuration.html文件中有初始配置。

IOC的實現原理:反射

無反射無框架,無代理無框架

在上面例子的基礎上,增長spring配置xml文件,更改實現層。

1)spring配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!-- 至關於Java代碼中的 IUserDao userDaoImplJdbc = new UseDaoImplJdbc() -->
    <bean id="userDaoImplJdbc" class="com.steven.spring.sysmanage.dao.impl.UserDaoImplJdbc"></bean>
    
    <bean id="userDaoImplOther" class="com.steven.spring.sysmanage.dao.impl.UserDaoImplOther"></bean>
    
    <bean id="userService" class="com.steven.spring.sysmanage.service.UserService">
        <!-- 方式1:經過構造方法的方式注入 -->
        <constructor-arg ref="userDaoImplOther"></constructor-arg>
        
        <!-- 方式2:經過set方法的方式注入,注意這裏的的name的值需與set方法名後面的部分保持一致,且首字母小寫-->  
        <property name="userDao" ref="userDaoImplOther"/>
    </bean>
    
</beans>

2)更改測試類

package com.steven.spring.sysmgr.action;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.steven.spring.sysmgr.dao.impl.UserDaoImplJdbc;
import com.steven.spring.sysmgr.service.UserService;

public class LoginTest {    
    @Test
    public void loginUsinSpring(){
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService)ac.getBean("userService");
        userService.loginUser("abc", "123");
    }
}

上一章:[Spring+SpringMVC+Mybatis]框架學習筆記:前言_目錄
下一章:[Spring+SpringMVC+Mybatis]框架學習筆記(二):Spring-IOC-DI

相關文章
相關標籤/搜索