日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【SSM框架系列】Spring IoC(控制反转) DI(依赖注入)

發布時間:2025/5/22 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 開發的基本包坐標
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version></dependency>
  • 編寫 Dao 接口和實現類

  • 創建 Spring 核心配置文件

  • 配置 Spring 配置文件(把我們的類交給Spring去創建,并且幫我們存進Spring的容器)

<?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 ">/* * <bean> 標簽中的 id 屬性是用來標記一個Bean對象,id值要唯一* class屬性是Spring對象管理的全限定類名* scope屬性是Spring管理這個對象是單例還是多例的,不寫,默認單例*/<bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"></bean>// 等價于UserDao userDao = new UserDaoImpl()</beans>
  • scope:指對象的作用范圍,取值如下:
取值范圍說明
singleton默認值,單例的
prototype多例的
requestWEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 request 域中
sessionWEB 項目中,Spring 創建一個 Bean 的對象,將對象存入到 session 域中
global sessionWEB 項目中,應用在 Portlet 環境,如果沒有 Portlet 環境那么globalSession 相當于 session
  • 使用 Spring 的 API 獲得 Bean 實例
// 從Spring容器中獲取它幫我們創建的對象 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.save();

Bean實例化三種方式

Bean標簽:用于配置對象交由Spring 來創建。
默認情況下它調用的是類中的無參構造函數,如果沒有無參構造函數則不能創建成功。

基本屬性:
id:Bean實例在Spring容器中的唯一標識
class:Bean的全限定名稱

  • 使用無參構造方法實例化
// 它會根據默認無參構造方法來創建類對象,如果bean中沒有默認無參構造函數,將會創建失敗// Spring的Bean標簽配置方式 <bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"/> // java方式創建對象 UserDao userDao = new UserDaoImpl();
  • 工廠靜態方法實例化
public class StaticFactoryBean {public static UserDao createUserDao(){ return new UserDaoImpl();}} // 使用某個類中的靜態方法創建對象,存入Spring容器// Spring配置方式 <bean id="userDao" class="cs.wy.factory.StaticFactoryBean" factory-method="createUserDao" /> // java方式 UserDao userDao = StaticFactoryBean.createUserDao();

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的依賴注入方式

  • 構造方法:
// 創建有參構造 public class UserServiceImpl implements UserService {@Overridepublic void save() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.save();}} }// 構造方法注入 配置Spring容器調用有參構造時進行注入 <bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"/> <bean id="userService" class="cs.wy.service.impl.UserServiceImpl"><constructor-arg name="userDao" ref="userDao"/> </bean>
  • set方法
// 在UserServiceImpl中添加setUserDao方法public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao; } }// 配置Spring容器調用set方法進行注入<bean id="userDao" class="cs.wy.dao.impl.UserDaoImpl"/><bean id="userService" class="cs.wy.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"/></bean>
  • set方法:P命名空間注入
/* * P命名空間注入本質也是set方法注入,但比起上述的set方法注入更加方便,主要體現在配置文件中,如下: * 首先,需要引入P命名空間: * xmlns:p="http://www.springframework.org/schema/p" * 其次,需要修改注入方式 <bean id="userService" class="cs.wy.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>

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()方法使用

public Object getBean(String name) throws BeansException { assertBeanFactoryActive(); return getBeanFactory().getBean(name);}public <T> T getBean(Class<T> requiredType) throws BeansException {assertBeanFactoryActive();return getBeanFactory().getBean(requiredType);}

其中,當參數的數據類型是字符串時,表示根據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(依赖注入)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美综合自拍 | 国产精品无码一区二区三区免费 | 亚洲欧美在线播放 | 咪咪av| 成人欧美性 | 午夜插插 | 毛片中文字幕 | 妖精视频污 | 波多野结衣免费视频观看 | 美女露隐私网站 | 涩涩网站免费 | 瑟瑟视频免费观看 | 国内三级在线 | 亚洲视频网站在线 | 另类小说婷婷 | 中文字幕在线天堂 | 精品国产18久久久久久二百 | 一区二区毛片 | 国产精品一区无码 | 欧美精品免费播放 | 日本xx视频 | 国内黄色一级片 | 国外精品视频 | se94se欧美| 911福利视频 | 日韩一区二区不卡视频 | 手机看片福利久久 | 欧美成人免费网站 | 成人性生交大片免费看vrv66 | 99视屏 | www.超碰| 中国一级大黄大黄大色毛片 | 美女久久久 | 自拍偷自拍亚洲精品播放 | 中文字幕久久久久 | 在线色综合 | 国产精品三区在线观看 | 亚洲图片一区二区三区 | 精品一二三区 | 久久bb | 欧美 亚洲 另类 激情 另类 | 在线综合色 | 日皮在线观看 | 中文字幕av解说 | 久久久久亚洲av片无码 | 日日日人人人 | 日韩久久精品电影 | 免费在线不卡视频 | 女人性高潮视频 | 九九国产精品视频 | 我要色综合网 | 国产一级做a爱片久久毛片a | 国产精品高潮呻吟av | 国产aⅴ精品一区二区三区久久 | 天天草天天摸 | 黄色国产网站 | 狠狠撸在线观看 | 黄色网页在线 | av55 | 免费高清av在线看 | 性欧美1819性猛交 | 秋葵视频在线 | 爱爱视频一区二区 | 中文字幕av专区dvd | 亚洲+小说+欧美+激情+另类 | 无码成人精品区一级毛片 | 91精品国产高清一区二区三蜜臀 | 午夜精| 五月六月丁香 | aaa一级片 | 色综合九九 | 2021中文字幕| 在线能看的av | 中文字幕人妻互换av久久 | 国产亚洲性欧美日韩在线观看软件 | 午夜影院入口 | 日本三级韩国三级美三级91 | 国产一级二级在线观看 | 11孩岁女毛片 | 亚洲色图欧美色 | 高hnp视频 | 成年人免费高清视频 | 国产日韩不卡 | 日韩在线视频免费 | 少妇高清精品毛片在线视频 | 日韩精品极品视频 | 欧美激情免费在线 | 97久久久久 | 精品国产一级久久 | 精品人妻人人做人人爽夜夜爽 | 九七影院在线观看免费观看电视 | 国产精品无码久久久久 | 91看片免费看 | 国产乱乱 | 天天干天天爽天天操 | 国产h在线观看 | 超碰麻豆| 大尺度床戏视频 | 久久精品麻豆 | 国产黑丝91 |