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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java元婴期(17)----java进阶(spring(1)----spring基本概念IOC)

發(fā)布時(shí)間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java元婴期(17)----java进阶(spring(1)----spring基本概念IOC) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.spring是什么?

Spring是分層的Java SE/EE應(yīng)用 full-stack輕量級(jí)開源框架,以IoC(Inverse Of Control:反轉(zhuǎn)控制)AOP(Aspect Oriented Programming:面向切面編程)為內(nèi)核,提供了展現(xiàn)層Spring MVC和持久層Spring JDBC以及業(yè)務(wù)層事務(wù)管理等眾多的企業(yè)級(jí)應(yīng)用技術(shù),還能整合開源世界眾多著名的第三方框架和類庫(kù),逐漸成為使用最多的Java EE企業(yè)應(yīng)用開源框架。

2.spring的優(yōu)勢(shì)

方便解耦,簡(jiǎn)化開發(fā)
通過(guò)Spring提供的IoC容器,可以將對(duì)象間的依賴關(guān)系交由Spring進(jìn)行控制,避免硬編碼所造成的過(guò)度程序耦合。用戶也不必再為單例模式類、屬性文件解析等這些很底層的需求編寫代碼,可以更專注于上層的應(yīng)用。
AOP編程的支持
通過(guò)Spring的AOP功能,方便進(jìn)行面向切面的編程,許多不容易用傳統(tǒng)OOP實(shí)現(xiàn)的功能可以通過(guò)AOP輕松應(yīng)付。
聲明式事務(wù)的支持
可以將我們從單調(diào)煩悶的事務(wù)管理代碼中解脫出來(lái),通過(guò)聲明式方式靈活的進(jìn)行事務(wù)的管理,提高開發(fā)效率和質(zhì)量。
方便程序的測(cè)試
可以用非容器依賴的編程方式進(jìn)行幾乎所有的測(cè)試工作,測(cè)試不再是昂貴的操作,而是隨手可做的事情。
方便集成各種優(yōu)秀框架
Spring可以降低各種框架的使用難度,提供了對(duì)各種優(yōu)秀框架(Struts、Hibernate、Hessian、Quartz等)的直接支持。
降低JavaEE API的使用難度
Spring對(duì)JavaEE API(如JDBC、JavaMail、遠(yuǎn)程調(diào)用等)進(jìn)行了薄薄的封裝層,使這些API的使用難度大為降低。
Java源碼是經(jīng)典學(xué)習(xí)范例
Spring的源代碼設(shè)計(jì)精妙、結(jié)構(gòu)清晰、匠心獨(dú)用,處處體現(xiàn)著大師對(duì)Java設(shè)計(jì)模式靈活運(yùn)用以及對(duì)Java技術(shù)的高深造詣。它的源代碼無(wú)意是Java技術(shù)的最佳實(shí)踐的范例。

3.什么是程序的耦合

程序的耦合度是 你的子程序之間的相關(guān)聯(lián)性,也就是說(shuō)你的多個(gè)類的聯(lián)系 是否太緊密,打個(gè)比方,你房子里邊有窗子 ,那房子 和窗子 就有了關(guān)聯(lián),耦合度是松還是緊 就看你的 關(guān)聯(lián) 是強(qiáng)還是弱,也就是修改的代價(jià),比如 你窗子是扣死在墻里的 那么你修改窗子 就必須修改墻 這就比較緊密了,但是如果你窗子是按照某種規(guī)格的 可以自由拆裝的 那么修改的代價(jià)就小,耦合度也就低了。我們寫程序的目標(biāo)就是 高內(nèi)聚 低耦合這樣修改起來(lái) 就不會(huì)有太多的聯(lián)系 不用 改一個(gè)地方 其他的都要修改

4.工廠模式解耦

在實(shí)際開發(fā)中我們可以把三層的對(duì)象都使用配置文件配置起來(lái),當(dāng)啟動(dòng)服務(wù)器應(yīng)用加載的時(shí)候,讓一個(gè)類中的方法通過(guò)讀取配置文件,把這些對(duì)象創(chuàng)建出來(lái)并存起來(lái)。在接下來(lái)的使用的時(shí)候,直接拿過(guò)來(lái)用就好了。 那么,這個(gè)讀取配置文件,創(chuàng)建和獲取三層對(duì)象的類就是工廠。

原來(lái): 我們?cè)讷@取對(duì)象時(shí),都是采用new的方式。是主動(dòng)的。

