1. 程式人生 > >Spring XML 注入

Spring XML 注入

Spring XML 注入

DI:

依賴注入:

從Spring 容器中取出物件,注入到需要的地方。

根據所需要了解的注入方式建立下方的類。

建立UserServiceImpl類

package com.arno.service.impl;

import com.arno.dao.UserDao;
import com.arno.entity.User;
import com.arno.service.UserService;

public class UserServiceImpl implements UserService {
	private UserDao userDao;
	public void setUserDao(UserDao userDao){
		this
.userDao=userDao; } @Override public boolean addUser(User user) { System.out.println("UserSerivceImpl.addUser()"); userDao.addUser(user); return false; } @Override public boolean updateUser(User user) { System.out.println("UserSerivceImpl.updateUser()"); userDao.updateUser(user); return
false; } }

建立UserDaoImpl類

package com.arno.dao.impl;

import com.arno.dao.UserDao;
import com.arno.entity.User;

public class UserDaoImpl implements UserDao {
	private String driverClass;
	private int port;
	private String dbUserName;
	private String dbPassword;
	
	public void setDriverClass(String driverClass) {
		this.driverClass = driverClass;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public void setDbUserName(String dbUserName) {
		this.dbUserName = dbUserName;
	}

	public void setDbPassword(String dbPassword) {
		this.dbPassword = dbPassword;
	}

	@Override
	public int addUser(User user) {
		System.out.println("UserDaoImpl.adduser()");
		System.out.println(driverClass+"   "+port+"   "+dbUserName+"   "+dbPassword);
		return 0;
	}

	@Override
	public int updateUser(User user) {
		System.out.println("UserDaoImpl.updateuser()");
		return 0;
	}

}

建立Message類

package com.arno.collection;

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

public class Message {
	private List list;
	private Set set;
	private Map map;
	private Properties props;
	public List getList() {
		return list;
	}
	public void setList(List list) {
		this.list = list;
	}
	public Set getSet() {
		return set;
	}
	public void setSet(Set set) {
		this.set = set;
	}
	public Map getMap() {
		return map;
	}
	public void setMap(Map map) {
		this.map = map;
	}
	public Properties getProps() {
		return props;
	}
	public void setProps(Properties props) {
		this.props = props;
	}
	@Override
	public String toString() {
		return "Message [list=" + list + ", set=" + set + ", map=" + map + ", props=" + props + "]";
	}
	
	
}

注入資料的方式:

setter方式注入:

1.單值注入

在xml中建立UserDaoImpl 物件,並且注入4個屬性值

<!-- 告知spring建立 UserDaoImpl物件        物件名:userDao
        此物件中注入4個數據
        property節點對應一個set方法
        name="driverClass"  driverClass->DriverClass->setDriverClass
        setDriverClass字串去UserDaoImpl類中匹配setDriverClass的方法
        value="com.mysql.jdbc.Driver"
     -->
    <bean id="userDao"  class="com.arno.dao.impl.UserDaoImpl">
       <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
       <property name="port" value="3306"></property>
       <property name="dbUserName" value="root"></property>
       <property name="dbPassword" value="root"></property>

    </bean>

2.物件注入

在xml中建立UserDaoImpl 物件,注入4個屬性值,物件命名為userDao,注入下方名為userService的物件中

		<!-- 告知spring建立 UserDaoImpl物件        物件名:userDao
		     -->
		    <bean id="userDao"  class="com.arno.dao.impl.UserDaoImpl">
		       <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
		       <property name="port" value="3306"></property>
		       <property name="dbUserName" value="root"></property>
		       <property name="dbPassword" value="root"></property>
		    </bean>
		    <!-- 告知spring建立 UserServiceImpl物件  物件名:userService
		    	userService物件中需要UserDaoImpl類的物件
		    	或
		    	userService物件中需要UserDao介面的物件
		    	proerty屬性節點,每一個property節點都會對應一個setter方法
		    	name="userDao" userDao->UserDao->setUserDao
		    	拿setUserDao這個字串作為方法的名稱去UserServiceImpl類中尋找是否有setUserDao的方法
		                     如果有就反射呼叫setUserDao方法,方法的引數就是ref="userDao"
		        ref="userDao"  ref:reference引用    userDao 是spring容器中的一個物件名稱
		      -->
		    <bean id="userService" class="com.arno.service.impl.UserServiceImpl">
		    	<property name="userDao" ref="userDao"></property>
		    </bean>

3.集合注入(直接注入和間接注入)

直接注入,建立Message物件,通過標籤直接注入屬性值

