亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring?IOC推導與DI構造器注入的方法是什么

發布時間:2023-02-25 10:22:27 來源:億速云 閱讀:124 作者:iii 欄目:開發技術

這篇文章主要講解了“Spring IOC推導與DI構造器注入的方法是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Spring IOC推導與DI構造器注入的方法是什么”吧!

了解準備

什么是Spring?

Spring是一款輕量級的控制反轉(IOC)和面向切面編程(AOP)的非入侵式開源框架

  • 2002年Spring的前身interface21發布,隨后在2004年3月24日正式更名發布Spring1.0版本

  • Spring Frameword締造者 Rod Johnson,悉尼大學音樂學博士生

Spring框架主要由七部分組成,分別是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC

Spring三大核心:IOC控制反轉、DI依賴注入、AOP面向切面編程

Spring整合了現有的技術框架,使這些技術更加易于使用

maven依賴:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.3.18</version>
</dependency>

整合MyBatis時導入

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.23</version>
</dependency>

IOC思想

引入IOC

準備Dao層接口和一堆實現類

public interface UserDao {
    void getUser();
}
public class UserDaoImpl implements UserDao{
    public void getUser() {
        System.out.println("UserDao獲取User成功!");
    }
}
public class UserDaoMySqlImpl implements UserDao{
    public void getUser() {
        System.out.println("UserDaoMySqlImpl獲取User成功!");
    }
}
public class UserDaoOracleImpl implements UserDao{
    public void getUser() {
        System.out.println("UserDaoOracleImpl獲取User成功!");
    }
}

準備業務層

public interface UserService {
    void getUser();
}
public class UserServiceImpl implements UserService{
  private UserDao userDao = new UserDaoImpl;
  public void getUser() {
    userDao.getUser();
  }
}

測試不同UserDao實現類的getUser方法

public class MyTest {
  @Test
  public void testGetUser(){
    UserServiceImpl service = new UserServiceImpl();
    service.getUser();
  }
}

可以發現,當需要調用不同UserDao實現類時,每次都需要區service中修改UserDao實例的指向

private UserDao userDao = new UserDaoImpl;
private UserDao userDao = new UserDaoOracleImpl;
private UserDao userDao = new UserDaoMySqlImpl;

這樣設計的耦合性極高,對程序執行的控制權始終在開發人員手中,當用戶提出不同需求就需要我們不斷去修改UserDao實例的指向。如果代碼數量大,那么需要修改的就不止一處,下面在service中注入set方法來動態的獲取不同的UserDao實例指向

service:

public class UserServiceImpl implements UserService{
  private UserDao userDao;
  // 注入set方法  解耦
  public void setUserDao(UserDao userDao){
    this.userDao = userDao;
  }
  public void getUser() {
    userDao.getUser();
  }
}

Test:

public class MyTest {
  @Test
  public void testGetUser(){
    UserServiceImpl service = new UserServiceImpl();
    service.setUserDao(new UserDaoOracleImpl());
    service.getUser();
  }
}

上述示例,就可以動態的去選擇執行用戶指定的方法。此處的Test可以看作是一個servlet,它獲取到用戶的請求之后解析出對應執行的方法,再通過service去調用執行,耦合性就降低許多即用戶需求和程序之間的耦合性降低,程序執行的控制權交給用戶。以此完成控制反轉IOC

IOC本質

IOC的本質就是一種控制反轉的設計思想,它不完全等同于DI,DI(依賴注入)可以理解為實現IOC的一種方式。

那我的理解其實是,不能說控制權交給了用戶,只是我們通過程序編寫可以實現對用戶需求的解析。解析出用戶的需求對應程序中所要執行的方法即可。不能理解為控制權,只能說用戶具有了主動權,并且在代碼層面我們提高了程序的動態特性。

所謂控制反轉,就是說獲取對象的不再由程序的硬編碼決定,而是反轉到了用戶手中。首先程序會解析出用戶需求,再動態的獲取相應對象

XML配置Spring

以上述UserDao示例配置

<?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                         https://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- 將每一個UserDao的實現類映射到Spring容器中的bean -->
  <bean id="mysqlImpl" class="com.mountain.dao.MySqlImpl"/>
  <bean id="oracleImpl" class="com.mountain.dao.OracleImpl"/>
  <bean id="userService" class="com.mountain.service.UserServiceImpl">
    <property name="userDao" ref="mysqlImpl"/>
  </bean>
</beans>

測試;

@Test
public void testGetUser(){
  // 獲取spring上下文對象
  ApplicationContext context = new ClassPathXmlApplicationContext("application-context.xml");
  UserServiceImpl service = (UserServiceImpl) context.getBean("userService");
  System.out.println(service.getUser());
}

可以看到,創建對象不需要再利用new關鍵字硬編碼,而是完全交給Spring容器進行創建,我們在xml配置中將每一個UserDao的實現類映射到Bean,最后測試利用Spring上下文對象來獲取映射好的bean實例

配置細節:

  • property標簽name對應類中的字段,value是可以自定義的具體值,ref則是將該字段映射到具體某一個類上比如引用數據類型就會用到ref配置

  • bean中的id要與最終用Spring上下文對象getBean獲取實例時的參數一致

IOC體現:

  • 對象的創建、管理全部交給Spring容器。主動權交給Spring

  • 程序不在主動的創建對象,而是被動的接收對象

  • 利用set方法注入

IOC創建對象方式

默認創建對象方式:

// 無參構造
public User() {
  System.out.println("默認使用無參構造");
}
// 測試
ApplicationContext context = new ClassPathXmlApplicationContext("application-Context.xml");
User user = (User) context.getBean("User");

最終打印:默認使用無參構造,所以在不進行任何其他配置的情況下,Spring默認創建bean依然走無參構造器

public User(String name) {}
<bean id="User" class="com.yuqu.pojo.User">
  <property name="name" value="情人節"/>
</bean>

如果我們只顯式了有參構造,那么無參構造被覆蓋之后將會導致application-Context.xml文件配置的bean編譯直接報錯

使用含參構造時

方式一:

<!--  方式一:index代表構造器參數索引  -->
<bean id="User" class="com.yuqu.pojo.User">
  <constructor-arg index="0" value="情人節"/>
</bean>

方式二:

<!--  方式二:type代表參數類型  基本數據類型用  弊端較大  -->
<bean id="User" class="com.yuqu.pojo.User">
 <constructor-arg type="java.lang.String" value="圣誕節"/>
</bean>

但是假設多個參數都是java.lang.String那么方式二就是不可取的

方式三:

<!--  方式三:直接通過參數名設置  -->
<bean id="User" class="com.yuqu.pojo.User">
  <constructor-arg name="name" value="國慶節"/>
</bean>

感謝各位的閱讀,以上就是“Spring IOC推導與DI構造器注入的方法是什么”的內容了,經過本文的學習后,相信大家對Spring IOC推導與DI構造器注入的方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孟州市| 正定县| 白玉县| 屯留县| 秦皇岛市| 通化县| 敦化市| 永修县| 冀州市| 宁明县| 额济纳旗| 弥渡县| 钟祥市| 赞皇县| 菏泽市| 静宁县| 汤阴县| 张掖市| 鞍山市| 高青县| 平江县| 嘉义市| 科尔| 洛浦县| 阿尔山市| 张家港市| 永泰县| 永修县| 大同市| 锦州市| 永宁县| 博白县| 青田县| 敦煌市| 高州市| 安吉县| 武乡县| 沂水县| 静海县| 瓮安县| 鄂尔多斯市|