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