一篇文章帶你了解初始Spring
為什么要使用Spring
Why Spring?
Spring makes programming Java quicker, easier, and safer for everybody. Spring's focus on speed,
simplicity, and productivity has made it the world's most popular Java framework
Spring概述
Spring是一種輕量級(jí)的、開(kāi)源的框架。
Spring為簡(jiǎn)化企業(yè)級(jí)開(kāi)發(fā)而生,使用Spring開(kāi)發(fā)可以將Bean對(duì)象,Dao組件對(duì)象,Service組件對(duì)象等交給Spring容器來(lái)管理,這樣使得很多復(fù)雜的代碼在Spring中開(kāi)發(fā)卻變得非常的優(yōu)雅和簡(jiǎn)潔,有效的降低代碼的耦合度,極大的方便項(xiàng)目的后期維護(hù)、升級(jí)和擴(kuò)展。
Spring是一個(gè)IOC(DI)和AOP容器框架。
Spring的優(yōu)良特性
非侵入式:基于Spring開(kāi)發(fā)的應(yīng)用中的對(duì)象可以不依賴(lài)于Spring的API
控制反轉(zhuǎn):IOC——Inversion of Control,指的是將對(duì)象的創(chuàng)建權(quán)交給Spring去創(chuàng)建。使用Spring之前,對(duì)象的創(chuàng)建都是由我們自己在代碼中new創(chuàng)建。而使用Spring之后。對(duì)象的創(chuàng)建都是由給了Spring框架。
依賴(lài)注入:DI——Dependency Injection,是指依賴(lài)的對(duì)象不需要手動(dòng)調(diào)用setXX方法去設(shè)置,而是通過(guò)配置賦值。
面向切面編程:Aspect Oriented Programming——AOP
容器:Spring是一個(gè)容器,因?yàn)樗⑶夜芾響?yīng)用對(duì)象的生命周期
組件化:Spring實(shí)現(xiàn)了使用簡(jiǎn)單的組件配置組合成一個(gè)復(fù)雜的應(yīng)用。在 Spring 中可以使用XML和Java注解組合這些對(duì)象。
一站式:在IOC和AOP的基礎(chǔ)上可以整合各種企業(yè)應(yīng)用的開(kāi)源框架和優(yōu)秀的第三方類(lèi)庫(kù)(實(shí)際上Spring 自身也提供了表述層的SpringMVC和持久層的Spring JDBC)
IOC
IOC 是一種設(shè)計(jì)的思想,使用這種的設(shè)計(jì)的思想實(shí)現(xiàn)的框架就是IOC容器、通過(guò)這個(gè)容器可以實(shí)現(xiàn)對(duì)bean的管理、也就是對(duì)對(duì)象的生命周期的管理、也可以管理對(duì)象之間的依賴(lài)關(guān)系。IOC 是Spring用來(lái)實(shí)現(xiàn)對(duì)象的創(chuàng)建的、也就是將對(duì)象的創(chuàng)建交給Spring來(lái)實(shí)現(xiàn)的、降低了類(lèi)和類(lèi)之間的耦合度。
IOC 的 思想依賴(lài)于IOC容器的來(lái)實(shí)現(xiàn)的,IOC的底層就是對(duì)象工廠。
Spring提供了兩種實(shí)現(xiàn)IOC的方法、一種是BeanFactroy來(lái)實(shí)現(xiàn)的、一種是ApplicationContext來(lái)是實(shí)現(xiàn)的。
IOC的底層原理:IOC的底層就是使用xml、工廠模式、反射的技術(shù)來(lái)實(shí)現(xiàn)。
DI
實(shí)現(xiàn)了IoC思想的容器就是IoC容器,比如:SpringFremework, Guice(Google開(kāi)源的輕量級(jí)DI框架)
AOP
AOP(Aspect-Oriented Programming,面向切面編程)是對(duì)傳統(tǒng)傳統(tǒng) OOP(Object-Oriented Programming,面向?qū)ο缶幊蹋┑难a(bǔ)充,屬于一種橫向擴(kuò)展。其將與核心業(yè)務(wù)無(wú)關(guān)的代碼,如日志記錄、性能監(jiān)控、事務(wù)處理等從業(yè)務(wù)邏輯代碼中抽離出來(lái),進(jìn)行橫向排列,從而實(shí)現(xiàn)低耦合,提高開(kāi)發(fā)效率。
Spring容器使用流程
1.啟動(dòng)容器
加載類(lèi)路徑下的beans.xml 文件

2.完成bean的初始化
通過(guò)配置文件完成對(duì)bean的初始化

掃描路徑下org.example添加四個(gè)注解的類(lèi)

3.注冊(cè)bean到容器中


4.裝配bean的屬性

