您好,登錄后才能下訂單哦!
如何理解Java Spring框架與Spring IOC,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
學習目標
【應用】能夠獨立完成springIOC的快速入門
【應用】能夠掌握spring的bean標簽的配置
【應用】能夠獨立完成bean的對象屬性注入
【應用】能夠獨立完成bean的普通屬性注入
【理解】能夠獨立完成bean的集合屬性注入
Spring是分層的 Java SE/EE應用 full-stack 輕量級開源框架,以 IoC(Inverse Of Control:反轉控制)和AOP(Aspect Oriented Programming:面向切面編程)為內核。
提供了表現層 SpringMVC和持久層 Spring JDBCTemplate以及業務層事務管理等眾多的企業級應用技術,還能整合開源世界眾多著名的第三方框架和類庫,逐漸成為使用最多的Java EE 企業應用開源框架。
1997 年, IBM提出了EJB 的思想
1998 年,SUN制定開發標準規范 EJB1.0
1999 年,EJB1.1 發布
2001 年,EJB2.0 發布
2003 年,EJB2.1 發布
2006 年,EJB3.0 發布
Rod Johnson 羅賓·約翰遜( Spring 之父)
Expert One-to-One J2EE Design and Development(2002) 闡述了 J2EE 使用EJB 開發設計的優點及解決方案
Expert One-to-One J2EE Development without EJB(2004) 闡述了 J2EE 開發不使用 EJB的解決方式(Spring 雛
形)
2021 年 7 月份發布了 Spring 的最新版本 Spring 5.3.9 通用版(正式發布的版本)
Spring 就是一個大工廠(IoC容器),可以將所有對象的創建和依賴關系的維護工作都交給 Spring 容器管理,大大地降低了組件之間的耦合性。
通過 Spring的 AOP 功能,方便進行面向切面編程,許多不容易用傳統 OOP 實現的功能可以通過 AOP 輕松實現。
如 實現對程序進行權限攔截、運行監控等功能
可以將我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務管理,提高開發效率和質量。
Spring對Junit4支持,可以通過注解方便的測試Spring程序,測試不再是昂貴的操作,而是隨手可做的事情。
Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持。
Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低。
Spring的源代碼設計精妙、結構清晰、匠心獨用,處處體現著大師對Java 設計模式靈活運用以及對 Java技術的高深造詣。它的源代碼無意是 Java 技術的最佳實踐的范例。
IoC:控制反轉(Inversion Of Control) ,就是應用本身不負責依賴對象的創建及維護,依賴對象的創建及維護是由外部容器負責的。這樣控制權就由應用轉移到了外部容器,控制權的轉移就是所謂反轉。
簡單理解:把對象的創建、初始化、銷毀等工作交給spring容器來做。由spring容器控制對象的生命周期。
明確 IoC的作用:削減計算機程序的耦合(解除我們代碼中的依賴關系)。
原來:我們在獲取對象時,都是采用 new 的方式。 是主動的。
現在:我們獲取對象時,跟spring容器要,有spring為我們查找或者創建對象。 是被動的。
①導入 Spring 開發的基本包坐標
②編寫 Dao 接口和實現類
③創建 Spring 核心配置文件
④在 Spring 配置文件中配置 UserDaoImpl
⑤使用 Spring 的 API 獲得 Bean 實例
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring‐context</artifactId> <version>5.2.8.RELEASE</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
package com.summer.dao; public interface UserDao { public void save(); } package com.summer.dao.impl; import com.summer.dao.UserDao; public class UserDaoImpl implements UserDao { public void save() { System.out.println("用戶添加~~~~~"); } }
在類路徑 classpath 下(resources)創建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"> </beans>
<?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"> <!‐‐ 實現IoC將對象的創建 交給spring容器 UserDao userDao = new UserDaoImpl(); ‐‐> <bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean> </beans>
public class TestIoC{ public static void main(String[] args) { // 創建spring容器實例 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //從容器中獲取 bean 根據 唯一標識id獲取 UserDao userDao = (UserDao) context.getBean("userDao"); userDao.save(); } }
在類路徑下尋找配置文件來實例化容器
Spring快速入門代碼鞏固練習
練習下通過springIoC的 XML配置方式來進行對象的實例化
\1. 導入坐標
\2. 創建Bean
\3. 創建配置文件applicationContext.xml
\4. 在配置文件中進行配置
\5. 創建ApplicationContext對象getBean
① 編寫Dao,Service接口和實現類
public interface UserDao { public void save(); } public class UserDaoImpl implements UserDao { public void save() { System.out.println("用戶添加~~~~~"); } } public interface UserService { public void save(); } public class UserServiceImpl implements UserService { public void save() { //TODO } }
②將UserDaoImpl 、 UserServiceImpl 的創建權交給 Spring
< !‐‐ spring IoC 將對象的創建權交給spring‐‐> <bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.bailiban.service.impl.UserServiceImpl"></bean>
UserService 內部再調用 UserDao的save() 方法
public class UserServiceImpl implements UserService { public void save() { //創建spring容器實例 ApplicationContext context = new ClassPathXmlApplicationContext(); //根據id獲取dao對象 UserDao userDao = (UserDao) context.getBean("userDao"); //調用方法 userDao.save(); } }
③從 Spring 容器中獲得 UserService 進行操作
public class TestDI { //測試 DI快速入門 @Test public void test1() { //創建spring容器實例 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //根據id獲取dao對象 UserService userService = (UserService) context.getBean("userService"); //調用方法 userService.save(); } }
目前UserService實例和UserDao實例都存在與Spring容器中,當前的做法是在容器外部獲得UserService實例和UserDao實例,然后在程序中進行結合。
因為UserService和UserDao都在Spring容器中,而最終程序直接使用的是UserService,所以可以在Spring容器中,將UserDao設置到UserService內部。
DI : Dependency Injection 依賴注入 , 需要有 IoC的環境,Spring 創建對象的過程中,Spring 將對象依賴的屬性注入到對象。
在編寫程序時,通過控制反轉,把對象的創建交給了 Spring,但是代碼中不可能出現沒有依賴的情況。
IoC解耦只是降低他們的依賴關系,但不會消除。例如:業務層仍會調用持久層的方法。
那這種業務層和持久層的依賴關系,在使用 Spring 之后,就讓 Spring 來維護了。
簡單的說,就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取。
怎么將UserDao怎樣注入到UserService內部呢?
在UserServiceImpl中添加setUserDao方法
public class UserServiceImpl implements UserService { // 定義dao成員變量 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void save() { // //創建spring容器實例 // ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // //根據id獲取dao對象 // UserDao userDao = (UserDao) context.getBean("userDao"); // //調用方法 userDao.save(); } }
配置Spring容器調用set方法進行注入
<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"></bean> <bean id="userService" class="com.bailiban.service.impl.UserServiceImpl"> <!‐‐使用set方法注入 name: set方法去掉set后 首字母小寫 ‐‐> <property name="userDao" ref="userDao"></property> </bean>
set方法:P命名空間注入
P命名空間注入本質也是set方法注入,但比起上述的set方法注入更加方便,主要體現在配置文件中,如下:
首先,需要引入P命名空間:
xmlns:p="http://www.springframework.org/schema/p"
其次,需要修改注入方式
<bean id="userService" class="com.bailiban.service.impl.UserServiceImpl" p:userDao‐ ref="userDao">
上面的操作,都是注入的引用Bean,除了對象的引用可以注入,普通數據類型 等都可以在容器中進行注入。
注入數據的二種數據類型
1.普通數據類型
2.引用數據類型
其中引用數據類型,此處就不再贅述了,之前的操作都是對UserDao對象的引用進行注入的,下面將以set方法注入為例,演示普通數據類型的注入。
Bean的依賴注入的數據類型
(1)普通數據類型的注入
練習:
public class UserDaoImpl implements UserDao { //普通數據類型的注入 private String name; private int age; public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void save() { System.out.println(name+"‐‐‐"+age); System.out.println("用戶添加~~~~~"); } }
<bean id="userDao" class="com.bailiban.dao.impl.UserDaoImpl"> <!‐‐ 普通數據的注入 ‐‐> <property name="name" value="旺財"></property> <property name="age" value="18"></property> </bean>
看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。