面試官:為什么要用 Spring?它到底解決了什么問題?
點(diǎn)擊關(guān)注公眾號,Java干貨及時(shí)送達(dá)
為什么要用 Spring?它到底解決了什么問題?
目的:對比傳統(tǒng)方式和 Spring注入方式創(chuàng)建對象以達(dá)到解耦的目的,以Service層調(diào)用 Dao層為例。
方式一:傳統(tǒng)方式
1.Service層
/**
?*?@author :Prannt
?*?@description :Service層
?*?@program?:?Test
?*/
public?class?UserService?{
????public?void?add(){
????????System.out.println("service?add...");
????????UserDao?dao?=?new?UserDaoImpl();
????????dao.query();
????}
}
2.UserDao接口
/**
?*?@description :接口中只有一個(gè)抽象方法
?*/
public?interface?UserDao?{
????void?query();
}
3.UserDao接口的實(shí)現(xiàn)類
/**
?*?@description :接口的實(shí)現(xiàn)類,重寫 query方法
?*/
public?class?UserDaoImpl?implements?UserDao{
????@Override
????public?void?query()?{
????????System.out.println("dao?query...");
????}
}
//測試
public?class?test?{
????@Test
????public?void?test1(){
????????UserService?service?=?new?UserService();
????????service.add();
????}
}
Spring Boot 基礎(chǔ)就不介紹了,推薦下這個(gè)實(shí)戰(zhàn)教程:https://github.com/javastacks/spring-boot-best-practice

結(jié)論一:由以上過程可以看出,在UserService類中直接調(diào)用實(shí)現(xiàn)類的query方法,一旦實(shí)現(xiàn)類出問題,UserService立即報(bào)錯(cuò),具有高度的耦合性
方式二:Spring注入對象
???????????????????? ???? ???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">1.xml文件配置bean
???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">???????????????? ???????? "1.0"?encoding="UTF-8"?>"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">
????"userService"?class="Service.UserService">
????????
????????"dao"?ref="Dao">
????
????"Dao"?class="Dao.UserDaoImpl">
???????????????????? ???? ???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">2.Service層
???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">???????????????? ???????? import?Dao.UserDao;
/**
?*?@author :Prannt
?*?@description :
?*?@program?:?Demo01
?*/
public?class?UserService?{
????public?void?add(){
????????System.out.println("service?add......");
????????dao.update();
????}
????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法
????private?UserDao?dao;
????public?void?setDao(UserDao?dao)?{
????????this.dao?=?dao;
????}
}
???????????????????? ???? ???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">3.UserDao接口

???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">???????????????? ???????? public?interface?UserDao?{
????void?update();
}
???????????????????? ???? ???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">4.接口的實(shí)現(xiàn)類
???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">???????????????? ???????? public?class?UserDaoImpl?implements?UserDao{
????@Override
????public?void?update()?{
????????System.out.println("Dao?update......");
????}
}
推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice
???? 2.Service層import?Dao.UserDao;/**?*?@author :Prannt?*?@description :?*?@program?:?Demo01?*/public?class?UserService?{????public?void?add(){????????System.out.println("service?add......");????????dao.update();????}????//創(chuàng)建dao類型的屬性,生成對應(yīng)的set方法????private?UserDao?dao;????public?void?setDao(UserDao?dao)?{????????this.dao?=?dao;????}}3.UserDao接口public?interface?UserDao?{????void?update();}4.接口的實(shí)現(xiàn)類public?class?UserDaoImpl?implements?UserDao{????@Override????public?void?update()?{????????System.out.println("Dao?update......");????}}推薦一個(gè) Spring Boot 基礎(chǔ)教程及實(shí)戰(zhàn)示例:https://github.com/javastacks/spring-boot-best-practice測試import?Service.UserService;import?org.junit.Test;import?org.springframework.context.ApplicationContext;import?org.springframework.context.support.ClassPathXmlApplicationContext;public?class?TestBean?{????@Test????public?void?testBean(){????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");????????UserService?userService?=?context.getBean("userService",UserService.class);????????userService.add();????}}測試結(jié)果" linktype="text" imgurl="" imgdata="null" data-itemshowtype="0" tab="innerlink" data-linktype="2">???????????????? ???????? import?Service.UserService;
import?org.junit.Test;
import?org.springframework.context.ApplicationContext;
import?org.springframework.context.support.ClassPathXmlApplicationContext;
public?class?TestBean?{
????@Test
????public?void?testBean(){
????????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("bean2.xml");
????????UserService?userService?=?context.getBean("userService",UserService.class);
????????userService.add();
????}
}

結(jié)論二:觀察以上過程,在UserService類中,沒有直接new實(shí)現(xiàn)類,而是通過將Dao注入外部配置文件中的方式,使用“第三方文件”來達(dá)到解耦的目的。
總結(jié)
第一種傳統(tǒng)方式創(chuàng)建對象,就像圖一中的齒輪組。如果有一個(gè)齒輪出了問題,就可能會影響到整個(gè)齒輪組的正常運(yùn)轉(zhuǎn)。

而用Spring注入對象猶如圖二的齒輪,利用第三方xml文件使任意兩個(gè)齒輪之間無必然聯(lián)系,B齒輪壞了也影響不到A、C、D齒輪。齒輪組相互之間的依賴關(guān)系降到最低。

原文鏈接:https://blog.csdn.net/qq_38050259/article/details/113414419
版權(quán)聲明:本文為CSDN博主「Prannt」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

關(guān)注Java技術(shù)棧看更多干貨

