日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java总结:Spring5框架(1)

發布時間:2024/7/5 java 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java总结:Spring5框架(1) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Spring5框架(1)

?

?

?

一:什么是Spring?

?

Spring框架是由于軟件開發的復雜性而創建的。Spring使用的是基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅僅限于服務器端的開發。從簡單性、可測試性和松耦合性角度而言,絕大部分Java應用都可以從Spring中受益。

◆目的:解決企業應用開發的復雜性

◆功能:使用基本的JavaBean代替EJB,并提供了更多的企業應用功能

◆范圍:任何Java應用

Spring是一個輕量級控制反轉(IoC)和面向切面(AOP)的容器框架。

?

下載使用Spring的開發包

官網:http://spring.io/?
下載地址:?
http://repo.springsource.org/libs-release-local/org/springframework/spring

特別說明:?
spring5版本是用 ?jdk8編寫的,所以要求我們的 ?jdk版本是 ?8及以上。 同時 ?tomcat的版本要求 ?8.5及 以上。

?

?

二:Spring的優勢?

?

1.方便解耦,簡化開發?
通過 Spring 提供的 IoC 容器,可以將對象間的依賴關系交由 Spring 進行控制,避免硬編碼所造 成的過度程序耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可 以更專注于上層的應用。?
2.AOP 編程的支持?
通過 Spring 的 AOP 功能,方便進行面向切面的編程,許多不容易用傳統 OOP 實現的功能可以通過 AOP 輕松應付。?
聲明式事務的支持?
可以將我們從單調煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活的進行事務的管理, 提高開發效率和質量。?

3.方便程序的測試?
可以用非容器依賴的編程方式進行幾乎所有的測試工作,測試不再是昂貴的操作,而是隨手可 做的事情。?
4.方便集成各種優秀框架?
Spring 可以降低各種框架的使用難度,提供了對各種優秀框架(Struts、Hibernate、Hessian、Quartz 等)的直接支持。?
5.降低 JavaEE API 的使用難度?
Spring 對 JavaEE API(如 ?JDBC、JavaMail、遠程調用等)進行了薄薄的封裝層,使這些 API 的 使用難度大為降低。?
6.Java 源碼是經典學習范例?
Spring 的源代碼設計精妙、結構清晰、匠心獨用,處處體現著大師對 Java 設計模式靈活運用以 及對 Java 技術的高深造詣。它的源代碼無意是 Java 技術的最佳實踐的范例。

?

三:結構?

?

?

四:程序的耦合和解耦?

4.1

