Spring依賴注入詳解

Spring依賴注入詳解

介紹:

  所謂依賴注入就是指:在運行期間,有外部容器動態地將依賴對象注入到組件中

分爲:

1.setter方法注入
2.使用構造器注入
3.使用Field注入(用於註解方式)

4.使用靜態工廠的方法注入

5.普通工廠類的方法注入

一、Setter方法注入:

例如1:
public class Person {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	
}
上面是一個純粹的POJO類 給了 Name 和 Age 兩個簡單的屬性:
spring.xml中:
	<bean class="com.test.spring.Person">
		<property name="name" value="LYW"/>
		<property name="age" value="21"/>
	</bean>
這樣配置Bean Person類就被Spring管理了起來
  例如2:
還有一種複雜的情況:如果Person類 包含了一個Type對象屬性,配置就比較繁瑣:
Person.Java
public class Person {
	private String name;
	private int age;
        private Type type;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setType(Type type) {
		this.type = type;
	}
}
  Type.Java
public class Type {
	private String typeName;
	public void setTypeName(String typeName){
		this.typeName= typeName;
	}
}
以上這種情況 如何配置?
有兩種方法:1、內置Bean方式:
	<bean class="com.test.spring.Person">
		<property name="name" value="LYW"/>
		<property name="age" value="21"/>
		<property name="type">
			<bean class="com.test.spring.Type">
				<property name="typeName" value="Coding"/>
			</bean>
		</property>
	</bean>
2、或者採引入屬性的方法 :
spring.xml
<bean class="com.test.spring.Type" id="type">
		<property name="typeName" value="Coding"/>
	</bean>

<bean class="com.test.spring.Person">
		<property name="name" value="LYW"/>
		<property name="age" value="21"/>
		<property name="type" ref="type"> </property>
     </bean>

上下兩種配置方式  建議使用下面這種 看起來 方便 不雜亂 

二、構造器注入: 這種方式的注入是指帶有參數的構造函數注入

例如:
Person類:
public class Person {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
}
     Spring.xml配置:
<bean id="person" class="com.test.spring.Person
 		<constructor-arg name="name" value="LYW" />
                <constructor-arg name="age" value="21" />
      </bean>
這是簡單的構造注入
在配置時 name可以不寫 不寫會默認按照順序 注入 
也根據屬性類型注入 <constructor-arg type="int" value="21" /> 這樣 不寫name 寫個type也可以區分

三、註解注入

列如:
UserDao.java
@Repository
public class UserDao {

    public void sayHello(String name) {
        System.out.println("Hello\t"+name);
    }

}
UserService.java
@Service
public class UserService {

    @Autowired
    private UserDao userDao;

    public void sayHello(String name) {
        this.userDao.sayHello(name);
    }
}
spring.xml
 <context:annotation-config />
    <context:component-scan base-package="com.lyw.*" >
    </context:component-scan>
這樣就可以使用註解的方式注入

四、靜態工廠注入

使用靜態工廠方法創建Bean實例時,class屬性也必須指定,但此時class屬性並不是指定Bean實例的實現類,而是靜態工廠類。因爲Spring需要知道是用哪個工廠來創建Bean實例。另外,還需要使用factory-method來指定靜態工廠方法名,Spring將調用靜態工廠方法(可能包含一組參數),來返回一個Bean實例,一旦獲得了指定Bean實例,Spring後面的處理步驟與採用普通方法創建Bean實例則完全一樣。需要注意的是,當使用靜態工廠方法來創建Bean時,這個factory-method必須要是靜態的。
通俗點講,就是通過調用靜態工廠的方法來獲取自己需要的對象,爲了讓spring管理所有對象,我們不能直接通過"工程類.靜態方法()"來獲取對象,而是依然通過spring注入的形式獲取: 

public interface Person(){
    public void sayHello();
}

下面是接口的兩個實現類:

public class Work implements Person {
    private String msg;
    //依賴注入時必須的setter方法
    public void setMsg(String msg){
        this.msg = msg;
    }
    @Override
    public void sayHello(){
        System.out.println(msg + ",你好");
    }
}

public class Teacher implements Person {
    private String msg;
    //依賴注入時必須的setter方法
    public void setMsg(String msg){
        this.msg = msg;
    }
    @Override
    public void sayHello(){
        System.out.println(msg + ",Hello");
    }
}
下面的PersonFactory工廠中包含了一個getPerson的靜態方法,該方法將根據傳入的參數決定創建哪個對象。這是典型的靜態工廠設計模式。
public class PersonFactory {
    public static Animal getPerson(String type){
        if ("work".equalsIgnoreCase(type)){
            return new Work();
        } else {
            return new Teacher();
        }
    }
}
spring.xml配置
<bean id="work" class="com.lyw.spring.PersonFactory" factory-method="getPerson">
    <!-- 配置靜態工廠方法的參數 -->
    <constructor-arg value="work" />
    <!-- 通過setter注入的普通屬性 -->
    <property name="msg" value="工人" />
</bean>
<bean id="teacher" class="com.lyw.spring.PersonFactory" factory-method="getPerson">
    <constructor-arg value="teacher" />
    <property name="msg" value="老師" />
</bean>

這樣就配置完了Spring了

五、普通工廠類的方法注入

public class PersonFactory {  
  
    public Person createPerson(){  
        Person person = new Person();  
        person.setName("LYW");  
        person.setAge(22);  
        return person;  
    }  
      
}  

spring.xml配置文件 
<bean id="personFactory" class="com.lyw.spring.PersonFactory"></bean>  
<bean id="person" factory-bean="personFactory" factory-method="createPerson"></bean>  
這樣配置就可以了 

以上就是我對Spring注入的總結 希望可以喜歡 


作者:孩子你狠幼稚,真的很幼稚
出處:http://blog.csdn.net/lu1005287365/
如果,您認爲閱讀這篇博客讓您有些收穫,不妨點擊一下下面的贊【贊一下】
如果,您希望有什麼感覺不對的地方歡迎在下面評論【評一下】
如果,您對我的博客內容感興趣,請繼續關注我的後續博客,我是【LYW】

本文版權歸作者和CSDN共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章