spring 注入詳解

剛剛接觸spring 最近一直不懂注入是什麼,看到好多篇文章,現在總結一下spring的IOC
首先什麼是IOC,學名叫控制反轉,但是由於不好理解字面意思,後來又叫依賴注入。
依賴注入是什麼呢,這個一看名字就知道了,需要依賴別人才能實現自己的需求,而在spring中,我們可以設置很多Bean實例,在java中我們不用自己創建對象就能自己獲取自己的實例,當然默認情況下都是單例模式。是不是很神奇,那麼我們就先看看都有幾種實現這種功能的方法:
第一、setter 方法
applicationContext.xml配置

<bean id="testService" class="org.lc.controller.TestController">
        <property name="testService" ref="testServiceImpl"></property>
    </bean>
    <bean id="testServiceImpl" class="org.lc.service.impl.TestServiceImpl"/>

TestController配置
(ps:今天運行了一上午,都發現spring的依賴注入一直運行不出來,一直提示我請求過多,我也是在網上看了各路大神的問題解決方案,發現根本沒找到我想要的答案。最後在自己的琢磨下,發現要想注入到Controller層必須在spring mvc注入,而且注入的類不能被掃描即不能寫註解@Controller(因爲我寫了掃描)。這樣終於運行成功了。在這個過程中也學到了一些spring的原理:
1、在spring-MVC.xml定義的Bean可以直接在spring.xml(applicationContext.xml)中引用,而反過來不行。
2、引入配置文件只能在一個地方寫,我見網上是這樣寫的,在一個xml配置這樣一個配置文件,然後再引入其它配置文件。這也算是spring讓我們逼我們乾的吧,結構邏輯比較清晰,不會寫的太亂。
好了,廢話不多說,把上面的改了,改到spring-mvc.xml不然沒法加載請求(好像是加載請求還要依賴於Bean),會報404,依賴注入從新開始)
第一 、setter方法
spring-mvc.xml配置

<bean id="testService" class="org.lc.controller.TestController">
        <property name="testService" ref="testServiceImpl"></property>
    </bean>
    <bean id="testServiceImpl" class="org.lc.service.impl.TestServiceImpl"/>

TestController配置

@RequestMapping("/test")
public class TestController {

    private TestService testService;
    public void setTestService(TestService testService){
        this.testService=testService;
    }
}

第二、構造方法
spring-mvc.xml配置

<bean id="testService" class="org.lc.controller.TestController">
        <constructor-arg index="0" ref="testServiceImpl"/>
    </bean>
    <bean id="testServiceImpl" class="org.lc.service.impl.TestServiceImpl"/> 

TestController配置

@RequestMapping("/test")
public class TestController {

    private TestService testService;
    TestController(TestService testService){
        this.testService=testService;
    }
    ...
}

第三、工廠方法(仍需要setter方法,但xml又配置不同)
新建一個工廠類

public class TestBeanFactory {

    //靜態工廠方法
    public static TestService getStaticTestServiceImpl(){
        return new TestServiceImpl();
    }
    //實例工廠方法
    public  TestService getTestServiceImpl(){
        return new TestServiceImpl();
    }
}

TestController.java配置

@RequestMapping("/test")
public class TestController {

    private TestService testService;
    public void setTestService(TestService testService){
        this.testService=testService;
    }
}

主要看spring-mvc.xml文件與setter方法的不同

<bean id="testService" class="org.lc.controller.TestController">
        <property name="testService" ref="beanFactory"></property>
    </bean>
    <!-- 靜態工廠 -->
    <bean id="beanFactory" class="org.lc.util.TestBeanFactory" factory-method="getStaticTestServiceImpl"/>
    <!-- 或者用實例工廠 -->
    <bean id="beanFactory" class="org.lc.util.TestBeanFactory" factory-method="getTestServiceImpl"/>

注入的三種方式基本上講完了,但是由於上面的現在都沒怎麼用過,理解不對的還請大神多多指教~~

下面講一下掃描:也算是一種注入的方式:通過註解的方式注入。

<context:annotation-config/> <!-- 開啓註解處理器//可以不寫,因爲掃描會自動開啓註解。建議寫上-->
<!-- base-package 會掃描這個包下面的所有註解:包括@Component,@Service,@Controller,@Repository等,而use-default-filters則是判斷是否進行全部掃描 -->
<context:component-scan base-package="org.lc.controller" use-default-filters="false">
    <!-- 他下面有兩個子標籤,一個是include-filter:掃描某個註解;exclude-filter:不掃描某個註解 -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

這樣掃描比單獨注入要省很多力氣,全都交給spring這個管理器給我們幹活,我們只要站好隊等着它給我們喂吃的就行了。

努力就有一切,快樂生活,快樂寫最美一切。還請多多指教。

發佈了31 篇原創文章 · 獲贊 7 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章