javascript
【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)
Spring是什么
-
Spring是分層的 Java SE/EE應用 full-stack 輕量級開源框架,以 IoC(Inverse Of Control:反轉控制)和 AOP(Aspect Oriented Programming:面向切面編程)為內核。
-
提供了展現層 SpringMVC和持久層 Spring JDBCTemplate以及業務層事務管理等眾多的企業級應用技術,還能整合開源世界眾多著名的第三方框架和類庫,逐漸成為使用最多的Java EE 企業應用開源框架
IoC(Inverse of Control)控制反轉
- 控制是什么?
- 控制是bean對象
- 反轉是是什么?
- 反轉的是bean對象的獲取方式以及對象之間的依賴關系,之前我們要什么對象,就new什么對象,我們自己new
- 現在,我們要什么對象,管Spring去要,創建的過程交給Spring,我們把創建對象的權力做了反轉
- 原來都是我們自己new,現在有Spring去創建,Bean對象之間的依賴關系也做了反轉
Spring的優勢
1)方便解耦,簡化開發通過 Spring 提供的 IoC容器,可以將對象間的依賴關系交由 Spring 進行控制,避免硬編碼所造成的過度耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應用。 2)AOP 編程的支持通過 Spring的 AOP 功能,方便進行面向切面編程,許多不容易用傳統 OOP 實現的功能可以通過 AOP 輕松實現。3)聲明式事務的支持可以將我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務管理,提高開發效率和質量。4)方便程序的測試可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是隨手可做的事情。 5)方便集成各種優秀框架Spring對各種優秀框架(Struts、Hibernate、Hessian、Quartz等)的支持。6)降低 JavaEE API 的使用難度Spring對 JavaEE API(如 JDBC、JavaMail、遠程調用等)進行了薄薄的封裝層,使這些 API 的使用難度大為降低。7)Java 源碼是經典學習范例Spring的源代碼設計精妙、結構清晰、匠心獨用,處處體現著大師對Java 設計模式靈活運用以及對 Java技術的高深造詣。它的源代碼無意是 Java 技術的最佳實踐的范例。Spring的體系結構
spring基本入門
- 首先導入 Spring 開發的基本包坐標
-
編寫 Dao 接口和實現類
-
創建 Spring 核心配置文件
-
配置 Spring 配置文件(把我們的類交給Spring去創建,并且幫我們存進Spring的容器)
- scope:指對象的作用范圍,取值如下:
| singleton | 默認值,單例的 |
| prototype | 多例的 |
| request | WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中 |
| session | WEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中 |
| global session | WEB 項目中,應用在 Portlet 環境,如果沒有 Portlet 環境那么globalSession 相當于 session |
- 使用 Spring 的 API 獲得 Bean 實例
Bean實例化三種方式
Bean標簽:用于配置對象交由Spring 來創建。
默認情況下它調用的是類中的無參構造函數,如果沒有無參構造函數則不能創建成功。
基本屬性:
id:Bean實例在Spring容器中的唯一標識
class:Bean的全限定名稱
- 使用無參構造方法實例化
- 工廠靜態方法實例化
3) 工廠實例方法實例化
public class DynamicFactoryBean { public UserDao createUserDao(){ return new UserDaoImpl(); }} // 使用工廠中的普通方法創建對象 // java方式 DynamicFactoryBean factoryBean = new DynamicFactoryBean(); UserDao userDao = factoryBean.createUserDao();// Spring 配置方式<bean id="factoryBean" class="cs.wy.factory.DynamicFactoryBean"/><bean id="userDao" factory-bean="factoryBean" factory-method="createUserDao"/>Bean的依賴注入
-
依賴注入(Dependency Injection):它是 Spring 框架核心 IOC 的具體實現。
-
在編寫程序時,通過控制反轉,把對象的創建交給了 Spring,但是代碼中不可能出現沒有依賴的情況。
-
IOC 解耦只是降低他們的依賴關系,但不會消除。例如:業務層仍會調用持久層的方法。
-
那這種業務層和持久層的依賴關系,在使用 Spring 之后,就讓 Spring 來維護了。
-
簡單的說,就是坐等框架把持久層對象傳入業務層,而不用我們自己去獲取
Bean的依賴注入方式
- 構造方法:
- set方法
- set方法:P命名空間注入
Bean的依賴注入的數據類型
上面的操作,都是注入的引用Bean,處了對象的引用可以注入,普通數據類型,集合等都可以在容器中進行注入。
注入數據的三種數據類型
-
普通數據類型
-
引用數據類型
-
集合數據類型
其中引用數據類型,此處就不再贅述了,之前的操作都是對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("UserDao save method running...."); }}<bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"><property name="name" value="趙麗穎"></property><property name="age" value="18"></property></bean>(2)集合數據類型(List< String >)的注入
public class UserDaoImpl implements UserDao {private List<String> strList;public void setStrList(List<String> strList) {this.strList = strList;}public void save() {System.out.println(strList);System.out.println("UserDao save method running....");}}<bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"><property name="strList"><list><value>aaa</value><value>bbb</value><value>ccc</value></list></property></bean>(3)集合數據類型(List< User >)的注入
public class UserDaoImpl implements UserDao {private List<User> userList;public void setUserList(List<User> userList) {this.userList = userList; }public void save() {System.out.println(userList);System.out.println("UserDao save method running....");}}<bean id="u1" class="cs.wy.domain.User"/><bean id="u2" class="cs.wy.domain.User"/><bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"><property name="userList"><list><bean class="cs.wy.domain.User"/><bean class="cs.wy.domain.User"/><ref bean="u1"/><ref bean="u2"/> </list></property></bean>(4)集合數據類型( Map<String,User> )的注入
public class UserDaoImpl implements UserDao {private Map<String,User> userMap;public void setUserMap(Map<String, User> userMap) {this.userMap = userMap;} public void save() { System.out.println(userMap);System.out.println("UserDao save method running....");}}<bean id="u1" class="cs.wy.domain.User"/><bean id="u2" class="cs.wy.domain.User"/><bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"><property name="userMap"><map> <entry key="user1" value-ref="u1"/><entry key="user2" value-ref="u2"/></map></property></bean>(5)集合數據類型(Properties)的注入
public class UserDaoImpl implements UserDao {private Properties properties;public void setProperties(Properties properties) {this.properties = properties;}public void save() {System.out.println(properties);System.out.println("UserDao save method running....");}}<bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"><property name="properties"><props><prop key="p1">aaa</prop><prop key="p2">bbb</prop> <prop key="p3">ccc</prop></props></property></bean>引入其他配置文件(分模塊開發)
實際開發中,Spring的配置內容非常多,這就導致Spring配置很繁雜且體積很大,所以,可以將部分配置拆解到其他配置文件中,而在Spring主配置文件通過import標簽進行加載
<import resource="applicationContext-xxx.xml"/>spring相關API
- ApplicationContext的繼承體系
applicationContext:接口類型,代表應用上下文,可以通過其實例獲得 Spring 容器中的 Bean 對象
-
ApplicationContext的實現類
-
ClassPathXmlApplicationContext :它是從類的根路徑下加載配置文件 推薦使用這種
-
FileSystemXmlApplicationContext :它是從磁盤路徑上加載配置文件,配置文件可以在磁盤的任意位置。
-
AnnotationConfigApplicationContext: 當使用注解配置容器對象時,需要使用此類來創建 spring 容器。它用來讀取注解。
-
-
getBean()方法使用
其中,當參數的數據類型是字符串時,表示根據Bean的id從容器中獲得Bean實例,返回是Object,需要強轉。
當參數的數據類型是Class類型時,表示根據類型從容器中匹配Bean實例,當容器中相同類型的Bean有多個時,則此方法會報錯
getBean()方法使用
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService1 = (UserService) applicationContext.getBean("userService"); UserService userService2 = applicationContext.getBean(UserService.class);總結
以上是生活随笔為你收集整理的【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大屏数据可视化
- 下一篇: 【SSM框架系列】Spring IoC(