? ? ?

現(xiàn)在: 我們獲取對(duì)象時(shí),同時(shí)跟工廠要,有工廠為我們查找或者創(chuàng)建對(duì)象。是被動(dòng)的。

? ?? ??

(重點(diǎn))5.IOC(控制反轉(zhuǎn))

(重點(diǎn)掌握)明確ioc的作用:

? ? ? ? 削減計(jì)算機(jī)程序的耦合(解除我們代碼中的依賴關(guān)系)。

?

6.使用spring的IOC削減程序耦合只能削減,若是能消除的話,那說(shuō)明這兩個(gè)類中必定有一個(gè)是多余的

1.打開idea創(chuàng)建maven項(xiàng)目

2.在pom文件中配置相應(yīng)的spring的jar包依賴

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.itheima</groupId><artifactId>day01_eesy_03spring</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.2.RELEASE</version></dependency></dependencies> </project>

3..在resources文件夾下新建一個(gè)名叫ApplicationContext的xml文件,并配置好約束idea里可以直接右鍵創(chuàng)建spring的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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>

4.創(chuàng)建完相關(guān)service,dao,ui層后(這里只是模擬三層架構(gòu))。開始利用spring的控制反轉(zhuǎn)來(lái)實(shí)現(xiàn)逐層的調(diào)用。ui調(diào)用service,service調(diào)用dao層

  • 獲取核心容器對(duì)象
  • 根據(jù)id獲取Bean對(duì)象
  • 把對(duì)象的創(chuàng)建交給spring來(lái)管理
