最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳談Spring對IOC的理解(推薦篇)

 更新時間:2017年10月20日 08:47:40   作者:小Cai先森  
下面小編就為大家?guī)硪黄斦凷pring對IOC的理解(推薦篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、IOC控制反轉(zhuǎn)和DI依賴注入

1.控制反轉(zhuǎn),字面可以理解為:主動權(quán)的轉(zhuǎn)移,原來一個應(yīng)用程序內(nèi)的對象是類通過new去主動創(chuàng)建并實(shí)例化的,對對像創(chuàng)建的主動權(quán)在程序代碼中。程序不僅要管理業(yè)務(wù)邏輯也要管理對的象創(chuàng)建和依賴關(guān)系。這是很累的,也跟軟件工程 "低耦合高內(nèi)聚" 的概念不十分符合。

有了spring的ioc容器之后,對象的實(shí)例化和依賴關(guān)系管理都由IOC容器進(jìn)行統(tǒng)一管理,主體類只要依賴ioc容器就夠了,需要啥,容器會給他注入進(jìn)去,也就是只要聲明對象不用再主動去new,ioc容器幫忙把相應(yīng)的對象注入到聲明對象中,使其變成實(shí)例化對象。(類似主體類提供一個軀體,ioc容器把靈魂注入進(jìn)去,使其變成一個生命體,激活他),這樣創(chuàng)建對象的主動權(quán)就轉(zhuǎn)移交接了,

  

二、使用xml配置方式實(shí)現(xiàn)IOC

1.在ioc容器中配置了dao實(shí)現(xiàn)類和service類的bean,在容器加載的時候就會實(shí)例化這些bean到內(nèi)存中。(bean.xml配置如下)

<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
  ">

  <!-- BookDao Bean -->
  <bean id="bookDao" class="com.study.DaoImpl.BookDaoImpl"></bean>

  <!-- BookService Bean-->
  <bean id="bookService" class="com.study.Service.BookService">
    <!-- BookService中的聲明了BookDao對象,通過ref屬性將BookDao的bean注入到對象中 -->
    <property name="bookDao" ref="bookDao"/>
  </bean>
</beans>

2. service類中需要用到dao類的實(shí)例(正常情況下需要new一個dao類對象),但是用ioc容器接管后只需要聲明dao接口對象即可,然后寫一個dao對象的set方法。(要注入的對象必須要有set方法,否則將報錯 Bean property 'bookDao' is not writable or has an invalid setter method)因?yàn)閟pring注入是根據(jù)反射機(jī)制實(shí)現(xiàn)的,他在反射注入的時候會調(diào)用該方法名的set方法,如果set方法寫錯,或者根本沒寫,那么注入就會失敗。(BookService類如下)

public class BookService {
 private BookDao bookDao;

 public BookService() {
  System.out.println("BookService實(shí)例化");
 }

 public void setBookDao(BookDao bookDao) {
  System.out.println("BookService屬性初始化裝配成功");
  this.bookDao = bookDao;
 }

 public void storeBook(String bookname){
  System.out.println("圖書上架");
  System.out.println(bookDao.addBook(bookname));
 }
}

如上代碼:BookSerivce類需要用到BookDao對象,但是卻沒有new對象,只有一個set方法,這個set方法就是ioc容器注入的入口(必不可少),

3.此處我們用ApplicationContext作為容器,初始化配置文件,然后從容器中根據(jù)id名取出容器中已經(jīng)幫我們實(shí)例化好的對象。

public class TestDmeo {
 BookService bookService;

 @Test
 public void testStoreBook(){
  System.out.println("容器初始化");
  ApplicationContext app = new ClassPathXmlApplicationContext("bean.xml");
  bookService = (BookService) app.getBean("bookService");//將對象注入到聲明好的BookService對象中。(bookService就是配置文件中的id)
  bookService.storeBook("Spring MVC");
 }
}

 

4.dao類和實(shí)現(xiàn)類如下:

接口類:

public interface BookDao {
  public String addBook(String BookName);
 }

