上一章:[Spring+SpringMVC+Mybatis]框架學習筆記:前言_目錄 下一章:[Spring+SpringMVC+Mybatis]框架學習筆記(二):Spring-IOC-DIhtml
Spring是一個輕量級的控制反轉(IOC)和麪向切面(AOP)的容器框架。java
IOC(inversion of controller)是一種概念,是把咱們程序中的類與類之間的依賴關係交給容器去處理,通常有兩種方式(面試):web
Spring的控制反轉就是經過依賴注入來實現。面試
依賴:簡單的說,一個類實現某個功能須要依靠另一個類的幫助。spring
當一個方法有多種實現的狀況下,咱們通常是基於接口的方式進行編程。數據庫
簡單模擬用戶登陸的功能,這裏省略後臺數據庫鏈接部分。編程
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是一種編譯性語言,維護時直接改編碼,須要再次編譯才能上線使用,這樣就增大了維護的工做難度和工做量。 ----> 而更改配置文件就不須要從新編譯!
依賴注入DI是指一個對象須要另一個對象時,無需在代碼中建立所需求對象,而是依賴於外部容器,由外部容器建立後傳遞給程序。
依賴注入是目前爲止最好的解耦方式,由於依賴關係是依靠配置文件的方式組織在一塊兒,而不是在程序中的硬編碼。
Spring的IOC容器經過依賴注入來實現程序之間的依賴關係,達到解耦的做用。
老項目:3.2版本;新項目:4.2版本
1)Spring項目環境搭建依賴的jar包
java工程jar包放在項目根目錄的libs文件夾下;web工程jar包放在WebContent/WEB-INF/libs文件夾下。
再加上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