1. 程式人生 > >spring 注入方式和自動裝配介紹

spring 注入方式和自動裝配介紹

spring四種依賴注入方式

部落格分類: spring

平常的java開發中,程式設計師在某個類中需要依賴其它類的方法,則通常是new一個依賴類再呼叫類例項的方法,這種開發存在的問題是new的類例項不好統一管理,spring提出了依賴注入的思想,即依賴類不由程式設計師例項化,而是通過spring容器幫我們new指定例項並且將例項注入到需要該物件的類中。依賴注入的另一種說法是“控制反轉”,通俗的理解是:平常我們new一個例項,這個例項的控制權是我們程式設計師,而控制反轉是指new例項工作不由我們程式設計師來做而是交給spring容器來做。

spring有多種依賴注入的形式,下面僅介紹spring通過xml進行IOC配置的方式:
Set注入
這是最簡單的注入方式,假設有一個SpringAction,類中需要例項化一個SpringDao物件,那麼就可以定義一個private的SpringDao成員變數,然後建立SpringDao的set方法(這是ioc的注入入口):
Java程式碼 收藏程式碼
package com.bless.springdemo.action;
public class SpringAction {
//注入物件springDao
private SpringDao springDao;
//一定要寫被注入物件的set方法
public void setSpringDao(SpringDao springDao) {
this.springDao = springDao;
}

    public void ok(){  
    springDao.ok();  
}  

}

隨後編寫spring的xml檔案,<bean>中的name屬性是class屬性的一個別名,class屬性指類的全名,因為在SpringAction中有一個公共屬性Springdao,所以要在<bean>標籤中建立一個<property>標籤指定SpringDao。<property>標籤中的name就是SpringAction類中的SpringDao屬性名,ref指下面<bean name="springDao"...>,這樣其實是spring將SpringDaoImpl物件例項化並且呼叫SpringAction的setSpringDao方法將SpringDao注入:

Java程式碼 收藏程式碼





構造器注入
這種方式的注入是指帶有引數的建構函式注入,看下面的例子,我建立了兩個成員變數SpringDao和User,但是並未設定物件的set方法,所以就不能支援第一種注入方式,這裡的注入方式是在SpringAction的建構函式中注入,也就是說在建立SpringAction物件時要將SpringDao和User兩個引數值傳進來:
Java程式碼 收藏程式碼
public class SpringAction {
//注入物件springDao
private SpringDao springDao;
private User user;

public SpringAction(SpringDao springDao,User user){  
    this.springDao = springDao;  
    this.user = user;  
    System.out.println("構造方法呼叫springDao和user");  
}  

    public void save(){  
    user.setName("卡卡");  
    springDao.save(user);  
}  

}

在XML檔案中同樣不用<property>的形式,而是使用<constructor-arg>標籤,ref屬性同樣指向其它<bean>標籤的name屬性:

Xml程式碼 收藏程式碼








解決構造方法引數的不確定性,你可能會遇到構造方法傳入的兩引數都是同類型的,為了分清哪個該賦對應值,則需要進行一些小處理:
下面是設定index,就是引數位置:
Xml程式碼 收藏程式碼




另一種是設定引數型別:
Xml程式碼 收藏程式碼

靜態工廠的方法注入
靜態工廠顧名思義,就是通過呼叫靜態工廠的方法來獲取自己需要的物件,為了讓spring管理所有物件,我們不能直接通過”工程類.靜態方法()”來獲取物件,而是依然通過spring注入的形式獲取:
Java程式碼 收藏程式碼
package com.bless.springdemo.factory;

import com.bless.springdemo.dao.FactoryDao;
import com.bless.springdemo.dao.impl.FactoryDaoImpl;
import com.bless.springdemo.dao.impl.StaticFacotryDaoImpl;

public class DaoFactory {
//靜態工廠
public static final FactoryDao getStaticFactoryDaoImpl(){
return new StaticFacotryDaoImpl();
}
}

同樣看關鍵類,這裡我需要注入一個FactoryDao物件,這裡看起來跟第一種注入一模一樣,但是看隨後的xml會發現有很大差別:

Java程式碼 收藏程式碼
public class SpringAction {
//注入物件
private FactoryDao staticFactoryDao;

public void staticFactoryOk(){  
    staticFactoryDao.saveFactory();  
}  
//注入物件的set方法  
public void setStaticFactoryDao(FactoryDao staticFactoryDao) {  
    this.staticFactoryDao = staticFactoryDao;  
}  

}