	<!-- 直接集合注入 -->
	<bean id="message1" class="com.arno.collection.Message">
		<property name="list">
			<list>
				<value>北京</value>
				<value>上海</value>
				<value>廣州</value>
				<ref bean="hello"></ref>
			</list>
		</property>
		<property name="set">
			<set>
				<value>北京</value>
				<value>上海</value>
				<value>廣州</value>
				<ref bean="hello"></ref>
			</set>
		</property>
		<property name="map">
			<map>
			    <entry key="bj" value="北京"></entry>
				<entry key="sh" value="上海"></entry>
				<entry key="gz" value="廣州"></entry>
			</map>
		</property>
		<property name="props">
			<props>
				<prop key="bj">北京</prop>
				<prop key="sh">上海</prop>
				<prop key="gz">廣州</prop>
			</props>
		</property>
	</bean>

間接注入,建立Hello物件和集合。建立Message物件,通過標籤引用hello物件和集合注入到Message物件的屬性中

	<!-- 間接集合注入 -->
	<bean id="hello" class="com.arno.ioc.Hello"></bean>
	<util:list id="ulist">
		<value>北京</value>
		<value>上海</value>
		<value>廣州</value>
		<ref bean="hello"></ref>
	</util:list>
	<util:set id="uset">
		<value>北京</value>
		<value>上海</value>
		<value>廣州</value>
		<ref bean="hello"></ref>
	</util:set>
	<util:map id="umap">
	  	<entry key="bj" value="北京"></entry>
		<entry key="sh" value="上海"></entry>
		<entry key="gz" value="廣州"></entry>
		<entry key="hello" value-ref="hello"></entry>
	</util:map>
	<util:properties id="uprops">
		<prop key="bj">北京</prop>
		<prop key="sh">上海</prop>
		<prop key="gz">廣州</prop>
	</util:properties>
	<bean id="message2" class="com.arno.collection.Message">
		<property name="list" ref="ulist"></property>
		<property name="set" ref="uset"></property>
		<property name="map" ref="umap"></property>
		<property name="props" ref="uprops"></property>
	</bean>
4.屬性注入(把屬性檔案中的資料注入給物件中)

${}方式:
建立mysql.properties檔案(注意規避關鍵詞)

	jdbc_driverClass=com.mysql.jdbc.Driver
	jdbc_url=jdbc:mysql://localhost:3306/tesdb
	jdbc_userName=root
	jdbc_userPassword=root

建立jdbcUtil1和jdbcUtil2類

public class JDBCUtil1 {
		private String driverClass;
		private String url;
		private String userName;
		private String userPassword;
	        getter and setter(生成get/set方法)
	}

通過${}方式取得mysql.properties內容並注入到jdbcUtil1物件中

	<!-- 用spring把屬性檔案的內容載入到spring容器中 ,多個屬性檔案用逗號間隔-->
	  	<context:property-placeholder location="classpath:conf/mysql.properties"/>
	  	
	  	
	  	<bean id="jdbcUtil1" class="com.arno.properties.JDBCUtil1">
	  		<property name="driverClass" value="${jdbc_driverClass}"></property>
	  		<property name="url" value="${jdbc_url}"></property>
	  		<property name="userName" value="${jdbc_userName}"></property>
	  		<property name="userPassword" value="${jdbc_userPassword}"></property>
	  	</bean>

#{}方式:
通過#{}方式取得mysql.properties內容並注入到jdbcUtil1物件中

	<!-- 用spring把屬性檔案的內容載入到spring容器中 ,多個屬性檔案用逗號間隔-->
	  	<util:properties id="manyProperties"
	  	                 location="classpath:conf/mysql.properties"></util:properties>
	  	  	
	  	
	  	<bean id="jdbcUtil2" class="com.arno.properties.JDBCUtil2">
	  		<property name="driverClass" value="#{manyProperties.jdbc_driverClass}"></property>
	  		<property name="url" value="#{manyProperties.jdbc_url}"></property>
	  		<property name="userName" value="#{manyProperties.jdbc_userName}"></property>
	  		<property name="userPassword" value="#{manyProperties.jdbc_userPassword}"></property>
	  	</bean>
5.空值注入

空值兩種:"" 空字串和null 空指標

建立Kong類

package com.arno.kong;

public class Kong {
	private String str1;
	private String str2;
	public String getStr1() {
		return str1;
	}
	public void setStr1(String str1) {
		this.str1 = str1;
	}
	public String getStr2() {
		return str2;
	}
	public void