Spring中的IOC實現

Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架  

控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認爲IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。

IOC

高層模塊不應該依賴低層模塊,而是模塊都必須依賴於抽象.
業務與抽象結合,不依賴於實現.

通用的Bean工廠,通過各種方式獲得Bean對象以及Bean對象的管理。

控制反轉:
   把對象的創建交給spring容器來做
      spring容器創建對象的方式
         1、默認是調用默認的構造函數
         2、利用靜態工廠方法創建
             spring調用工廠方法產生對象,但是真正創建對象還是由程序員來完成的
         3、實例工廠方法
        說明:
           spring配置文件中,只要是一個bean就會爲該bean創建對象
      spring容器創建對象的時機
        在單例的情況下
         1、在默認的情況下,啓動spring容器創建對象
         2、在spring的配置文件bean中有一個屬性lazy-init="default/true/false"
               1、如果lazy-init爲"default/false"在啓動spring容器時創建對象
               2、如果lazy-init爲"true",在context.getBean時纔要創建對象
           意義:
                在第一種情況下可以在啓動spring容器的時候,檢查spring容器配置文件的正確性,如果再結合tomcat,
                如果spring容器不能正常啓動,整個tomcat就不能正常啓動。但是這樣的缺點是把一些bean過早的放在了
                內存中,如果有數據,則對內存來是一個消耗
                在第二種情況下,可以減少內存的消耗,但是不容易發現錯誤
        在多例的情況下
            就是一種情況:在context.getBean時才創建對象
      spring的bean中的scope
        1、由spring產生的bean默認是單例的
        2、可以在spring的配置文件中,scope的值進行修改="singleton/prototype/request/session/global session"

        3、如果spring的配置文件的scope爲"prototype",則在得到該bean時才創建對象
      spring容器對象的生命週期:
        1、spring容器創建對象
        2、執行init方法
        3、調用自己的方法
        4、當spring容器關閉的時候執行destroy方法

接口Dao.java

package bean;

public interface Dao {
    public void save();
    public void delete();
    public  void update();
    
}

實現接口中的所有方法

package bean;

public class UserDao  implements Dao {

	@Override
	public void save() {
		System.out.println("user Save");
		
	}

	@Override
	public void delete() {
		System.out.println("user delete");
		
	}

	@Override
	public void update() {
		System.out.println("user update");
		
	}


}

package bean;

public class BoardDao   implements Dao {
	@Override
	public void save() {
		System.out.println("board Save");
		
	}

	@Override
	public void delete() {
		System.out.println("board delete");
		
	}

	@Override
	public void update() {
		System.out.println("board update");
		
	}

}

靜態工廠和普通工廠

StaticFactory.java

package bean;

public class StaticFactory {
	//靜態工廠
     public static Dao getDao(String name){
    	 //統一管理 如讀取資源,記錄日誌,事務管理
    	 if(name.equals("user")){    		 
    		 return new UserDao();
    	 }else{
    		 
    		 return  new BoardDao() ;
    	 }
    	 
     }
     //普通工廠
     public Dao getComDao(String name){
    	 //統一管理
    	 if(name.equals("user")){    		 
    		 return new UserDao();
    	 }else{
    		 
    		 return  new BoardDao() ;
    	 }
     }
}

applicationContext.xml

<?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-4.0.xsd">
	<!-- 靜態工廠 -->
	<bean name="dao" class="bean.StaticFactory" factory-method="getDao">
		<constructor-arg>
			<value>user</value>
		</constructor-arg>
	</bean>
	<!-- 普通工廠 -->
	<!-- Dao dao=(Dao) ctx.getBean("userDao"); -->
	<bean name="factory" class="bean.StaticFactory"></bean>
	<bean name="userDao" factory-bean="factory" factory-method="getComDao">
		<constructor-arg>
			<value>board</value>
		</constructor-arg>
	</bean>
</beans>
測試代碼

	ApplicationContext  ctx=new  ClassPathXmlApplicationContext("applicationContext.xml");
    	Dao dao=StaticFactory.getDao("board");//通過靜態工廠
        // Dao dao=(Dao) ctx.getBean("userDao");//通過普通工廠
		
         dao.update();


Bean的生命週期

在UserDao中加上兩個方法

public void init(){
		System.out.println("useDao被初始化");
	}
	
	public void destory(){
		System.out.println("useDao被銷燬");
	}

在XML文件中配置生命週期(運行代碼時會進行初始化,而銷耗在沒有關閉時不會自動輸出)