Spring的IOC配置檔案,注意看<bean name="staticFactoryDao">指向的class並不是FactoryDao的實現類,而是指向靜態工廠DaoFactory,並且配置 factory-method="getStaticFactoryDaoImpl"指定呼叫哪個工廠方法:

Xml程式碼 收藏程式碼







例項工廠的方法注入
例項工廠的意思是獲取物件例項的方法不是靜態的,所以你需要首先new工廠類,再呼叫普通的例項方法:
Java程式碼 收藏程式碼
public class DaoFactory {
//例項工廠
public FactoryDao getFactoryDaoImpl(){
return new FactoryDaoImpl();
}
}

那麼下面這個類沒什麼說的,跟前面也很相似,但是我們需要通過例項工廠類建立FactoryDao物件:

Java程式碼 收藏程式碼
public class SpringAction {
//注入物件
private FactoryDao factoryDao;

public void factoryOk(){  
    factoryDao.saveFactory();  
}  

public void setFactoryDao(FactoryDao factoryDao) {  
    this.factoryDao = factoryDao;  
}  

}

最後看spring配置檔案:

Xml程式碼 收藏程式碼




<!--(4)此處獲取物件的方式是從工廠類中獲取例項方法-->  
<bean name="daoFactory" class="com.bless.springdemo.factory.DaoFactory"></bean>  
<bean name="factoryDao" factory-bean="daoFactory" factory-method="getFactoryDaoImpl"></bean>  

總結
Spring IOC注入方式用得最多的是(1)(2)種,多謝多練就會非常熟練。
另外注意:通過Spring建立的物件預設是單例的,如果需要建立多例項物件可以在標籤後面新增一個屬性:
Java程式碼 收藏程式碼

現在這種注入方法已經用的很少了,現在基本都是通過@Autowired註解實現自動裝配,只要你注入的bean已經被spring管理就可以使用了

package com.cjwdemo.demoBySpring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.cjwdemo.demoBySpring.bean.Demo1;
import com.cjwdemo.demoBySpring.bean.Demo2;

@Configuration // @Configuration表示當前類為配置類
/*
 * @ComponentScan預設掃描當前包和子包的class檔案
 * 有@Controller或@Component或@Service或@Repository則自動註冊到spring管理
 */
@ComponentScan
public class Application {


    // 通過@Configuration和@Bean實現bean註冊
    @Bean
    public Demo1 setDemo1() {
        return new Demo1();
    }

    public static void main(String[] args) {
        /*
         * ApplicationContext是BeanFactory的超類,需要通過配置類或xml配置檔案創建出來,
         * 能通過該類直接獲取spring管理的bean
         */
        ApplicationContext context = new AnnotationConfigApplicationContext(Application.class);
        Demo1 demo1 = context.getBean(Demo1.class);
        demo1.test();
        Demo2 demo2 = context.getBean(Demo2.class);
        demo2.test();
    }
}
// 獲取demo1 bean成功
// 獲取demo1 bean成功
package com.cjwdemo.demoBySpring.bean;

public class Demo1 {

    public void test() {
        System.out.println("獲取demo1 bean成功");
    }

}
package com.cjwdemo.demoBySpring.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Demo2 {

    @Autowired
    private Demo1 demo1;

    public void test() {
        demo1.test();
    }

}
<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.cjwdemo.demoBySpring</groupId>
    <artifactId>demoBySpring</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>demoBySpring Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.8.RELEASE</version>
        </dependency>

    </dependencies>
    <build>
        <finalName>demoBySpring</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

相關推薦

spring 注入方式自動裝配介紹

spring四種依賴注入方式 部落格分類: spring 平常的java開發中,程式設計師在某個類中需要依賴其它類的方法,則通常是new一個依賴類再呼叫類例項的方法,這種開發存在的問題是new的類例項不好統一管理,spring提出了依賴注入的思想,即依賴類不

Spring定義bean的三種方式自動注入

前言:隨著一個專案規模的增大,我們不得不引入許多Java bean物件,而這些物件一般來說是在Spring的配置檔案applicationContext.xml中進行配置的,這樣就聲明瞭這是一個由Spring容器管理的bean物件。這種做法必然會導致Spring的配置檔案的

