一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳談Spring對IOC的理解(推薦篇)

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

2021-01-22 11:33小Cai先森 Java教程

下面小編就為大家帶來一篇詳談Spring對IOC的理解(推薦篇)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

一、ioc控制反轉和di依賴注入

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

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

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

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

二、使用xml配置方式實現ioc

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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類的實例(正常情況下需要new一個dao類對象),但是用ioc容器接管后只需要聲明dao接口對象即可,然后寫一個dao對象的set方法。(要注入的對象必須要有set方法,否則將報錯 bean property 'bookdao' is not writable or has an invalid setter method)因為spring注入是根據反射機制實現的,他在反射注入的時候會調用該方法名的set方法,如果set方法寫錯,或者根本沒寫,那么注入就會失敗。(bookservice類如下)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class bookservice {
 private bookdao bookdao;
 
 public bookservice() {
  system.out.println("bookservice實例化");
 }
 
 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作為容器,初始化配置文件,然后從容器中根據id名取出容器中已經幫我們實例化好的對象。

?
1
2
3
4
5
6
7
8
9
10
11
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");
 }
}

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

4.dao類和實現類如下:

接口類:

?
1
2
3
public interface bookdao {
  public string addbook(string bookname);
 }

實現類:

?
1
2
3
4
5
6
7
8
9
10
public class bookdaoimpl implements bookdao {
 
 public bookdaoimpl() {
  system.out.println("bookdao實例化");
 }
 
 public string addbook(string bookname) {
  return bookname+"添加成功";
 }
}

5.運行測試結果:

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

6.大體思路如下圖:

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

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

二、注解方式配置ioc

注解配置方式目的和xml配置的目的一樣,都是為了實現bean的創建。常用的注解如下:

@component 在類定義之前添加@component注解,他會被spring容器識別,并轉為bean。

@repository 對dao實現類進行注解 (特殊的@component)

@service 用于對業務邏輯層進行注解, (特殊的@component)

@controller 用于控制層注解 , (特殊的@component)

裝配注解如下:

@autowired 默認按照類型裝配注入,想按照名稱來裝配的話要結合@quapfier(“name”)一起使用,使用@autowired注解可以不用set方法。@autowired 注釋進行自動注入時,spring 容器中匹配的候選 bean 數目必須有且僅有一個

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

@resource 默認按照名稱裝配注入,當找不到對應名成的bean的時候就按照類型匹配,如果還是找不到的話就會報錯,@autowired是spring提供的,@resource是javaee提供,使用@resource可以減少對spring的依賴

范例:

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

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

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

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

context的配置有如下方法:

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

?
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  (正則表達式)
custom org.example.mytypefilter spring3新增自定義type,org.springframework.core.type.typefilter

 

?
1
2
3
4
5
6
7
<!-- 容器掃描包下的注解配置組件 -->
  <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的理解(推薦篇)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/caijh/p/7688044.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 鬼吹灯天星术在线高清观看 | 欧美日韩高清完整版在线观看免费 | 亚洲高清无码在线 视频 | 国产成人精品实拍在线 | 亚洲精品第五页中文字幕 | 亚洲精品九色在线网站 | 校花小雪灌满了男人们的浓浆 | 狠狠色综合久久婷婷色天使 | 1024人成网站色 | 糖心vlog麻豆精东影业传媒 | 福利久草 | 99精品国产自在现线观看 | 美女扒下内裤让男人桶的图片 | 亚洲国产成人精品无码区5566 | 亚洲欧美一级夜夜爽w | 99在线免费观看视频 | 国产精品每日在线观看男人的天堂 | 四虎成人免费视频 | 日本妻子迷妹网 | 青青青久在线视频免费观看 | 特黄特色大片免费影院 | 婷婷伊人综合亚洲综合网 | 国产精品66福利在线观看 | 色综合久久天天综合观看 | 操双性人| 2021小妲己永久回家地址 | 男女性潮高片无遮挡禁18 | sss亚洲国产欧美一区二区 | 男插女的下面免费视频夜色 | 高清国产激情视频在线观看 | 国产精品男人的天堂 | 色综合合久久天天综合绕视看 | 黑人异族日本人hd | 九九精品免视频国产成人 | 亚洲国产日韩欧美一区二区三区 | 天堂8在线天堂bt | 激情六月丁香婷婷四房播 | 欧美gay xxxx| 亚洲图片综合网 | 亚洲性久久久影院 | 韩国伦理hd |