[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 回顧:基於接口編程的開發方式

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

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

ZOBCWV.png

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文件夾下。

ZOBeoR.png

ZOBAL4.png

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

hamcrest-core-1.3.jar和junit-4.11.jar

再加上日誌包:

junit-4.11.jar和log4j-1.2.17.jar

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

原文出處:https://www.cnblogs.com/steven0325/p/11151541.html

相關文章
相關標籤/搜索