目錄
一、Spring 簡(jiǎn)介
1. 簡(jiǎn)介
2. spring 的核心模塊 ?
?二、IoC 的概念
2.1 IoC 詳解
2.2 IoC的好處
2.3 談?wù)勀銓?duì)IoC的理解
三、IoC的三種注入方式
3.1 構(gòu)造方法注入
3.2?setter方法注入
3.3 接口注入(自動(dòng)分配)
3.4 spring上下文與tomcat整合
3.5 總結(jié)
一、Spring 簡(jiǎn)介
1. 簡(jiǎn)介
????????Spring框架是?Java?平臺(tái)的一個(gè)開(kāi)源的全棧(full-stack)應(yīng)用程序框架和控制反轉(zhuǎn)容器實(shí)現(xiàn),一般被直接稱為 Spring。它由Rod Johnson創(chuàng)建,去搜索了它的資料很難想象Rod Johnson之前是學(xué)音樂(lè)。該框架的一些核心功能理論上可用于任何 Java 應(yīng)用,它還為基于Java企業(yè)版平臺(tái)構(gòu)建的 Web 應(yīng)用提供了大量的拓展支持。Spring 沒(méi)有直接實(shí)現(xiàn)任何的編程模型,但它已經(jīng)在 Java 社區(qū)中廣為流行,基本上完全代替了?企業(yè)級(jí)JavaBeans(EJB)模型。
簡(jiǎn)單來(lái)說(shuō),Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。
目的:解決企業(yè)應(yīng)用開(kāi)發(fā)的復(fù)雜性
功能:使用基本的JavaBean代替EJB,并提供了更多的企業(yè)應(yīng)用功能
范圍:任何Java應(yīng)用
2. spring 的核心模塊 ?
-
控制反轉(zhuǎn)(IoC):Spring通過(guò)IoC容器管理應(yīng)用程序中的對(duì)象依賴關(guān)系。它將對(duì)象的創(chuàng)建、組裝和管理工作交給了容器,開(kāi)發(fā)人員只需要關(guān)注業(yè)務(wù)邏輯的實(shí)現(xiàn)。
-
面向切面編程(AOP):Spring支持AOP,可以將橫切關(guān)注點(diǎn)(如日志記錄、事務(wù)管理等)從業(yè)務(wù)邏輯中分離出來(lái),提高代碼的模塊化和可重用性。
-
數(shù)據(jù)訪問(wèn)支持:Spring提供了對(duì)各種數(shù)據(jù)訪問(wèn)技術(shù)的支持,包括JDBC、ORM(如Hibernate、MyBatis)、JPA等。它簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層的開(kāi)發(fā),提供了事務(wù)管理和異常處理等功能。
-
Web開(kāi)發(fā)支持:Spring提供了一套全面的Web開(kāi)發(fā)框架,包括Spring MVC和Spring WebFlux。它們可以幫助開(kāi)發(fā)人員構(gòu)建靈活、高效的Web應(yīng)用程序。
-
安全性支持:Spring提供了一套強(qiáng)大的安全性框架,可以用于認(rèn)證、授權(quán)和安全性管理。它支持各種認(rèn)證方式,如基于表單、基于HTTP基本認(rèn)證、基于OAuth等。
????????此外,Spring還提供了許多其他功能和擴(kuò)展,如緩存支持、消息隊(duì)列、調(diào)度任務(wù)等。它的模塊化設(shè)計(jì)使得開(kāi)發(fā)人員可以根據(jù)需要選擇使用的功能,從而提高開(kāi)發(fā)效率。
?二、IoC 的概念
2.1 IoC 詳解
- Spring框架中的IoC(Inversion of Control,控制反轉(zhuǎn))是指將對(duì)象的創(chuàng)建、依賴關(guān)系的管理和對(duì)象的生命周期等控制權(quán)從應(yīng)用程序代碼中轉(zhuǎn)移到框架中。在IoC的概念下,對(duì)象的創(chuàng)建和管理不再由開(kāi)發(fā)人員直接控制,而是由Spring容器來(lái)負(fù)責(zé)。
- IoC的核心思想是通過(guò)依賴注入(Dependency Injection,DI)來(lái)實(shí)現(xiàn)對(duì)象之間的解耦。依賴注入是指在對(duì)象創(chuàng)建的過(guò)程中,將其所依賴的其他對(duì)象的引用注入到對(duì)象中,從而實(shí)現(xiàn)對(duì)象之間的關(guān)系建立和協(xié)作。通過(guò)依賴注入,對(duì)象不再負(fù)責(zé)自己依賴對(duì)象的創(chuàng)建和查找,而是由容器來(lái)完成。
- Spring框架中的IoC容器負(fù)責(zé)管理對(duì)象的生命周期和依賴關(guān)系。它通過(guò)配置文件(如XML配置文件)或注解的方式描述對(duì)象之間的依賴關(guān)系,并在應(yīng)用程序啟動(dòng)時(shí)將這些對(duì)象實(shí)例化并組裝起來(lái)。開(kāi)發(fā)人員只需要定義對(duì)象的行為,而無(wú)需關(guān)心對(duì)象的創(chuàng)建和管理過(guò)程。
2.2 IoC的好處
-
解耦:通過(guò)依賴注入,對(duì)象之間的依賴關(guān)系被明確地聲明在配置文件或注解中,使得對(duì)象之間的耦合度降低,提高了代碼的可維護(hù)性和可測(cè)試性。
-
簡(jiǎn)化對(duì)象的創(chuàng)建和管理:由容器負(fù)責(zé)對(duì)象的創(chuàng)建和生命周期管理,開(kāi)發(fā)人員只需關(guān)注對(duì)象的行為邏輯,而無(wú)需手動(dòng)管理對(duì)象的創(chuàng)建和銷(xiāo)毀。
-
提供靈活的配置方式:通過(guò)配置文件或注解,可以方便地修改對(duì)象之間的依賴關(guān)系,實(shí)現(xiàn)靈活的配置和組裝。
-
支持AOP(Aspect-Oriented Programming):Spring框架提供了面向切面編程的支持,可以通過(guò)IoC容器將橫切邏輯(如日志、事務(wù)管理等)與業(yè)務(wù)邏輯分離,提高了代碼的模塊化和可維護(hù)性。
2.3 談?wù)勀銓?duì)IoC的理解
????????Spring框架中的IoC(控制反轉(zhuǎn))通過(guò)依賴注入實(shí)現(xiàn)對(duì)象之間的解耦,將對(duì)象的創(chuàng)建和管理交由容器負(fù)責(zé)。使用IoC容器可以簡(jiǎn)化對(duì)象的創(chuàng)建和管理過(guò)程,提高代碼的可維護(hù)性和可測(cè)試性。通過(guò)靈活的配置方式,可以方便地修改對(duì)象之間的依賴關(guān)系。同時(shí),IoC容器的存在也為AOP提供了支持,使得橫切邏輯與業(yè)務(wù)邏輯分離,提高了代碼的模塊化和可維護(hù)性。
三、IoC的三種注入方式
3.1 構(gòu)造方法注入
一、構(gòu)造函數(shù)注入(Constructor Injection):通過(guò)構(gòu)造函數(shù)來(lái)注入依賴對(duì)象。在類的構(gòu)造函數(shù)中聲明依賴對(duì)象的參數(shù),并在容器中配置時(shí)提供相應(yīng)的依賴對(duì)象。當(dāng)創(chuàng)建對(duì)象實(shí)例時(shí),容器會(huì)自動(dòng)將依賴對(duì)象傳遞給構(gòu)造函數(shù),完成依賴注入。
示例代碼:
1. 編寫(xiě)一個(gè)接口定義修改用戶信息的方法
package com.ycxw.ioc.service;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-16 22:28
*/
public interface UserService {
/**
* 方法功能:修改用戶信息
*/
public void edit();
}
2. 編寫(xiě)一個(gè)service類來(lái)實(shí)現(xiàn)這個(gè)接口中的方法
package com.ycxw.ioc.service.impl;
import com.ycxw.ioc.service.UserService;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-16 22:29
*
*/
public class UserServiceImpl1 implements UserService {
@Override
public void edit() {
System.out.println("更改了用戶的信息");
}
}
3. 編寫(xiě)控制器(action)進(jìn)行調(diào)用并編寫(xiě)無(wú)參和有參構(gòu)造方法
package com.ycxw.ioc.web;
import com.ycxw.ioc.service.UserService;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-16 22:30
*
*/
public class UserAction {
private UserService userService;
public UserAction() {
}
public UserAction(UserService userService) {
this.userService = userService;
}
public String edits(){
userService.edit();
return "list";
}
}
??4. 編寫(xiě)spring.xml配置文件,用于定義和配置Spring應(yīng)用程序的組件、依賴關(guān)系、行為和其他相關(guān)配置。它是Spring框架的核心配置文件之一。
-
定義Bean:在
spring.xml
文件中,可以使用XML配置元素來(lái)定義應(yīng)用程序中的Bean對(duì)象。通過(guò)配置Bean的類路徑、構(gòu)造函數(shù),Spring容器可以根據(jù)配置文件中的定義來(lái)創(chuàng)建和管理Bean對(duì)象。 -
配置依賴注入:
spring.xml
文件可以指定Bean之間的依賴關(guān)系,通過(guò)配置構(gòu)造函數(shù)注入,將依賴的Bean?(userService) 注入到目標(biāo)Bean (userAction) 中,實(shí)現(xiàn)依賴注入。這樣可以實(shí)現(xiàn)對(duì)象之間的解耦,提高代碼的靈活性和可測(cè)試性。
<?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 class="com.ycxw.ioc.web.UserAction" id="userAction">
<constructor-arg name="userService" ref="userService"></constructor-arg>
</bean>
<bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>
5. 測(cè)試
package com.ycxw.ioc.test;
import com.ycxw.ioc.web.UserAction;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-16 22:35
*/
public class demo1 {
public static void main(String[] args) {
//加載spring核心配置文件(建模,這個(gè)spring的上下文對(duì)象),上下文對(duì)象中可以獲取任何javabean對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
//(強(qiáng)轉(zhuǎn))應(yīng)用指定對(duì)象
UserAction userAction = (UserAction) context.getBean("userAction");
//調(diào)用修改用戶信息方法
userAction.edits();
}
}
3.2?setter方法注入
二、Setter方法注入(Setter Injection):通過(guò)setter方法來(lái)注入依賴對(duì)象。在類中定義相應(yīng)的setter方法,并在容器中配置時(shí)使用相應(yīng)的屬性或標(biāo)簽指定依賴對(duì)象。當(dāng)創(chuàng)建對(duì)象實(shí)例后,容器會(huì)調(diào)用相應(yīng)的setter方法,將依賴對(duì)象注入到對(duì)象中。
示例代碼:
1. 修改了控制器(action)
package com.ycxw.ioc.web;
import com.ycxw.ioc.service.UserService;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-14 18:40
*
*/
public class UserAction {
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public String edits(){
userService.edit();
return "list";
}
}
2. 修改了bean注入的方式 (property)
<?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 class="com.ycxw.ioc.web.UserAction" id="userAction">
<property name="userService" ref="userService"></property>
<bean class="com.ycxw.ioc.service.impl.UserServiceImpl1" id="userService"></bean>
</beans>
3.3 接口注入(自動(dòng)分配)
三、這里請(qǐng)注意byType 和 byName 的區(qū)別:
1. byType(按類型自動(dòng)裝配):
- 在
byType
模式下,Spring容器會(huì)根據(jù)屬性的類型來(lái)查找與之匹配的Bean,并將其自動(dòng)注入到對(duì)應(yīng)的屬性上。 - 例如,如果一個(gè)屬性的類型為UserService,Spring容器會(huì)查找實(shí)現(xiàn)了UserService接口的Bean,并將其注入到該屬性上。
- 要使用
byType
模式,目標(biāo)Bean的屬性類型必須與其他Bean的類型匹配,并且在容器中只能有一個(gè)匹配的Bean。
2. byName(按名稱自動(dòng)裝配):
- 在
byName
模式下,Spring容器會(huì)根據(jù)屬性的名稱來(lái)查找與之匹配的Bean,并將其自動(dòng)注入到對(duì)應(yīng)的屬性上。 - 例如,如果一個(gè)屬性名為userService,Spring容器會(huì)查找名稱為userService的Bean,并將其注入到該屬性上。
- 要使用
byName
模式,目標(biāo)Bean的屬性名稱必須與其他Bean的名稱匹配。
?注意:如果id與目標(biāo)Bean屬性名稱不匹配,則會(huì)在運(yùn)行時(shí)報(bào)錯(cuò)。
?
3.4 spring上下文與tomcat整合
????????在用戶每一次發(fā)送任意請(qǐng)求,在對(duì)應(yīng)請(qǐng)求處理代碼中可以獲取到spring容器中配置的任意的JavaBean,從而獲取對(duì)應(yīng)的javabean中定義的方法。
實(shí)現(xiàn)思路:
- 在tomcat啟動(dòng)的時(shí)候自動(dòng)去加載spring的上下文(ApplicationContext)
- 利用監(jiān)聽(tīng)器去把spring的上下文放到tomcat的上下文中
- 為了解決框架的配置文件沖突的問(wèn)題,我們需要?jiǎng)討B(tài)指定spring上下文的配置文件名稱;
示例代碼:
1. 編寫(xiě)SpringLoadListener 監(jiān)聽(tīng)器
package com.ycxw.ioc.listener;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-16 10:25
*/
@WebListener
public class SpringLoadListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//加載spring核心配置文件(建模,這個(gè)spring的上下文對(duì)象),上下文對(duì)象中可以獲取任何javabean對(duì)象
ApplicationContext context = new ClassPathXmlApplicationContext("/spring-context.xml");
//獲取tomcat上下文
ServletContext servletContext = sce.getServletContext();
//把srping的上下文放入tomcat中
servletContext.setAttribute("springContext",context);
}
}
2. 編寫(xiě)servlet測(cè)試
package com.ycxw.ioc.web;
import com.ycxw.ioc.service.UserService;
import org.springframework.context.ApplicationContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-08-16 10:29
*/
@WebServlet("/userList")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//當(dāng)處理用戶請(qǐng)求的時(shí)候,獲取spring的上下文對(duì)象
ApplicationContext springContext = (ApplicationContext ) req.getServletContext().getAttribute("springContext");
//拿到userService的Bean
UserService userAction = (UserService) springContext.getBean("userService");
System.out.println(userAction);
userAction.edit();
}
}
3. 用戶處理結(jié)果后打印輸出
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-657321.html
3.5 總結(jié)
????????Spring框架提供了三種主要的依賴注入方式:構(gòu)造函數(shù)注入、Setter方法注入和字段注入。構(gòu)造函數(shù)注入通過(guò)構(gòu)造函數(shù)來(lái)注入依賴對(duì)象,Setter方法注入通過(guò)setter方法來(lái)注入依賴對(duì)象,字段注入通過(guò)直接注入字段來(lái)實(shí)現(xiàn)依賴注入。這些注入方式可以單獨(dú)使用,也可以結(jié)合使用,具體選擇可以根據(jù)實(shí)際需求和個(gè)人偏好來(lái)決定。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-657321.html
到了這里,關(guān)于Spring 框架入門(mén)介紹及IoC的三種注入方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!