Spring學(xué)習(xí)手札(一)

Spring能做什么

1. 能根據(jù)配置文件創(chuàng)建及組裝對象之間的依賴關(guān)系;

2. 面向切面編程,能幫助我們無耦合的實現(xiàn)日志記錄,性能統(tǒng)計,安全控制等;

3. 提供第三方數(shù)據(jù)訪問框架(如Hibernate),而且自己也提供了一套JDBC訪問模板方便訪問數(shù)據(jù)庫;

4. 非常簡單的管理數(shù)據(jù)庫事務(wù);

5. 集成第三方Web框架(如Struts1/2),而且本身有Spring MVC方便搭建web層

6. 與Java EE整合,與更多技術(shù)整合(比如緩存)


Spring的特色

1. 方便解耦,簡化開發(fā)

 Spring IoC完成對象創(chuàng)建,依賴關(guān)系維護(hù)等

2. AOP的支持

 Spring提供面向切面編程,實現(xiàn)攔截,監(jiān)控等

3. 聲明式事務(wù)管理

 只需通過配置完成對事務(wù)的管理,而無需手動操作

4. 方便測試

 支持Junit4,可以通過注解方便測試

5. 方便集成其他框架

 一直在提供并完善各種框架(如Struts,MyBatis,Hibernate等)

6. 降低開發(fā)難度,一站式開發(fā)項目

 提供各種優(yōu)秀前端框架,以及后臺框架,一站式開發(fā)網(wǎng)站


Spring的定義

先看看百度百科的解釋

Spring框架是一個輕量級的DI/IoC和AOP容器的開源框架;

Spring為了解決企業(yè)應(yīng)用開發(fā)的復(fù)雜性而創(chuàng)建的;

Spring的用途不僅限于服務(wù)器端的開發(fā),只是為了簡化Java開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應(yīng)用都可以從Spring中受益。Spring的核心是控制反轉(zhuǎn)(IoC)和面向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EE full-stack(一站式) 輕量級開源框架。

Spring使用基本的JavaBean來完成開發(fā)。


先了解一下

Spring Boot?通過整合通用實踐,更加自動,智能的依賴管理,Spring Boot提供了各種典型應(yīng)用系統(tǒng)的通用開發(fā)基礎(chǔ),所以它是以應(yīng)用為中心的一個框架集合。

Spring Cloud?可認(rèn)為是在Spring Boot的升級版,提供了構(gòu)建分布式系統(tǒng)的通用模塊,包含服務(wù)發(fā)現(xiàn)和服務(wù)注冊,分布式配置管理,負(fù)載均衡,分布式診斷等各種子系統(tǒng),是構(gòu)建微服務(wù)的一把好手

還有針對特定領(lǐng)域的Spring Security,Spring Data等

Spring框架結(jié)構(gòu)


Data Access/Integration層包含有JDBC、ORM、OXM、JMS和Transaction模塊。

Web層包含了Web、Web-Servlet、WebSocket、Web-Porlet模塊。

AOP模塊提供了一個符合AOP聯(lián)盟標(biāo)準(zhǔn)的面向切面編程的實現(xiàn)。

Core Container(核心容器):包含有Beans、Core、Context和SpEL模塊。

Test模塊支持使用JUnit和TestNG對Spring組件進(jìn)行測試。


Bean規(guī)范

每一個類實現(xiàn)了Bean的規(guī)范才能有Spring來接管

? ? 必須有個公有類

? ? 有無參數(shù)構(gòu)造函數(shù)

? ? 用公共方法暴露內(nèi)部成員屬性(getter,setter )

Bean的生命周期


Bean的作用域

Spring定義了多種Bean作用域,可基于這些作用域創(chuàng)建bean,包括:

? ? 單例(Singleton):在整個應(yīng)用中,只創(chuàng)建一個bean實例

? ? 原型(Prototype):每次注入或者通過Spring應(yīng)用上下文獲取的時候,都會創(chuàng)建一個新的bean實例

? ? 會話(Session):在web應(yīng)用中,為每個會話創(chuàng)建一個bean實例

請求(Request):在web應(yīng)用中,為每個請求創(chuàng)建一個bean實例。默認(rèn)情況下,Spring應(yīng)用上下文中所有bean都是作為單例的形式創(chuàng)建。也就是說,不管既定的一個bean被注入到其他bean多少次,每次所注入的都是同一個實例。


IoC了解一下

