目录
1.依赖注入方式
1.1 setter注入
public class BookDaoImpl implements BookDao {
//setter注入——基本类型
private int dataConnectionNum;//可以动态配置
private String dataBaseName;//可以动态配置
public void setDataConnectionNum(int dataConnectionNum) {
this.dataConnectionNum = dataConnectionNum;
}
public void setDataBaseName(String dataBaseName) {
this.dataBaseName = dataBaseName;
}
public void save() {
System.out.println("BookDaoImpl save()"+" databaseName:"+dataBaseName+" dataConnectionNum:"+dataConnectionNum);
}
}
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("UserDaoImpl save()");
}
}
public class ServiceImpl implements Service {
//setter注入——引用类型
private BookDao bookDao;
private UserDao userDao;
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void save() {
System.out.println("ServiceImpl save()");
bookDao.save();
userDao.save();
}
}
public class App {
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean(根据bean配置id获取)
Service service = (Service) ctx.getBean("service");
service.save();
//控制台:
//ServiceImpl save()
//BookDaoImpl save() databaseName:MySQL dataConnectionNum:10 //可以动态获取
//UserDaoImpl save()
}
}
<bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
<bean id="bookDao" class="com.dao.impl.BookDaoImpl">
<!--setter注入——基本类型-->
<property name="dataBaseName" value="MySQL"/>
<property name="dataConnectionNum" value="10"/>
</bean>
<bean id="service" class="com.service.impl.ServiceImpl">
<!--setter注入——引用类型-->
<property name="bookDao" ref="bookDao"/>
<property name="userDao" ref="userDao"/>
</bean>
1.2 构造器注入
public class BookDaoImpl implements BookDao {
//setter注入——基本类型
private String dataBaseName;//可以动态配置
private int dataConnectionNum;//可以动态配置
public BookDaoImpl(String dataBaseName, int dataConnectionNum) {
this.dataBaseName = dataBaseName;
this.dataConnectionNum = dataConnectionNum;
}
public void save() {
System.out.println("BookDaoImpl save()"+" databaseName:"+dataBaseName+" dataConnectionNum:"+dataConnectionNum);
}
}
public class UserDaoImpl implements UserDao {
public void save() {
System.out.println("UserDaoImpl save()");
}
}
public class ServiceImpl implements Service {
//setter注入——引用类型
private BookDao bookDao;
private UserDao userDao;
public ServiceImpl(BookDao bookDao, UserDao userDao) {
this.bookDao = bookDao;
this.userDao = userDao;
}
public void save() {
System.out.println("ServiceImpl save()");
bookDao.save();
userDao.save();
}
}
public class App {
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean(根据bean配置id获取)
Service service = (Service) ctx.getBean("service");
service.save();
//控制台:
//ServiceImpl save()
//BookDaoImpl save() databaseName:MySQL dataConnectionNum:10 //可以动态获取
//UserDaoImpl save()
}
}
<!--标准写法-->
<bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
<bean id="bookDao" class="com.dao.impl.BookDaoImpl">
<!--构造器注入——基本类型-->
<constructor-arg name="dataBaseName" value="MySQL"/>
<constructor-arg name="dataConnectionNum" value="10"/>
</bean>
<bean id="service" class="com.service.impl.ServiceImpl">
<!--构造器注入——引用类型-->
<!--name是构造方法中的参数名称,ref是bean的id-->
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
解耦的另外两种参数配置
<!--解决形参名问题-->
<bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
<bean id="bookDao" class="com.dao.impl.BookDaoImpl">
<!--构造器注入——基本类型-->
<constructor-arg type="java.lang.String" value="MySQL"/>
<constructor-arg type="int" value="10"/>
</bean>
<bean id="service" class="com.service.impl.ServiceImpl">
<!--构造器注入——引用类型-->
<!--name是构造方法中的参数名称,ref是bean的id-->
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
<!--解决参数类型重复问题,使用参数位置匹配-->
<bean id="userDao" class="com.dao.impl.UserDaoImpl"/>
<bean id="bookDao" class="com.dao.impl.BookDaoImpl">
<!--构造器注入——基本类型-->
<constructor-arg index="0" value="MySQL"/>
<constructor-arg index="1" value="10"/>
</bean>
<bean id="service" class="com.service.impl.ServiceImpl">
<!--构造器注入——引用类型-->
<!--name是构造方法中的参数名称,ref是bean的id-->
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
1.3 依赖注入方式选择
2.依赖自动装配
<!--自动装配-->
<!--按类型自动装配 常用!!!!!!!-->
<bean id="service" class="com.service.impl.ServiceImpl" autowire="byType"/>
3. 集合注入
public class BookDaoImpl implements BookDao {
private int[] arr;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
private Properties properties;
public void setArr(int[] arr) {
this.arr = arr;
}
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 setProperties(Properties properties) {
this.properties = properties;
}
public void print() {
System.out.println(Arrays.toString(arr));
System.out.println(list);
System.out.println(set);
System.out.println(map);
System.out.println(properties);
}
}
<bean id="bookDao" class="com.dao.impl.BookDaoImpl">
<property name="arr">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
<property name="list">
<list>
<value>zhangsan</value>
<value>lisi</value>
<value>wangwu</value>
</list>
</property>
<property name="set">
<set>
<value>zhangsan</value>
<value>lisi</value>
<value>wangwu</value>
</set>
</property>
<property name="map">
<map>
<entry key="zhangsan" value="30"/>
<entry key="lisi" value="20"/>
<entry key="wangwu" value="25"/>
</map>
</property>
<property name="properties">
<props>
<prop key="zhangsan">30</prop>
<prop key="lisi">20</prop>
<prop key="wangwu">25</prop>
</props>
</property>
</bean>
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean(根据bean配置id获取)
BookDao bookDao = (BookDao) ctx.getBean("bookDao");
bookDao.print();
//[100, 200, 300]
//[zhangsan, lisi, wangwu]
//[zhangsan, lisi, wangwu]
//{zhangsan=30, lisi=20, wangwu=25}
//{zhangsan=30, lisi=20, wangwu=25}
}
}
4.数据源对象管理
4.1在applicationContext.xml中配置
4.2 加载properties文件
<?xml version="1.0" encoding="UTF-8"?>
<!--suppress ALL -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<!--1.开启context命名空间-->
<!--2.使用context空间加载properties文件-->
<context:property-placeholder location="druid.properties"/>
<!--3.使用&{}读取properties文件中的属性-->
<bean name="dataSorse" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${druid.driverClassName}"/>
<property name="url" value="${druid.url}"/>
<property name="username" value="${druid.username}"/>
<property name="password" value="${druid.password}"/>
</bean>
</beans>