第五章 spring概述之IOC依賴注入

               Spring是一個開放源代碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向接口的編程思想貫穿整個系統應用。Spring的核心是控制反轉(IoC面向切面(AOP

 

IOC

package com.entity;

/*
 * 	學生實體類
 */
public class Student {
	private String name;
	private int age;
	public Student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = 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;
	}
	
	// show方法
	public void show(){
		System.out.println("姓名:"+name+"  年齡:"+age);
	}
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- 配置文件 -->
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	 <!-- 配置service 
        <bean> 配置需要創建的對象
            id :用於之後從spring容器獲得實例時使用的
            class :需要創建實例的全限定類名
    -->
	<!-- 描述Student類創建的方式 -->
	<bean id="stu" class="com.entity.Student">
		<property name="name" value="墨漸生微"></property>
		<property name="age" value="21"></property>
	</bean>
</beans>
package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.entity.Student;
/*
 * 測試
 */
public class Test {
	public static void main(String[] args) {
		// ① 獲取spring容器
		ApplicationContext ac = new ClassPathXmlApplicationContext("beans.xml");
		// ② 獲取Student實例化對象,不需要new,直接從spring容器中獲取
		Student stu = (Student) ac.getBean("stu");
		
		/*
		 * IOC:由容器控制程序之間的關係,
		 * 控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂反轉
		 */
		stu.show();
	}
}

 

接口IOC

package com.services;

/*
 * 	接口
 */
public interface IUsb {
	public void work();
}
package com.services;

/*
 * 	接口實現類:充電器
 */
public class ChargerUsbImp implements IUsb{
	private String name ;

	public ChargerUsbImp() {
		super();
		// TODO Auto-generated constructor stub
	}

	public ChargerUsbImp(String name) {
		super();
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void work() {
		System.out.println(name+"正在充電中.........");
	}
	
}
package com.services;

/*
 * 	接口實現類:硬盤
 */
public class DiskUsbImp implements IUsb{
	private String name;

	public DiskUsbImp(String name) {
		super();
		this.name = name;
	}

	public DiskUsbImp() {
		super();
		// TODO Auto-generated constructor stub
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void work() {
		System.out.println(name+"正在複製文件中.......");
	}
	
}
<bean id="usb" class="com.services.DiskUsbImp">
		<property name="name" value="金士頓硬盤"></property>
	</bean>
	
	<!--
	<bean id="usb" class="com.services.ChargerUsbImp">
		<property name="name" value="小米充電器"></property>
	</bean>
	-->
package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.services.IUsb;

/*
 * 測試
 */
public class Test {
	public static void main(String[] args) {
		ApplicationContext ac =  new ClassPathXmlApplicationContext("beans.xml");
		// 通過接口多態,修改配置xml文件,可以實現接口多調用
		IUsb iu =(IUsb) ac.getBean("usb");
		iu.work();
	}
}

 

依賴注入

           即組件之間的依賴關係由容器在運行期決定,形象的來說,即由容器動態的將某種依賴關係注入到組件之中

          依賴注入方式:手動裝配 自動裝配

               手動裝配:一般進行配置信息都採用手動

                     基於xml裝配:構造方法、setter方法

               基於註解裝配:

       構造方法

package com.entity;

public class Student {
	private String name;
	private int age;
	public Student(String name, int age) {
		System.out.println("構造方法運行中....");
		this.name = name;
		this.age = age;
	}
}
<bean id="stu" class="com.entity.Student">
		<!-- 構造方法注入:
			name :參數的名稱
            value:設置普通數據 
            -->
		<!-- 賦值的兩種方式 -->
		<constructor-arg name="name" value="Micro"></constructor-arg>
		<constructor-arg name="age">
			<value>21</value>
		</constructor-arg>
	</bean>

       setter方法

package com.entity;

public class Student {
	private String name;
	private int age;
	public void setName(String name) {
		System.out.println("姓名設置中.......");
		this.name = name;
	}
	public void setAge(int age) {
		System.out.println("年齡設置中.......");
		this.age = age;
	}
	
}
<bean id="stu" class="com.entity.Student">
		<!-- setter注入 -->
		<property name="name" value="Micro"></property>
		<property name="age">
			<value>21</value>
		</property>
	</bean>

 

ref屬性參考指定

package com.entity;

/*
 * 	班級實體類
 */
public class Classs {
	private String clsno;
	private String cname;
	private String addr;
	public void setClsno(String clsno) {
		this.clsno = clsno;
	}
	public void setCname(String cname) {
		this.cname = cname;
	}
	public void setAddr(String addr) {
		this.addr = addr;
	}
}
package com.entity;

public class Student {
	private String name;
	private int age;
	private Classs classs;
	public void setName(String name) {
		this.name = name;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public void setClasss(Classs classs) {
		this.classs = classs;
	}
	
}
<!-- 注入Classs -->
	<bean id="classs" class="com.entity.Classs">
		<property name="clsno" value="8801"></property>
		<property name="cname" value="Java"></property>
		<property name="addr" value="Beijing"></property>
	</bean>
	
	<!-- 注入Student -->
	<bean id="stu" class="com.entity.Student">
		<property name="name" value="Micro"></property>
		<property name="age" value="21"></property>
		
		<!-- 屬性爲引用數據類型:ref指向容器中的其他bean -->
		<!--  
			<property name="classs" ref="classs"></property>
		-->	
		<property name="classs">
			<ref bean="classs"/>
		</property>		 
	</bean>

 

集合注入

package com.entity;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/*
 * 集合測試類
 */
public class Tests {
	private List<String> list;
	private Set<String> set;
	private Map<String,String> map;
	private Properties prop;
	public void setList(List<String> list) {
		this.list = list;
	}
	public void setSet(Set<String> set) {
		this.set = set;
	}
	public void setMap(Map<String, String> map) {
		this.map = map;
	}
	public void setProp(Properties prop) {
		this.prop = prop;
	}
}
<bean id="test" class="com.entity.Tests">
		<!-- List集合 -->
		<property name="list">
			<list>
				<value>墨漸生微</value>
				<value>Micro</value>
			</list>
		</property>
		
		<!-- Set集合 -->
		<property name="set">
			<set>
				<value>Peter</value>
				<value>Myth</value>
			</set>
		</property>
		
		<!-- Map集合 -->
		<property name="map">
			<map>
				<entry key="A" value="Rose"></entry>
				<entry key="B" value="Gole"></entry>
			</map>
		</property>
		
		<!-- Properties -->
		<property name="prop">
			<props>
				<prop key="A">Sealr</prop>
				<prop key="B">Bob</prop>
			</props>
		</property>
	</bean>

 

自動裝配: autowire

          no:默認情況下,不自動裝配,通過“refattribute手動設定

          buName:根據PropertyName自動裝配,如果一個beanname,和另一個bean中的Propertyname相同,則自動裝配這個beanProperty

<!-- 注入班級Classs -->
	<bean id="classs" class="com.entity.Classs">
		<property name="cname" value="Java"></property>
		<property name="addr" value="NewYork"></property>
	</bean>
	
	<!-- byName:通過Student類的班級屬性名查找id爲此的bean自動裝配 -->
	<bean id="stu" class="com.entity.Student" autowire="byName">
		<property name="name" value="Micro"></property>
		<property name="age" value="21"></property>
	</bean>

          byType:根據Property的數據類型(Type)自動裝配,如果一個bean的數據類型,兼容另一個beanProperty的數據類型,則自動裝配

<!-- 注入Classs -->
	<bean id="classs" class="com.entity.Classs">
		<property name="cname" value="Java"></property>
		<property name="addr" value="NewYork"></property>
	</bean>
	
	<!-- byType:通過Student類的班級屬性的類型查找此類型的bean自動裝配 -->
	<bean id="stu" class="com.entity.Student" autowire="byType">
		<property name="name" value="Micro"></property>
		<property name="age" value="21"></property>
	</bean>

          constructor :根據構造函數參數的數據類型,進行byType模式的自動裝配

          autodetect:如果發現默認的構造函數,用constructor模式,否則,用byType模式

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