實(shí)現(xiàn)類:

public class BookDaoImpl implements BookDao {

 public BookDaoImpl() {
  System.out.println("BookDao實(shí)例化");
 }

 public String addBook(String BookName) {
  return BookName+"添加成功";
 }
}

5.運(yùn)行測試結(jié)果:

6.大體思路如下圖:

程序中除了初始化容器用了new對象,其余的基本沒有new的存在。

二、注解方式配置IOC

注解配置方式目的和xml配置的目的一樣,都是為了實(shí)現(xiàn)bean的創(chuàng)建。常用的注解如下:

@Component 在類定義之前添加@Component注解,他會被spring容器識別,并轉(zhuǎn)為bean。

@Repository 對Dao實(shí)現(xiàn)類進(jìn)行注解 (特殊的@Component)

@Service 用于對業(yè)務(wù)邏輯層進(jìn)行注解, (特殊的@Component)

@Controller 用于控制層注解 , (特殊的@Component)

裝配注解如下:

@Autowired 默認(rèn)按照類型裝配注入,想按照名稱來裝配的話要結(jié)合@Quapfier(“name”)一起使用,使用@Autowired注解可以不用set方法。@Autowired 注釋進(jìn)行自動注入時,Spring 容器中匹配的候選 Bean 數(shù)目必須有且僅有一個

@Quapfier("name") 中的name是bean的名字,也就是id,和@Autowired可以作為限定專配對象的名稱

@Resource 默認(rèn)按照名稱裝配注入,當(dāng)找不到對應(yīng)名成的bean的時候就按照類型匹配,如果還是找不到的話就會報錯,@Autowired是spring提供的,@Resource是javaee提供,使用@Resource可以減少對spring的依賴

范例:

1.例子同上,只是配置bean的方式從xml文件中轉(zhuǎn)移到了代碼中,用注解體現(xiàn)。

2.除了把配置文件中<bean id="" class=""/>變成對應(yīng)的注解外,另外一個區(qū)別在于,bean.xml文件中的修改,需要做如下,配置才能夠使注解生效

context的配置有如下方法:

1.僅掃描特定包下的特定類

<context:component-scan base-package="com.study" resource-pattern="Service/B*.class"/>

這是掃描Service包下B開頭的所有類。

2.使用<context:include-filter .../>和<context:exclude-filter .../>配置那些需要和不需要的掃描的包

Filter Type Examples Expression Description
annotation org.example.SomeAnnotation 符合SomeAnnoation的target class(注解類)
assignable org.example.SomeClass 指定class或interface的全名(指定確切的類或接口)
aspectj org.example..*Service+ AspectJ語法
regex org\.example\.Default.* Regelar Expression ?。ㄕ齽t表達(dá)式)
custom org.example.MyTypeFilter Spring3新增自定義Type,org.springframework.core.type.TypeFilter

<!-- 容器掃描包下的注解配置組件 -->
  <context:component-scan base-package="com.study" use-default-filters="false">
    <context:include-filter type="aspectj" expression="com.study.Service.*"/> <!-- 模糊過濾 -->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Component"/><!-- 過濾指定的注解 -->
    <context:include-filter type="assignable" expression="com.study.Service.BookService"/><!-- 過濾指定的類或接口,路徑要完整,如果是接口的話,所有派生類都會被過濾 -->
    <context:include-filter type="regex" expression="com.*"/>
  </context:component-scan>

<context:exclude-filter ../>要配在<context:include-filter .../>的后面。

