Spring是什么?
Spring可以讓每一位開發(fā)者使用java開發(fā)更加的快捷、簡單以及更加的安全,是世界上最流行的java框架。
- simple 使java更加的簡單
- modern 使java更加現代化
- productive 使java生產效率更高
- reactive 使java本地化
- cloud-ready 已經準備好云端
一、沒有Spring之前是什么樣
沒有Spring之前是什么樣?
- Web開發(fā)在沒有Spring之前是使用Servlet
- 其他開發(fā)沒有Spring之前是自己寫單例
使用Servlet開發(fā)
- 先編寫servlet類
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out = response.getWriter();
out.println("HelloServlet!");
}
}
- 配置xml文件,指定servlet和servlet-mapping
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<!-- 類名 -->
<servlet-name>HelloWorld</servlet-name>
<!-- 所在的包 -->
<servlet-class>com.test.demo.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<!-- 訪問的網址 -->
<url-pattern>/servlet/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>
二、有Spring之后
有Spring之后該如何操作呢?我們可以直接使用注解就可以完成一個接口的開發(fā)
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/hello")
public String hello(@RequestParam(value = "name", defaultValue = "World") String name) {
return String.format("Hello %s!", name);
}
}
這么來看的話,有了Spring之后,就不需要額外的再進行配置xml了,確實使得java的開發(fā)變得簡單許多,自然也提高了開發(fā)效率,使得java開發(fā)更加的多產。
三、核心容器
Beans:
容器的主要組件BeanFactory,它是工廠模式實現的。BeanFactory使用控制反轉模式(IOC)將應用的配置和依賴性規(guī)范與實際的應用代碼分開。將所有的對象的控制權全部交由IOC容器處理,好處就是解耦,把對象之間的依賴關系減小的最低。
Core:
Core是用來負責發(fā)現、創(chuàng)建并處理bean之間的關系的一個工具包。core把bean的創(chuàng)建、bean的互相注入的方法定義完畢,上層服務只需要進行調用。
Context:
Context可以理解成上下文,這個上下文由多種數據結構組成,可以提供我們運行時需要的一些數據和保存運行時的一些數據。
SpEL:
Spring Expression Language(簡稱SpEL)提供了強大的表達式語言支持,支持訪問和修改屬性值,方法調用,支持訪問及修改數組、容器和索引器,命名變量,支持算數和邏輯運算,支持從 Spring 容器獲取 Bean,它也支持列表投影、選擇和一般的列表聚合等。
最簡單的應用,可以讀取系統(tǒng)屬性和環(huán)境變量:
public class MyCommandLineRunner implements CommandLineRunner {
@Value("${spring.datasource.url}")
String dbUrl;
}
四、Spring的組成
Spring框架結構圖如下所示:

- Data Access/Integration(數據訪問/集成)
- Web 模塊
- Core Container(Spring 的核心容器)
- AOP、Aspects、Instrumentation 和 Messaging
- Test 模塊
既然Spring的核心框架和思想已經初步構建完成,但是也得需要有人去使用起來,光有架構和框架還不行,還得根據自有框架去開發(fā)出當前基礎的工具及功能出來,所以有上圖Spring的組成圖中我們可以看出來,基于核心容器向上開發(fā)出了AOP、Aspects、Instrumentation 和 Messaging,我們可以把這一層理解成驅動層。再向上開發(fā)出了數據訪問和Web模塊,能夠滿足基本的日常使用,這一層可以理解成應用層。有基本的上層應用,開發(fā)者就能夠利用他們滿足日常。
在Spring的大框架下,可以很方便的接納其他開發(fā)者的上層應用,我們只需要在驅動層上對第三方框架進行簡單的適配,就可以讓其他開發(fā)者直接使用了。所以Spring的生態(tài)越來越好,用的人也越來越多,進入了一個
五、為什么使用單例模式
為了提高性能。
- 單例可以少創(chuàng)建實例,每個實例只創(chuàng)建一次
- 獲取更加的快捷,直接在內存中取出
- 少了JVM的垃圾回收