Spring XML 注入
阿新 • • 發佈:2019-01-14
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