<!-- 聲明週期 -->
	 <bean name="user1" class="bean.UserDao" init-method="init"
		destroy-method="destory">
	</bean> 


依賴注入
Topic.java

package util;

public class Topic {
    private String id;
    private String title;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
    
}

User.java聲明各種集合

package util;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class User {
     private String id;
     private String name;
     
     private List list=new ArrayList();
     private Set sets=new HashSet();	
     private Map  maps=new HashMap();
     
     private Properties  pros=new Properties();
     String[] strs;
     Topic[] topics;//對象數組
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public Set getSets() {
		return sets;
	}
	public void setSets(Set sets) {
		this.sets = sets;
	}
	public Map getMaps() {
		return maps;
	}
	public void setMaps(Map maps) {
		this.maps = maps;
	}
	public Properties getPros() {
		return pros;
	}
	public void setPros(Properties pros) {
		this.pros = pros;
	}
	public String[] getStrs() {
		return strs;
	}
	public void setStrs(String[] strs) {
		this.strs = strs;
	}
	public Topic[] getTopics() {
		return topics;
	}
	public void setTopics(Topic[] topics) {
		this.topics = topics;
	}
     
}

XML文件配置

<!-- 裝配各種類型對象 -->
	<bean name="topic1" class="util.Topic">
		<property name="id">
			<value>1</value>

		</property>
		<property name="title">
			<value>java</value>
		</property>
	</bean>
	<bean name="topic2" class="util.Topic">
		<property name="id">
			<value>2</value>
		</property>
		<property name="title">
			<value>c#</value>
		</property>
	</bean>

	<bean name="user" class="util.User">
		<property name="id">
			<value>1</value>
		</property>
		<property name="name">
			<value>csdn</value>
		</property>
		<property name="list">
			<list>
				<ref bean="topic1" />
				<ref bean="dao" />
				<value>123</value>
				<value>465</value>
				<value></value>
				<null></null>
			</list>
		</property>
		<property name="sets">
			<set>
				<bean id="date" class="java.util.Date"></bean>
				<ref bean="topic2" />
			</set>
		</property>
		<property name="maps">
			<map>
				<entry>
					<key>
						<value>java</value>
					</key>
					<ref bean="topic1" />
				</entry>
				<entry>
					<key>
						<value>sql</value>
					</key>
					<value>oracle</value>
				</entry>
			</map>
		</property>

		<property name="pros">
			<props>
				<prop key="java">
					hibernate
				</prop>
				<prop key="jsp">
					struts
				</prop>
			</props>
		</property>

		<property name="strs">
			<list>
				<value>javax</value>
				<value>jspx</value>
			</list>
		</property>
		<property name="topics">
			<array>
				<ref bean="topic1" />
				<ref bean="topic2" />
			</array>
		</property>
	</bean>

測試取出所有的類型

 	ApplicationContext  ctx=new  ClassPathXmlApplicationContext("applicationContext.xml");
    	Topic dao=(Topic) ctx.getBean("topic1");
    	System.out.println(dao.getId()+"--"+dao.getTitle());
    	
    	
    	//ApplicationContext  ctx=new  ClassPathXmlApplicationContext("applicationContext.xml");
    	Topic dao1=(Topic) ctx.getBean("topic2");
    	System.out.println(dao1.getId()+"--"+dao1.getTitle());
    	
    	User user=(User) ctx.getBean("user");
    	System.out.println(user.getId()+"-user-"+user.getName());
    	
    	
    	for(int i=0;i<user.getList().size();i++){
    		System.out.println(user.getList().get(i));
    	}
    	
   
    	
    	Set us=user.getSets();
    	Iterator  iterator=us.iterator();
    	while(iterator.hasNext()){
    		System.out.println("set集合"+iterator.next());
    	}
    	
    	
    	
    	
    	Map map=user.getMaps();
    	Set set=map.keySet();
    	Iterator iterator2=set.iterator();
    	while(iterator2.hasNext()){
    		String k=(String) iterator2.next();
    		System.out.println("map集合"+k);
    		System.out.println("map集合"+map.get(k));
    	}
    	
    	System.out.println("pros:"+user.getPros());
    	
    	//System.out.println(user.getStrs());
    	String s[]=user.getStrs();
    	for(String x:s){
    		System.out.println("strs:"+x);
    	}
    	
    	
    	Topic[] sx=user.getTopics();
    	for(Topic xx:sx){
    		System.out.println("topics:"+xx);
    	}


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