Spring學習第一章、第二節:依賴注入(包括自動裝配,物件的注入

依賴注入 前言 Spring Bean 定義繼承 Bean 定義模板 正文 Spring依賴注入 基於構造器的依賴注入 基於Setter方法的依賴注入 自

Spring中隱式的bean發現機制自動裝配

儘管Spring的配置風格是可以互相搭配的,但是應該儘可能的使用自動配置的機制,顯式配置越少越好 Spring從兩個角度來實現自動化裝配: 元件掃描:Spring會自動發現應用上下文中所建立的bean 自動裝配:Spring會自動滿足bean之間的依賴

spring屬性賦值自動裝配

一  @Value賦值和@propertySource載入外部配置檔案 1、@Value 一般用在屬性和setter方法上,當該類註冊成bean時,會自動為其屬性或方法的引數賦值。注意:一定不能用在靜態方法上,否則會失效 2、用法:   @Value("placeholder") 

依賴注入自動裝配

參考:https://zhidao.baidu.com/question/1577675767538514300.html          https://blog.csdn.net/u012843873/article/details/52399206之前一直沒有注意一個

Spring中類型自動裝配--byType

log ext setw println create cat ssp XML ret 在Spring中,“類型自動裝配”的意思是如果一個bean的數據類型與其它bean屬性的數據類型相同,將自動兼容裝配它。 例如,一個“persion” bean 公開以“abili

Spring中通過構造自動裝配--constructor

getname ted val lan 如果 create 構造方法 detect pub 在Spring中,可以使用“通過構造自動裝配”,實際上是按構造函數的參數類型自動裝配。 這意味著,如果一個bean的數據類型與其他bean的構造器參數的數據類型是相同的,那麽將自動裝

Spring@Autowired註解與自動裝配

arp details auto 反射機制 java -i etc str spi 1 配置文件的方法 我們編寫spring 框架的代碼時候。一直遵循是這樣一個規則:所有在spring中註入的bean 都建議定義成私有的域變量。並且要配套寫上 get 和 set方法

一個介面多個實現類的Spring注入方式(註解方式)

轉載: https://blog.csdn.net/niceLiuSir/article/details/80499821 1. 首先, Interface1 介面有兩個實現類 Interface1Impl1 和 Interface1Impl2 Interface1 介面: p

spring注入方式之singleton注入prototype

singleton注入prototype lookup方法注入 使用場景:一個singleton的bean使用一個prototype的bean時。 public interface Bean2{//jiekou Bean1 getBean1();//

Spring註解開發之自動裝配

自動裝配:Spring利用依賴注入(DI),完成對IOC容器中中各個元件的依賴關係賦值; 自動裝配[email protected]&@Qualifier&@Primary 使用@Autowire註解可以為SpringBean物件自動注

Spring中Bean的自動裝配之@Resource、@Inject

Spring還支援使用@Resource(JSR250)和@Inject(JSR330)[java規範的註解]  *         @Resource:  *             可以和@Autowired一樣實現自動裝配功能;預設是按照元件名稱進行裝配的;  *   

Spring註解驅動開發——自動裝配(1)

自動裝配:Spring利用依賴注入(DI),完成對IOC容器中各個元件的依賴賦值 1、@Autowired:     預設先按照型別去容器中找相應的元件(applicationContext.get

Spring入門學習(自動裝配) 第四節

Spring入門學習 第四節 自動裝配 自動裝配 分別建立三個類Address.java,Car.java,Person.java 其中Perosn類包含有Address和Car的屬性package com.fafa.spring.au

Spring原始碼解讀之——自動裝配(隨筆)

Spring利用依賴注入(DI),完成對IOC容器中中各個元件的依賴關係賦值; 1、@Autowired:自動注入:     1)、預設優先按照型別去容器中找對應的元件:applicationContext.getBean(BookDao.class);找到就賦值   

一個介面多個實現類的Spring注入方式

1. 首先, Interface1 介面有兩個實現類 Interface1Impl1 和 Interface1Impl2 Interface1 介面: package com.example.s

spring注入方式之set方式注入

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-in

Spring註解方式配置檔案方式的混用

1.註解方式和配置檔案方式的混用:     1.配置檔案方式 : 用於配置物件的建立          <beans>             <!--開啟掃描-->             <context:component-scan bas

Spring原始碼學習--Spring中IOCAOP的介紹

前言: 控制反轉(Inversion of Control,英文縮寫為IoC); 面向切面程式設計(Aspect Oriented Programming,英文縮寫為AOP) 我們是在使用spring框架的過程中,很大一部分是為了使用IoC(依賴注入),和