以上這篇詳談Spring對IOC的理解(推薦篇)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot整合ShedLock解決定時任務(wù)防止重復(fù)執(zhí)行的問題

    SpringBoot整合ShedLock解決定時任務(wù)防止重復(fù)執(zhí)行的問題

    ShedLock是一個用于分布式系統(tǒng)中防止定時任務(wù)重復(fù)執(zhí)行的庫,本文主要介紹了SpringBoot整合ShedLock解決定時任務(wù)防止重復(fù)執(zhí)行的問題,具有一定的參考價值,感興趣的可以了解一下
    2025-01-01
  • MybatisPlus中的刪除和邏輯刪除及區(qū)別介紹

    MybatisPlus中的刪除和邏輯刪除及區(qū)別介紹

    這篇文章主要介紹了MybatisPlus中的刪除和邏輯刪除的相關(guān)知識,刪除又分為邏輯刪除和物理刪除,那么它們有什么區(qū)別呢?在本文給大家詳細(xì)介紹,感興趣的朋友跟隨小編一起看看吧
    2020-08-08
  • 接口簽名怎么用Java實(shí)現(xiàn)

    接口簽名怎么用Java實(shí)現(xiàn)

    今天帶大家學(xué)習(xí)java的相關(guān)知識,文章圍繞怎么用Java實(shí)現(xiàn)接口簽名展開,文中有非常詳細(xì)的代碼示例及介紹,需要的朋友可以參考下
    2021-06-06
  • Java中集合LinkedList的原理與使用方法

    Java中集合LinkedList的原理與使用方法

    這篇文章主要給大家介紹了關(guān)于Java中集合LinkedList的原理與使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • 深入了解Spring中最常用的11個擴(kuò)展點(diǎn)

    深入了解Spring中最常用的11個擴(kuò)展點(diǎn)

    我們一說到spring,可能第一個想到的是?IOC(控制反轉(zhuǎn))?和?AOP(面向切面編程)。除此之外,我們在使用spring的過程中,有沒有發(fā)現(xiàn)它的擴(kuò)展能力非常強(qiáng)。今天就來跟大家一起聊聊,在Spring中最常用的11個擴(kuò)展點(diǎn)
    2022-09-09
  • SpringBoot下RabbitMq實(shí)現(xiàn)定時任務(wù)

    SpringBoot下RabbitMq實(shí)現(xiàn)定時任務(wù)

    這篇文章主要為大家詳細(xì)介紹了SpringBoot下RabbitMq實(shí)現(xiàn)定時任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 使用java連接Redis,Maven管理操作

    使用java連接Redis,Maven管理操作

    這篇文章主要介紹了使用java連接Redis,Maven管理操作,具有很好的參考價值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • SpringBoot整合RocketMQ實(shí)現(xiàn)發(fā)送同步消息

    SpringBoot整合RocketMQ實(shí)現(xiàn)發(fā)送同步消息

    RocketMQ 是一款開源的分布式消息中間件,由阿里巴巴開源,它具有高可用性、高性能、低延遲等特點(diǎn),廣泛應(yīng)用于阿里巴巴集團(tuán)內(nèi)部以及眾多外部企業(yè)的業(yè)務(wù)系統(tǒng)中,本文給大家介紹了SpringBoot整合RocketMQ實(shí)現(xiàn)發(fā)送同步消息,需要的朋友可以參考下
    2024-04-04
  • Java中的static靜態(tài)代碼塊的使用詳解

    Java中的static靜態(tài)代碼塊的使用詳解

    本篇文章介紹了,Java中的static靜態(tài)代碼塊的使用詳解。需要的朋友參考下
    2013-04-04
  • 基于Java語言MD5加密Base64轉(zhuǎn)換方法

    基于Java語言MD5加密Base64轉(zhuǎn)換方法

    這篇文章主要為大家詳細(xì)介紹了基于Java語言的MD5加密Base64轉(zhuǎn)換方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09

最新評論

仁怀市| 琼中| 法库县| 临海市| 枣庄市| 玉门市| 肃宁县| 峡江县| 上思县| 什邡市| 钟祥市| 德化县| 诸城市| 会昌县| 磐安县| 牡丹江市| 将乐县| 红安县| 黄山市| 三河市| 五峰| 永靖县| 平武县| 松溪县| 沂南县| 彩票| 丹寨县| 封丘县| 临西县| 嘉峪关市| 昭觉县| 霍州市| 天门市| 宜君县| 广水市| 什邡市| 临漳县| 曲阳县| 积石山| 清苑县| 孝义市|