1. 程式人生 > >Spring(五)依賴注入原理及多種資料型別的裝配

Spring(五)依賴注入原理及多種資料型別的裝配

基本型別物件注入

package test.spring.dao;

public interface PersonDao {

	public abstract void add();

}

package test.spring.dao.impl;

import test.spring.dao.PersonDao;


public class PersonDaoBean implements PersonDao {

	@Override
	public void add(){
		System.out.println("執行PersonDaoBean裡的test1()方法");
	}
}

package test.spring.service;

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

public interface PersonService {

	public abstract void save();
	public Set<String> getSet();
	public List<String> getList();
	public Properties getProperties();
	public Map<String, String> getMap();
}

package test.spring.service.impl;

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;

import test.spring.dao.PersonDao;
import test.spring.entity.Property;
import test.spring.service.PersonService;

public class PersonServiceBean2 implements PersonService {

	private PersonDao personDao;
	private String name;
	private Integer num;
	private Set<String> set = new HashSet<String>();
	private List<String> list = new ArrayList<String>();
	private Properties properties = new Properties();
	private Map<String, String> map = new HashMap<String, String>();

	public Map<String, String> getMap() {
		return map;
	}

	public void setMap(Map<String, String> map) {
		this.map = map;
	}

	public Properties getProperties() {
		return properties;
	}

	public void setProperties(Properties properties) {
		this.properties = properties;
	}

	public List<String> getList() {
		return list;
	}

	public void setList(List<String> list) {
		this.list = list;
	}

	public Set<String> getSet() {
		return set;
	}

	public void setSet(Set<String> set) {
		this.set = set;
	}

	public Integer getNum() {
		return num;
	}

	public void setNum(Integer num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

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

	public PersonDao getPersonDao() {
		return personDao;
	}

	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}

	@Override
	public void save() {
		personDao.add();
		System.out.println(name);
		System.out.println(num);
	}
}

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

	<!-- 這時候這個bean就可以由spring幫我們建立和維護,用到時只需從spring容器中獲取 -->
	<!-- 
	<bean id="personService" class="test.spring.service.impl.PersonServiceBean" 
		lazy-init="false" init-method="init" destroy-method="destroy">
	</bean> 
	-->
	<!-- 
	<bean id="personService2" class="test.spring.service.impl.PersonServiceBeanFactory" 
		factory-method="createPersonServiceBean"></bean> <bean id="personServiceFactory" 
		class="test.spring.service.impl.PersonServiceBeanFactory">
	</bean> 
	<bean id="personService3" 
		factory-bean="personServiceFactory" factory-method="createPersonServiceBean2">
	</bean> 
	-->
	<!-- 基本型別物件注入 -->
	<!-- 
	<bean id="personDao" class="test.spring.dao.impl.PersonDaoBean"></bean> 
	<bean id="personService" class="test.spring.service.impl.PersonServiceBean2"> 
	-->
	<!-- name是service中對於的屬性名,ref是對於的bean -->
	<!-- 
	<property name="personDao" ref="personDao"></property> </bean> 
	-->
	<!-- 使用內部bean,但該bean不能被其他bean使用 -->
	<bean id="personDao" class="test.spring.dao.impl.PersonDaoBean" />
	<bean id="personService" class="test.spring.service.impl.PersonServiceBean2">
		<!-- name是service中對於的屬性名,ref是對於的bean -->
		<property name="personDao" ref="personDao" />
		<!-- 為基本資料型別注入值 -->
		<property name="name" value="LinDL" />
		<property name="num" value="2015" />
		<property name="set">
			<set>
				<value>ONE</value>
				<value>TWO</value>
				<value>THREE</value>
			</set>
		</property>
		<property name="list">
			<list>
				<value>第一個list元素</value>
				<value>第二個list元素</value>
				<value>第三個list元素</value>
			</list>
		</property>
		<property name="properties">
			<props>
				<prop key="key1">value1</prop>
				<prop key="key2">value2</prop>
				<prop key="key3">value3</prop>
			</props>
		</property>
		<property name="map">
			<map>
				<entry key="map-key1" value="map-value-1" />
				<entry key="map-key2" value="map-value-2" />
				<entry key="map-key3" value="map-value-3" />
			</map>
		</property>
	</bean>
