一、概念
在向讀者描述Spring時(shí),筆者不打算從某處粘貼一段常見(jiàn)的概念性文字糊弄完本專欄的第一篇文章,而是用易于理解的話向讀者指出幾個(gè)重點(diǎn)。
(1)是框架。何謂框架?就像搭房子一樣,框架就如同是墻體結(jié)構(gòu),房地產(chǎn)開(kāi)發(fā)商將墻體結(jié)構(gòu)給客戶搭建好了,至于細(xì)節(jié)的裝修,比如刷什么顏色的漆,選用什么樣的家具、什么顏色的燈光等等這些都將交由客戶自己完成。Spring類似于此,它簡(jiǎn)化了Java程序員“搭建一套房子”的工作。Java程序員只需要引入這樣一個(gè)框架,然后做一些“裝修”的工作,就能快速地對(duì)外提供服務(wù)了。至此,我們?cè)俅伍喿xSpring官網(wǎng)的第一段話,是不是更能明白Spring框架出現(xiàn)的意義呢?一句話總結(jié):簡(jiǎn)化了應(yīng)用開(kāi)發(fā)。
(2)Spring的優(yōu)勢(shì)是?我們?cè)诖藘H僅先用一句話分別介紹幾個(gè)優(yōu)勢(shì),要深刻地理解,還需要后續(xù)持續(xù)的學(xué)習(xí)。
1、解耦:IoC通過(guò)依賴注入等方式,將對(duì)象的依賴關(guān)系從硬編碼中解耦出來(lái),降低了代碼的耦合度,使得代碼更加靈活和可維護(hù)。IoC,Inversion of Control,控制反轉(zhuǎn)。所謂控制,即創(chuàng)建對(duì)象的控制權(quán),所謂反轉(zhuǎn),指過(guò)去創(chuàng)建對(duì)象的控制是由開(kāi)發(fā)者自己掌握的,現(xiàn)在則交給了Spring框架。
2、AOP:Aspect-Oriented Programming,面向切面編程。彌補(bǔ)了OOP的缺陷。
3、聲明式事務(wù):是否還記得我們使用JDBC時(shí)如何進(jìn)行事務(wù)控制呢?我們需要通過(guò)Connection對(duì)象來(lái)setAutocommit為false,表示事務(wù)打開(kāi),再根據(jù)執(zhí)行結(jié)果來(lái)進(jìn)行commit或rollback。顯然這個(gè)操作太繁瑣了,那么期待Spring是如何優(yōu)雅地解決這一問(wèn)題吧。
4、集成了其它優(yōu)秀的框架:如SpringMVC,MyBatis等,集成了其它框架的能力會(huì)讓我們的工作更加省心。
5、降低JavaEE API的使用難度:例如JDBC的使用,我們的通用操作是注冊(cè)驅(qū)動(dòng),獲取連接,獲取執(zhí)行SQL對(duì)象等,執(zhí)行SQL,處理查詢結(jié)果等。而在Spring框架中,則集成了許多模板工具,如JDBCTemplate,針對(duì)Redis提供了RedisTemplate類。
二、快速使用
既然上面提到Spring框架是如此的便捷,那么我們現(xiàn)在來(lái)快速上手一下Spring吧。
(1)引入Spring上下文依賴spring-context,junit用于測(cè)試
<!--基于Maven依賴傳遞性,導(dǎo)入spring-context依賴即可導(dǎo)入當(dāng)前所需所有jar包-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.1</version>
</dependency>
<!--junit測(cè)試-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
(2)定義一個(gè)類,并提供一個(gè)方法
public class HelloWorld {
public void sayHello() {
System.out.println("hello, spring");
}
}
(3)定義配置文件,將第(2)步的類加入到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:將對(duì)象交給IOC容器來(lái)管理
id:bean的唯一標(biāo)識(shí),不能重復(fù)
class:設(shè)置bean對(duì)象所對(duì)應(yīng)的類型
-->
<bean id="hello-world" class="com.bylearning.spring.pojo.HelloWorld" />
</beans>
(4)我們?cè)跍y(cè)試類中看看效果
import com.bylearning.spring.pojo.HelloWorld;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class HelloWorldTest {
@Test
public void test() {
// 獲取IOC容器
ApplicationContext ioc = new ClassPathXmlApplicationContext("applicationContext.xml");
// 獲取IOC容器中的bean
HelloWorld helloworld = (HelloWorld)ioc.getBean("hello-world");
HelloWorld helloworld1 = (HelloWorld)ioc.getBean("hello-world");
System.out.println(helloworld);
System.out.println(helloworld1); // 兩個(gè)地址相同,驗(yàn)證Spring容器創(chuàng)建對(duì)象默認(rèn)是單例模式
helloworld.sayHello();
}
}
至此,我們就完成了Spring的初探:將對(duì)象交給Spring容器來(lái)管理,并通過(guò)getBean方法向容器索要一個(gè)對(duì)象。
注意到獲取IoC容器時(shí),我們使用了new ClassPathXmlApplication(String xmlFileName)方法,這個(gè)方法顧名思義,會(huì)讀取在類路徑下一個(gè)xml文件,我們?cè)诤竺娴恼鹿?jié)中會(huì)更詳細(xì)地闡述。以及getBean(String beanId)方法,還有通過(guò)類獲取Bean的方法,我們也在后面介紹。在這里大家僅需快速了解Spring的基本使用即可。
我們多說(shuō)幾句Spring創(chuàng)建對(duì)象的邏輯是:Spring框架通過(guò)讀取xml文件,根據(jù)id標(biāo)識(shí)獲得了Bean的全限定名,通過(guò)反射創(chuàng)建出Bean對(duì)象并返回對(duì)象。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-814867.html
了解完這些,我們似乎對(duì)Spring有了些模糊的認(rèn)識(shí),接下來(lái)讓我們走近Spring,首先來(lái)了解一下Spring的配置文件。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-814867.html
到了這里,關(guān)于Spring-簡(jiǎn)介的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!