package com.xy.domain;import com.xy.factory.BeanFactory; import com.xy.service.AccountService;/*** 模擬一個表現層,用于調用業務層*/ public class Client {public static void main(String[] args) { // AccountService accountService=new AccountServiceImpl();AccountService accountService= (AccountService) BeanFactory.getBean("accountService");accountService.saveAccount();} }

上面的代碼表示:?
業務層調用持 久層,并 且此時業 務層在依 賴持久層 的接口和實 現類。如 果此時沒 有持久層 實現類, 編譯 將不能通過。這種編譯期依賴關系,應該在我們開發中杜絕。我們需要優化代碼解決。

再比如:?
早期我們的 ?JDBC操作,注冊驅動時,我們為什么不使用 ?DriverManager的 ?register方法,而是采 用 ?Class.forName的方式?

public class JdbcDemo1 { /** * @Version 1.0 * @param args * @throws Exception */ public static void main(String[] args) throws Exception { //1.注冊驅動 //DriverManager.registerDriver(new com.mysql.jdbc.Driver()); Class.forName("com.mysql.jdbc.Driver"); //2.獲取連接 //3.獲取預處理 sql語句對象 //4.獲取結果集 //5.遍歷結果集 } }

原因就是:?
我們的類依賴了數據庫的具體驅動類(MySQL),如果這時候更換了數據庫品牌(比如 ?Oracle),需要 修改源碼來重新數據庫驅動。這顯然不是我們想要的。

當是我們講解 ?jdbc時,是通過反射來注冊驅動的,代碼如下:

Class.forName("com.mysql.jdbc.Driver");//此處只是一個字符串

此時的好處是,我們的類中不再依賴具體的驅動類,此時就算刪除 ?mysql 的驅動 ?jar 包,依然可以編譯(運 行就不要想了,沒有驅動不可能運行成功的)。?
同時,也產生了一個新的問題,mysql驅動的全限定類名字符串是在 java類中寫死的,一旦要改還是要修改 源碼。?
解決這個問題也很簡單,使用配置文件配置。

?

?

4.2工廠模式解耦

在實際開發中我們可以把三層的對象都使用配置文件配置起來,當啟動服務器應用加載的時候,讓一個類中的 方法通過讀取配置文件,把這些對象創建出來并存起來 。在接下來的使用的時候,直接拿過來用就好了。?
那么,這個讀取配置文件,創建和獲取三層對象的類就是工廠。

?

4.3控制反轉-Inversion Of Control

?

解耦的思路有 ?2個問題:?
1、存哪去??
分析:由于我們是很多對象,肯定要找個集合來存。這時候有 ?Map和 ?List供選擇。?
到底選 ?Map還是 ?List就看我們有沒有查找需求。有查找需求,選 ?Map。?
所以我們的答案就是?
在應用加載時,創建一個 ?Map,用于存放三層對象。?
我們把這個 ?map稱之為容器。?
2、還是沒解釋什么是工廠??
工廠就是負責給我們從容器中獲取指定對象的類。這時候我們獲取對象的方式發生了改變。 原來:?
我們在獲取對象時,都是采用 ?new的方式。是主動的。

現在:?
我們獲取對象時,同時跟工廠要,有工廠為我們查找或者創建對象。是被動的。

?

控制反轉(Inversion of Control,縮寫為IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫“依賴查找”(Dependency Lookup)。通過控制反轉,對象在被創建的時候,由一個調控系統內所有對象的外界實體將其所依賴的對象的引用傳遞給它。也可以說,依賴被注入到對象中。

?

五:IOC解耦案例

賬戶的業務層和持久層的依賴關系解決。

在開始 spring的配置之前,我們要先準備 一下環境。由于我們是使用 spring 解決依賴關系,并不是真正的要做增刪改查操作,所以此時我們沒必要寫實體 類。并且我們在此處使用的是 java工程,不是 java web工程。

5.1創建業務層接口和實現類

package com.xy.service;/*** 業務層的接口,操作賬戶*/ public interface AccountService {/*** 模擬保存賬戶*/public void saveAccount(); }package com.xy.service.Impl;import com.xy.dao.AccountDao; import com.xy.dao.impl.AccountDaoImpl; import com.xy.factory.BeanFactory; import com.xy.service.AccountService;/***賬戶的業務層實現類*/ public class AccountServiceImpl implements AccountService { // private AccountDao accountDao=new AccountDaoImpl();private AccountDao accountDao= (AccountDao) BeanFactory.getBean("accountDao");public void saveAccount() {accountDao.saveAccount();} }

5.2創建持久層接口和實現類

package com.xy.dao;/*** 持久層接口*/ public interface AccountDao {/*** 模擬保存賬戶*/public void saveAccount(); }package com.xy.dao.impl;import com.xy.dao.AccountDao;public class AccountDaoImpl implements AccountDao {public void saveAccount() {System.out.println("保存了賬戶");} }

5.3XML文件配置

第一步:在pom.xml中導入必備的spring包。

第二步:在類的根路徑下創建一個bean.xml文件。

第三步:給配置文件導入約束:

打開你的spring包的位置:/spring-framework-5.1.6.RELEASE/docs/spring-framework-reference/core.html,找到以下

內容:

?

在bean.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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">

?

第四步:讓spring管理資源,在配置文件中配置service和dao:

<!--把對象的創建交給spring來管理--><bean id="accountService" class="com.xy.service.Impl.AccountServiceImpl"></bean><bean id="accountDao" class="com.xy.dao.impl.AccountDaoImpl"></bean>

?

第五步:測試:

package com.xy.domain;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.xy.dao.AccountDao; import com.xy.service.AccountService; import com.xy.service.Impl.AccountServiceImpl; import org.springframework.context.support.FileSystemXmlApplicationContext;/*** 模擬一個表現層,用于調用業務層*/ public class Client {/*** 獲取spring的IOC容器,并根據id獲取對象* @param args*/public static void main(String[] args) {//1.獲取核心容器對象ApplicationContext applicationContext=new ClassPathXmlApplicationContext("bean.xml");//根據id獲取Bean對象AccountService accountService= (AccountService) applicationContext.getBean("accountService");AccountDao accountDao=applicationContext.getBean("accountDao",AccountDao.class);System.out.println(accountService);System.out.println(accountDao);} }

?

運行:

?

5.4spring 中工廠的類結構圖

?

獲取spring的Ioc核心容器,并根據id獲取對象ApplicationContext的三個常用實現類:ClassPathXmlApplicationContext:它可以加載類路徑下的配置文件,要求配置文件必須在類路徑下。不在的話,加載不了。(更常用)FileSystemXmlApplicationContext:它可以加載磁盤任意路徑下的配置文件(必須有訪問權限)AnnotationConfigApplicationContext:它是用于讀取注解創建容器的,是明天的內容。核心容器的兩個接口引發出的問題:ApplicationContext: 單例對象適用 采用此接口它在構建核心容器時,創建對象采取的策略是采用立即加載的方式。也就是說,只要一讀取完配置文件馬上就創建配置文件中配置的對象。BeanFactory: 多例對象使用它在構建核心容器時,創建對象采取的策略是采用延遲加載的方式。也就是說,什么時候根據id獲取對象了,什么時候才真正的創建對象。

5.5IOC 中 ?bean 標簽和管理對象細節

作用:?
用于配置對象讓 ?spring來創建的。?
默認情況下它調用的是類中的無參構造函數。如果沒有無參構造函數則不能創建成功。?
屬性:?
id:給對象在容器中提供一個唯一標識。用于獲取對象。?
class:指定類的全限定類名。用于反射創建對象。默認情況下調用無參構造函數。?
scope:指定對象的作用范圍。?
* singleton :默認值,單例的.?
* prototype :多例的.?
* request :WEB項目中,Spring創建一個 Bean的對象,將對象存入到 request域中. * session :WEB項目中,Spring創建一個 Bean的對象,將對象存入到 session域中.

* global session:WEB項目中,應用在 ?Portlet環境.如果沒有 ?Portlet環境那么globalSession相當于 ?session.

init-method:指定類中的初始化方法名稱。

destroy-method:指定類中銷毀方法名稱。

?bean 的作用范圍和生命周期:

Spring對bean的管理細節:1.創建bean的三種方式: 第一種方式:使用默 認無參構造函數? 在默認情況下:? 它會根據默認無參構造函數來創建類對象。如果 ?bean中沒有默認無參構造函數,將會創建失敗。 <bean id="accountService" class="com.xy.service.impl.AccountServiceImpl"></bean> 第二種:使用普通工廠中的方法創建對象(使用某個類中的方法創建對象),并存入spring容器: 模擬一個工廠: package com.xy.factory;import com.xy.service.AccountService; import com.xy.service.impl.AccountServiceImpl;public class testFactory {public AccountService getAccountService(){return new AccountServiceImpl();} } ? <bean id="testFactory" class="com.xy.factory.testFactory"></bean><bean id="getaccountService" factory-bean="testFactory" factory-method="getAccountService"></bean> 第三種:使用工廠中的靜態方法創建對象(使用某個類中的靜態方法創建對象,并存入spring容器): package com.xy.factory;import com.xy.service.AccountService; import com.xy.service.impl.AccountServiceImpl;public class testSFactory {public static AccountService getAccountService(){return new AccountServiceImpl();} }<bean id="getAccountService" class="com.xy.factory.testSFactory" factory-method="getAccountService" scope="prototype"init-method="init" destroy-method="destroy"></bean> 2.bean對象的三種范圍 <!--beand的作用范圍:默認是單例的bean的scope屬性指定作用范圍取值:singleton 單例的(默認值)prototype 多例的request 作用于web應用的請求范圍session 作用于web應用的會話范圍global-session 作用于集群環境的會話范圍,當不是集群環境時它就是session--> 3.bean對象的生命周期 <!--bean的生命周期:單例對象:出生:當容器創建時對象出生存活:當容器存活時對象存活死亡:當容器死亡對象死亡多例對象:出生:使用對象時spring框架為我們創建存活:對象在使用過程中就一直活著死亡:當對象長時間不用,且沒有別的對象引用時,由Java的垃圾回收器回收-->

?

六:依賴注入(DI)

<!--Spring的依賴注入依賴注入:Dependency InjectionIOCd的作用:降低程序間的耦合依賴關系的管理:以后交給Spring來維護在當前類需要用到其他類的對象,由spring為我們提供,我們只需要在配置文件中說明依賴關系的維護:就稱之為依賴注入。依賴注入:能注入的數據有三類基本類型和String其他bean類型(在配置文件中或者注解配置過的bean)復雜類型、集合類型注入的方式有三種:1.使用構造函數2.使用set方法3.使用注解-->

?

6.1構造函數注入:

<!--1.構造函數注入使用的標簽:constructor-arg標簽出現的位置:bean標簽的內部標簽中的屬性:type:用于指定要注入的數據類型,該數據類型也是構造函數中的參數類型index:用于給構造函數中的指定索引位置的參數賦值,索引位置從0開始name:用于給構造函數中的指定名稱的參數賦值 常用value:用于提供基本類型和String類型的數據ref:用于指定其他的bean類型數據。它指的就是在Spring的IOC容器中出現過的bean對象優勢:在獲取bean對象時候,注入數據是必須的操作,否則對象無法創建成功劣勢:改變了bean對象的實例化方式,使我們在創建對象時,如果用不到這些數據,也必須提供--><bean class="com.xy.service.impl.AccountServiceImpl" id="accountService"><constructor-arg name="name" value="test"></constructor-arg><constructor-arg name="age" value="19"></constructor-arg><constructor-arg name="birthday" ref="now"></constructor-arg></bean><!--配置一個日期對象--><bean class="java.util.Date" id="now"></bean>

創建構造函數:

import com.xy.service.AccountService;import java.util.Date;/*** 賬戶的業務層實現類*/ public class AccountServiceImpl implements AccountService {private String name;private Integer age;private Date birthday;public AccountServiceImpl(String name, Integer age, Date birthday) {this.name = name;this.age = age;this.birthday = birthday;}public void saveAccount(){System.out.println("service 中的saveAccount()方法執行"+name+",age"+age+",birthday"+birthday);}}

?

6.3SET方法注入

!--2.set方法注入 更常用的注入方式標簽:property位置:bean標簽內部屬性:name:用來指定注入時所調用的set方法名稱value:用于提供基本類型和String類型的數據ref:用于提供其它的bean類型數據優勢:創建對象時,沒有明確的限制,可以直接使用默認構造函數弊端:如果某個成員必須有值,則獲取對象是有可能set方法沒有執行-->

創建帶有set方法的業務層實現類:

package com.xy.service.impl;import com.xy.service.AccountService;import java.util.Date;/*** 賬戶的業務層實現類*/ public class AccountServiceImpl1 implements AccountService {private String name;private Integer age;private Date birthday;public void setName(String name) {this.name = name;}public void setAge(Integer age) {this.age = age;}public void setBirthday(Date birthday) {this.birthday = birthday;}public void saveAccount(){System.out.println("service 中的saveAccount()方法執行"+name+",age"+age+",birthday"+birthday);}} <bean class="com.xy.service.impl.AccountServiceImpl1" id="accountService1"><property name="name" value="test1"></property><property name="age" value="19"></property><property name="birthday" ref="now"></property></bean>

6.3使用注解注入

此種方式是通過在 xml中導入 p名稱空間,使用 p:propertyName來注入數據,它的本質仍然是調用類中的 set方法實現注入功能。

?

6.4集合注入

<!--復雜類型、集合類型的注入用于給List結構集合注入的標簽:List,array,set集合標簽用于給Map結構集合注入的標簽:map,props -->

創建帶集合的業務層實現類:

package com.xy.service.impl;import com.xy.service.AccountService;import java.util.*;/*** 賬戶的業務層實現類*/ public class AccountServiceImpl2 implements AccountService {private String []myString;private List<String> myList;private Set<String> mySet;private Map<String,String> myMap;private Properties myProperties;public void setMyString(String[] myString) {this.myString = myString;}public void setMyList(List<String> myList) {this.myList = myList;}public void setMySet(Set<String> mySet) {this.mySet = mySet;}public void setMyMap(Map<String, String> myMap) {this.myMap = myMap;}public void setMyProperties(Properties myProperties) {this.myProperties = myProperties;}public void saveAccount(){System.out.println(Arrays.toString(myString));System.out.println(myList);System.out.println(mySet);System.out.println(myMap);System.out.println(myProperties);}} <bean class="com.xy.service.impl.AccountServiceImpl2" id="accountService2"><property name="myString"><array><value>A</value><value>B</value><value>C</value></array></property><property name="mySet"><set><value>A</value><value>B</value><value>C</value></set></property><property name="myList"><list><value>A</value><value>B</value><value>C</value></list></property><property name="myMap"><map><entry key="testA" value="AAA"></entry><entry key="testB" value="BBB"></entry><entry key="testC" value="CCC"></entry></map></property><property name="myProperties"><props><prop key="testA">AAA</prop><prop key="testB">BBB</prop><prop key="testC">CCC</prop></props></property></bean>

?

其他內容請瀏覽本博主其它博客。

網站

?

總結

以上是生活随笔為你收集整理的Java总结:Spring5框架(1)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。