package com.itheima.ui;import com.itheima.dao.IAccountDao; import com.itheima.service.IAccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;/*** 模擬一個(gè)表現(xiàn)層,用于調(diào)用業(yè)務(wù)層*/ public class Client {/*** 獲取spring的Ioc核心容器,并根據(jù)id獲取對(duì)象* @param args*/public static void main(String[] args) {//1.獲取核心容器對(duì)象ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml"); // ApplicationContext ac = new FileSystemXmlApplicationContext("C:\\Users\\zhy\\Desktop\\bean.xml");//2.根據(jù)id獲取Bean對(duì)象IAccountService as = (IAccountService)ac.getBean("accountService");IAccountDao adao = ac.getBean("accountDao",IAccountDao.class);System.out.println(as);System.out.println(adao);as.saveAccount();} }

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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!--把對(duì)象的創(chuàng)建交給spring來(lái)管理--><bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"></bean><bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean> </beans>

7.spring中工廠類的結(jié)構(gòu)圖

??

1.BeanFactory 和ApplicationContext 的區(qū)別與聯(lián)系:

聯(lián)系:

  • BeanFactory 才是Spring 容器中的頂層接口
  • ApplicationContext 是它的子接口

BeanFactory 和ApplicationContext 的區(qū)別:

創(chuàng)建對(duì)象的時(shí)間點(diǎn)不一樣。

  • ApplicationContext:只要一讀取配置文件,默認(rèn)情況下就會(huì)創(chuàng)建對(duì)象
  • BeanFactory:什么時(shí)候使用什么時(shí)候創(chuàng)建對(duì)象

2.ApplicationContext 接口的實(shí)現(xiàn)類

ClassPathXmlApplicationContext:

它是從類的根路徑下加載配置文件 推薦使用這種
FileSystemXmlApplicationContext:
它是從磁盤路徑上加載配置文件,配置文件可以在磁盤的任意位置。
AnnotationConfigApplicationContext:
當(dāng)我們使用注解配置容器對(duì)象時(shí),需要使用此類來(lái)創(chuàng)建spring 容器。它用來(lái)讀取注解。

8.IOC中bean標(biāo)簽和管理對(duì)象細(xì)節(jié)

  • bean標(biāo)簽
  • bean的作用范圍和生命周期
  • 實(shí)例化Bean的三種方式
  • 1.bean標(biāo)簽

    作用:

    用于配置對(duì)象讓spring來(lái)創(chuàng)建的。

    默認(rèn)情況下它調(diào)用的是類中的無(wú)參構(gòu)造函數(shù)。如果沒(méi)有無(wú)參構(gòu)造函數(shù)則不能創(chuàng)建成功。

    屬性:

    id:給對(duì)象在容器中提供一個(gè)唯一標(biāo)識(shí)。用于獲取對(duì)象。

    class:指定類的全限定類名。用于反射創(chuàng)建對(duì)象。默認(rèn)情況下調(diào)用無(wú)參構(gòu)造函數(shù)。

    scope:指定對(duì)象的作用范圍。

    • ?singleton :默認(rèn)值,單例的.
    • ?prototype :多例的.
    • ?request :WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到request域中.
    • ?session :WEB項(xiàng)目中,Spring創(chuàng)建一個(gè)Bean的對(duì)象,將對(duì)象存入到session域中.
    • ?global session :WEB項(xiàng)目中,應(yīng)用在Portlet環(huán)境.如果沒(méi)有Portlet環(huán)境那么globalSession相當(dāng)于session.

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

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

    2.bean的作用范圍和生命周期

    單例對(duì)象:scope="singleton"

    一個(gè)應(yīng)用只有一個(gè)對(duì)象的實(shí)例。它的作用范圍就是整個(gè)引用。

    生命周期:

    • 對(duì)象出生:當(dāng)應(yīng)用加載,創(chuàng)建容器時(shí),對(duì)象就被創(chuàng)建了。
    • 對(duì)象活著:只要容器在,對(duì)象一直活著。
    • 對(duì)象死亡:當(dāng)應(yīng)用卸載,銷毀容器時(shí),對(duì)象就被銷毀了。

    多例對(duì)象:scope="prototype"

    每次訪問(wèn)對(duì)象時(shí),都會(huì)重新創(chuàng)建對(duì)象實(shí)例。

    生命周期:

    • 對(duì)象出生:當(dāng)使用對(duì)象時(shí),創(chuàng)建新的對(duì)象實(shí)例。
    • 對(duì)象活著:只要對(duì)象在使用中,就一直活著。
    • 對(duì)象死亡:當(dāng)對(duì)象長(zhǎng)時(shí)間不用時(shí),被java的垃圾回收器回收了。

    3.實(shí)例化Bean的三種方式

    第一種方式:使用默認(rèn)無(wú)參構(gòu)造函數(shù)

    <!--在默認(rèn)情況下: 它會(huì)根據(jù)默認(rèn)無(wú)參構(gòu)造函數(shù)來(lái)創(chuàng)建類對(duì)象。如果bean中沒(méi)有默認(rèn)無(wú)參構(gòu)造函數(shù),將會(huì)創(chuàng)建失敗。--><bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl"/>

    第二種方式:spring管理靜態(tài)工廠-使用靜態(tài)工廠的方法創(chuàng)建對(duì)象

    /** * 模擬一個(gè)靜態(tài)工廠,創(chuàng)建業(yè)務(wù)層實(shí)現(xiàn)類 */public class StaticFactory { public static IAccountService createAccountService(){ return new AccountServiceImpl();} } <!-- 此種方式是: 使用StaticFactory類中的靜態(tài)方法createAccountService創(chuàng)建對(duì)象,并存入spring容器 id屬性:指定bean的id,用于從容器中獲取 class屬性:指定靜態(tài)工廠的全限定類名 factory-method屬性:指定生產(chǎn)對(duì)象的靜態(tài)方法 --><bean id="accountService" class="com.itheima.factory.StaticFactory" factory-method="createAccountService"></bean>

    第三種方式:spring管理實(shí)例工廠-使用實(shí)例工廠的方法創(chuàng)建對(duì)象

    /** * 模擬一個(gè)實(shí)例工廠,創(chuàng)建業(yè)務(wù)層實(shí)現(xiàn)類 * 此工廠創(chuàng)建對(duì)象,必須現(xiàn)有工廠實(shí)例對(duì)象,再調(diào)用方法 */public class InstanceFactory { public IAccountService createAccountService(){return new AccountServiceImpl();}} <!-- 此種方式是: 先把工廠的創(chuàng)建交給spring來(lái)管理。 然后在使用工廠的bean來(lái)調(diào)用里面的方法 factory-bean屬性:用于指定實(shí)例工廠bean的id。 factory-method屬性:用于指定實(shí)例工廠中創(chuàng)建對(duì)象的方法。 --><bean id="instancFactory" class="com.itheima.factory.InstanceFactory"></bean> <bean id="accountService" factory-bean="instancFactory" factory-method="createAccountService"></bean>

    ?

    總結(jié)

    以上是生活随笔為你收集整理的java元婴期(17)----java进阶(spring(1)----spring基本概念IOC)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。