</beans> 

package test.spring.jnit;

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

import test.spring.service.PersonService;

public class SpringTest2 {

	@Test
	public void test() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
				"beans.xml");
		PersonService personService=(PersonService) applicationContext.getBean("personService");
		personService.save();
		System.out.println("--------------Set-----------------");
		for(String str:personService.getSet()){
			System.out.println(str);
		}
		System.out.println("----------------List---------------");
		for(String str:personService.getList()){
			System.out.println(str);
		}
		System.out.println("--------------propert---------------");
		for(Object key:personService.getProperties().keySet()){
			System.out.println(key+" = "+personService.getProperties().getProperty((String) key));
		}
		System.out.println("--------------Map-------------------");
		for(String key:personService.getMap().keySet()){
			System.out.println(key+" = "+personService.getMap().get(key));
		}
		
//		InjectTest injectTest=new InjectTest("beans.xml");
//		PersonService personService=(PersonService) injectTest.getBean("personService");
//		personService.save();
	}

}


編碼剖析依賴注入原理

package test.spring.entity;

import java.util.ArrayList;
import java.util.List;

public class Bean2 {

	private String id;
	private String classPath;
	private List<Property> properties=new ArrayList<Property>();
	
	public Bean2(String id, String classPath) {
		this.id = id;
		this.classPath = classPath;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getClassPath() {
		return classPath;
	}
	public void setClassPath(String classPath) {
		this.classPath = classPath;
	}
	public List<Property> getProperties() {
		return properties;
	}
	public void setProperties(List<Property> properties) {
		this.properties = properties;
	}
	
}

package test.spring.entity;

public class Property {

	private String name;
	private String ref;
	private String value;

	public Property(String name, String ref, String value) {
		super();
		this.name = name;
		this.ref = ref;
		this.value = value;
	}

	public String getName() {
		return name;
	}

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

	public String getRef() {
		return ref;
	}

	public void setRef(String ref) {
		this.ref = ref;
	}

	public String getValue() {
		return value;
	}

	public void setValue(String value) {
		this.value = value;
	}

}

<pre name="code" class="java">package test.spring.jnit;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import org.apache.commons.beanutils.ConvertUtils;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import org.springframework.asm.commons.Method;

import test.spring.entity.Bean;
import test.spring.entity.Bean2;
import test.spring.entity.Property;

public class InjectTest {

		private List<Bean2> beanDefines = new ArrayList<Bean2>();
		private Map<String, Object> singletons = new HashMap<String, Object>();
		