bean的注冊(cè)
四個(gè)注解都可以用來(lái)將當(dāng)前的類(lèi)注入到bean中去、將類(lèi)交給spring來(lái)托管。
@Component是基礎(chǔ)注解,表示一個(gè) JavaBean 可以被注入到 Spring 容器中。
為了更好的表示 Web 服務(wù)中的三層結(jié)構(gòu),所以就額外的引出了另外的三種注解分別用在三層結(jié)構(gòu)中進(jìn)行標(biāo)注:
@Controller 用在表現(xiàn)層,對(duì)來(lái)自前端的請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)處理與重定向。
@Repository 用在持久層,標(biāo)注 DAO 類(lèi),表示這個(gè)類(lèi)可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的讀取或者寫(xiě)入。
@Service 用在業(yè)務(wù)層,用來(lái)處理業(yè)務(wù)邏輯。
引入后三個(gè)注解之后,就實(shí)現(xiàn)了將處理前端請(qǐng)求、處理業(yè)務(wù)邏輯、處理數(shù)據(jù)庫(kù)讀寫(xiě)這三個(gè)基本任務(wù)進(jìn)行了解耦,方便程序的編寫(xiě)和項(xiàng)目維護(hù)。
也可以使用@Bean注解
當(dāng)前類(lèi)被 Spring 掃描到時(shí),可以在方法上使用 @Bean 注解,通過(guò)方法返回類(lèi)型,也可以定義、注冊(cè)Bean對(duì)象,默認(rèn)使用方法名作為Bean的名稱(chēng)。
@Configuration
在類(lèi)被Spring掃描到時(shí),使用 @Configuration 注解,可以注冊(cè)一個(gè)配置類(lèi)到容器中。配置類(lèi)一般用來(lái)
可以使用FactoryBean接口:先定義一個(gè)Bean,實(shí)現(xiàn)FactoryBean接口,指定泛型為要注冊(cè)的類(lèi),通過(guò)getObject方法的返回
bean屬性注入
可以在屬性上使用 @Autowired 注解
也可以使用setter方法上使用 @Autowired 注解
也能使用構(gòu)造方法注入
使用 @Qualifier(“名稱(chēng)”) 注解、注入指定的bean
@Controller
public class LoginController {
// 第一種注解的方式屬性注入
// @Autowired
@Resource
private LoginService loginService;
//第二種的注入的方式使用set方法來(lái)實(shí)現(xiàn)注入
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
//第三中的方法、使用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)注入、使用構(gòu)造函數(shù)的方式來(lái)實(shí)現(xiàn)注入的話、不需要@Autowire注解
public LoginController(LoginService loginService) {
this.loginService = loginService;
}
public void say() {
loginService.say();
}
@Bean
public User user1() {
User user = new User();
user.setName("ni");
;
user.setPassword("wo");
return user;
}
@Bean
public User user2() {
User user = new User();
user.setName("y");
user.setPassword("y");
return user;
}
}
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
spring和quartz整合,并簡(jiǎn)單調(diào)用(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇spring和quartz整合,并簡(jiǎn)單調(diào)用(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
Java接口默認(rèn)方法帶來(lái)的問(wèn)題分析【二義性問(wèn)題】
這篇文章主要介紹了Java接口默認(rèn)方法帶來(lái)的問(wèn)題,結(jié)合實(shí)例形式分析了java接口帶來(lái)的二義性問(wèn)題,需要的朋友可以參考下2019-08-08
springboot集成nacos報(bào)錯(cuò):get data from Nacos
這篇文章給大家介紹了springboot集成nacos報(bào)錯(cuò):get data from Nacos error,dataId:null.yaml的原因及解決方法,如果又遇到相同問(wèn)題的朋友可以參考閱讀本文2023-10-10
一篇文章教你用Java使用JVM工具檢測(cè)問(wèn)題
這篇文章主要介紹了深入理解Java使用JVM工具檢測(cè)問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09
SpringMVC記錄我遇到的坑_AOP注解無(wú)效,切面不執(zhí)行的解決
這篇文章主要介紹了SpringMVC記錄我遇到的坑_AOP注解無(wú)效,切面不執(zhí)行的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java Websocket Canvas實(shí)現(xiàn)井字棋網(wǎng)絡(luò)游戲
這篇文章主要介紹了Java Websocket Canvas實(shí)現(xiàn)井字棋網(wǎng)絡(luò)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
SpringBoot+MyBatis-Plus+Velocity實(shí)現(xiàn)代碼自動(dòng)生成
本文主要介紹了使用SpringBoot、MyBatis-Plus和Velocity模板引擎實(shí)現(xiàn)代碼自動(dòng)生成器,該生成器能夠根據(jù)數(shù)據(jù)庫(kù)表結(jié)構(gòu)自動(dòng)生成增刪改查操作的代碼,感興趣的可以了解一下2025-03-03
Mybatis中xml的動(dòng)態(tài)sql實(shí)現(xiàn)示例
本文主要介紹了Mybatis中xml的動(dòng)態(tài)sql實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06