一種設(shè)計思想。就是將原本在程序中手動創(chuàng)建對象的控制權(quán),交由Spring框架來管理。不用new對象,而直接從Spring那里獲取對象。


開始Spring的Coding漫漫路

1. 新建Java項目,命名 spring

2.新建lib目錄,并添加jar包,


3.開始編寫程序

  3.1 在src下新建bean包,然后新建User類

package bean;publicclass User {

? ? private Integer id;

? ? private String name;

? ? private String gender;

? ? public Integer getId() {

? ? ? ? return id;

? ? }

? ? publicvoid setId(Integer id) {

? ? ? ? this.id = id;

? ? }

? ? public String getName() {

? ? ? ? return name;

? ? }

? ? publicvoid setName(String name) {

? ? ? ? this.name = name;

? ? }

? ? public String getGender() {

? ? ? ? return gender;

? ? }

? ? publicvoid setGender(String gender) {

? ? ? ? this.gender = gender;

? ? }

}

  3.2 在src下新建 applicationContext.xml

<?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 name="beanUser" class="bean.User"><property name="id" value="1001"></property><property name="name" value="Jesse"></property><property name="gender" value="male"></property></bean></beans>


  4.1 在src下新建test類4.測試程序

import bean.User;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;publicclass test {

? ? @Test

? ? publicvoid demo1() {

? ? ? ? ApplicationContext context =new ClassPathXmlApplicationContext(

? ? ? ? ? ? ? ? newString[]{"applicationContext.xml"});

? ? ? ? User user = (User) context.getBean("beanUser");

? ? ? ? System.out.println(user.getId());

? ? ? ? System.out.println(user.getName());

? ? ? ? System.out.println(user.getGender());

? ? }

}

運(yùn)行結(jié)果:


DI:Dependency Injection (依賴注入)

Spring 在創(chuàng)建對象的過程中,將對象依賴屬性(簡單值,集合,對象)通過配置設(shè)值給該對象?;蛘哒f拿到對象的屬性,已經(jīng)被注入到了相關(guān)值了,可以直接使用。

1. 在bean下新建 SaySomething類

package bean;publicclass SaySomething {

? ? privateUser user =null;

? ? public User getUser() {

? ? ? ? return user;

? ? }

? ? publicvoid setUser(User user) {

? ? ? ? this.user = user;

? ? }

? ? public String sayHi() {

? ? ? ? returnuser.getId() + " " + user.getName() + " " + user.getGender();

? ? }

}

2.修改applicationContext.xml,如下:

<?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 name="beanUser" class="bean.User"><property name="id" value="1001"></property><property name="name" value="Jesse"></property><property name="gender" value="male"></property></bean><bean name="saySomething" class="bean.SaySomething"><property name="user" ref="beanUser"></property></bean></beans>

3.在test.java里,添加新的方法,測試上面代碼

? @Test

? ? publicvoid demo2() {

? ? ? ? ApplicationContext context =new ClassPathXmlApplicationContext(

? ? ? ? ? ? ? ? newString[]{"applicationContext.xml"});

? ? ? ? SaySomething saySomething = (SaySomething) context.getBean("saySomething");

? ? ? ? System.out.println(saySomething.sayHi());

? ? }

運(yùn)行結(jié)果:


AOP Aspect Oriented Program 面向切面編程

Aspect Oriented Program面向切面編程,通過預(yù)編譯方式和運(yùn)行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP采取橫向抽取機(jī)制,取代了傳統(tǒng)縱向繼承體系重復(fù)性代碼

? ? ? 核心業(yè)務(wù),比如登陸,CUD

? ? ? 周邊功能,統(tǒng)計,日志,事務(wù)管理。在spring的面向切面編程AOP思想里,即被定義為切面

? ? ? 在面向切面的思想里,核心業(yè)務(wù)功能和切面功能單獨開發(fā),然后把兩個組合在一起,就是AOP

目的:AOP 能夠?qū)⒛切┡c業(yè)務(wù)無關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任(事務(wù),日志,權(quán)限等)封裝起來,便于減少系統(tǒng)的重復(fù)代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護(hù)性。

AOP實現(xiàn)原理

? ? AOP底層將采用代理機(jī)制進(jìn)行實現(xiàn)

? ? 接口+實現(xiàn)類:spring采用jdk的動態(tài)代理Proxy

? ? 實現(xiàn)類:spring采用cglib字節(jié)碼增強(qiáng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容