		public InjectTest(String filename){
			this.readXML(filename);
			this.instanceBeans();
			this.injectObject();
		}
		/**
		 * 為bean物件的屬性注入值
		 */
		private void injectObject() {
			for(Bean2 beanDefinition : beanDefines){
				Object bean = singletons.get(beanDefinition.getId());
				if(bean!=null){
					try {
						PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
						for(Property propertyDefinition : beanDefinition.getProperties()){
							for(PropertyDescriptor properdesc : ps){
								if(propertyDefinition.getName().equals(properdesc.getName())){
									java.lang.reflect.Method setter = properdesc.getWriteMethod();//獲取屬性的setter方法 ,private
									if(setter!=null){
										Object value = null;
										if(propertyDefinition.getRef()!=null && !"".equals(propertyDefinition.getRef().trim())){
											value = singletons.get(propertyDefinition.getRef());
										}else{
											value = ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());
										}
										setter.setAccessible(true);
										setter.invoke(bean, value);//把引用物件注入到屬性
									}
									break;
								}
							}
						}
					} catch (Exception e) {
					}
				}
			}
		}
		/**
		 * 完成bean的例項化
		 */
		private void instanceBeans() {
			for(Bean2 beanDefinition : beanDefines){
				try {
					if(beanDefinition.getClassPath()!=null && !"".equals(beanDefinition.getClassPath().trim()))
						singletons.put(beanDefinition.getId(), Class.forName(beanDefinition.getClassPath()).newInstance());
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
			
		}
		/**
		 * 讀取xml配置檔案
		 * @param filename
		 */
		private void readXML(String filename) {
		       SAXReader saxReader = new SAXReader();   
		        Document document=null;   
		        try{
		         URL xmlpath = this.getClass().getClassLoader().getResource(filename);
		         document = saxReader.read(xmlpath);
		         Map<String,String> nsMap = new HashMap<String,String>();
		         nsMap.put("ns","http://www.springframework.org/schema/beans");//加入名稱空間
		         XPath xsub = document.createXPath("//ns:beans/ns:bean");//建立beans/bean查詢路徑
		         xsub.setNamespaceURIs(nsMap);//設定名稱空間
		         List<Element> beans = xsub.selectNodes(document);//獲取文件下所有bean節點 
		         for(Element element: beans){
		            String id = element.attributeValue("id");//獲取id屬性值
		            String clazz = element.attributeValue("class"); //獲取class屬性值        
		            Bean2 beanDefine = new Bean2(id, clazz);
		            XPath propertysub =  element.createXPath("ns:property");
		            propertysub.setNamespaceURIs(nsMap);//設定名稱空間
		            List<Element> propertys = propertysub.selectNodes(element);
		            for(Element property : propertys){	            	
		            	String propertyName = property.attributeValue("name");
		            	String propertyref = property.attributeValue("ref");
		            	String propertyValue = property.attributeValue("value");
		            	Property propertyDefinition = new Property(propertyName, propertyref, propertyValue);
		            	beanDefine.getProperties().add(propertyDefinition);
		            }
		            beanDefines.add(beanDefine);
		         } 
		        }catch(Exception e){   
		            e.printStackTrace();
		        }
		}
		/**
		 * 獲取bean例項
		 * @param beanName
		 * @return
		 */
		public Object getBean(String beanName){
			return this.singletons.get(beanName);
		}


}

相關推薦

Spring()依賴注入原理多種資料型別裝配

基本型別物件注入 package test.spring.dao; public interface PersonDao { public abstract void add(); }package test.spring.dao.impl; import te

依賴注入原理,作用,注入方式——Spring IOC/DI(二)

依賴注入原理,作用,注入方式 前言 上一章我們講到了IOC和DI概述: https://blog.csdn.net/qq_34598667/article/details/83275560 這一章接上一章繼續講 依賴注入(Dependency Injection)是用於實現控制反

spring通過註解方式依賴注入原理 (私有成員屬性如何注入

一、spring如何建立依賴的物件  用過spring的都知道我們在dao、service層加上@repository、@Service就能將這兩個物件交給spring管理,在下次使用的時候使用@resource 或者@Autowired  就可以拿到而不需要自己再去new了

Spring依賴注入,帶來的資料初始化問題

applicationContext.xml配置檔案1.舉個例子:<bean id="AService" class="com.backgroud.restful.AService"> </bean><context:component-scan

spring依賴注入的方式實現(2)

依賴注入的方式1、屬性注入2、構造器注入3、工廠方法注入(很少使用,不推薦)1、屬性注入(1)屬性注入即通過 setter 方法注入Bean 的屬性值或依賴的物件(2)屬性注入使用 <proper

Spring依賴注入的幾種方式實現鬆耦合

一、普通注入方式: (1)在IDEA工作空間內先建立lib包然後匯入Spring的架包(複製進去的架包要按住滑鼠右鍵出現Add as Library)。 (2)在已經建立好架包的基礎上在src目錄下建立XML檔案,檔案命為applicationContext.xml,需要注意的是我們建

Spring IOC 依賴注入( 二 )

目錄 1、什麼是IOC 2、什麼是DI 3、第一個IOC示例程式 -- 通過id獲取物件(重點) 1、建立一個Java工程:             

sql注入原理預防措施

SQL注入就是通過把SQL命令插入到Web表單提交或輸入域名或頁面請求的查詢字串,最終達到欺騙伺服器執行惡意的SQL命令。對於很多網站都有使用者提交表單的埠,提交的資料插入MySQL資料庫中,就有可能發生SQL注入安全問題,那麼,如何防止SQL注入呢? 針對SQL注入安全問題的預防,需時刻認定使

spring依賴注入 -------基於註解方式

前言: 做了2年的軟體,剛開始入行的時候,沒有個目標基本上都是在摸索,技術看的我眼花繚亂,這個想學,那個也想學結果是對很多技術一知半解的,工作中才發現,我們要掌握的一門可以搞定快速開發搞定所有業務需求的技術, 所以現在我要對spring的東西達到一個深層次的掌握,儘量避免百度,在開發

spring 04-Spring框架依賴注入基本使用

Spring的依賴注入形式實際上所有物件產生控制都要通過applicationContext.xml檔案實現 依賴注入必須啟動容器後才可以進行該配置檔案的內部的載入操作 依賴注入之有參構造 定義一個Dept類 package cn.liang.vo; import

Spring IoC容器設計原理高階特性

文章目錄 Spring IoC容器概述 IoC容器系列的設計與實現:BeanFactory和ApplicationContext BeanFactory BeanFactory容器的設計原理 Applicatio

spring依賴注入方式總結

文章來源於今日頭條使用者:分散式系統架構 一、註解注入 註解注入在Spring中是用的最多的一種方式,就是在java程式碼中使用註解的方式進行裝配,在程式碼中加入@Resource或者@Autowired、 1、Autowired是自動注入,自動從spring的上下文找到合適的bean來

SSM(一):spring-ioc依賴注入筆記

一、java代理模式   java代理模式是ioc的前置知識。代理模式非常簡單,看程式碼就一目瞭然了。 public interface role { public void makeMoney(); } role public cla

Spring IOC 依賴注入( 二 )

目錄 圖解: 流程圖解: 圖解流程: 1、什麼是IOC IOC 全稱指的是 Inverse Of Control 控制反轉。 原

也談Spring依賴注入DI/控制反轉IOC

首先提問, 什麼是 Spring IOC 容器?         Spring 框架的核心是 Spring 容器。容器建立物件,將它們裝配在一起,配置它們並管理它們的完整生命週期。Spring 容器使用依賴注入來管理組成應用程式的元件。容器通過讀取提供的配置元資料來接收物件

Spring監聽器之ApplicationListener原理原始碼解析例項

一、原理及原始碼解析 事件:ContextRefreshedEvent、IOCTest_Ext$1[source=我釋出的事件]、ContextClosedEvent;  *  1)、ContextRefreshedEvent事件:  *      1)、容器建立物件:re

通俗易懂的spring依賴注入(和控制反轉)的講解。

Spring 能有效地組織J2EE應用各層的物件。不管是控制層的Action物件,還是業務層的Service物件,還是持久層的DAO物件,都可在Spring的管理下有機地協調、執行。Spring將各層的物件以鬆耦合的方式組織在一起,Action物件無須關心Service物件的具體實現,Service

php laravel實現依賴注入原理(反射機制)

在使用laravel的時候,可以看到大量地使用了依賴注入。比如控制器中的HttpRequest物件,各種Model的實現類等等。這種實現方式的好處在於不需要再方法中頻繁地new某些例項,實現模組的解耦。 依賴注入使用PHP反射API實現 反射機制被多種語言使用,用來獲取類、例項物件、方法

【架構師之路】依賴注入原理---IoC框架

github上一篇比較貼切的舉例: https://github.com/android-cn/blog/tree/master/java/dependency-injection 1 IoC理論的背景     我們都知道,在採用面向物件方法設

Spring依賴注入應用代替工廠模式

介面 package FactoryExample; public interface Human { void eat(); void walk(); void show(); } 實現 實現一 package FactoryExample; public clas