通常我们在程序中会使用new关键字来实现一个类依赖于另一个类,这样虽然可以实现需求。但是也存在一个问题,就是不容易统一管理。而Spring提出了依赖注入的思想,使用Spring容器来进行注入,也称为控制反转。
常用的注入方法有两种:构造函数法和set注入
1、构造函数法
在需要注入的java类中创建构造函数,如下:
package com.tgb.spring.manager; import com.tgb.spring.dao.IUserDao; public class UserManagerImp implements IUserManager { private IUserDao userDao; //构造函数法进行spring注入 public UserManagerImp(IUserDao userDao){ this.userDao=userDao; } @Override public void addUser(String username, String password) { userDao.addUser(username, password); } }在Spring配置文件中进行如下配置:
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 配置dao层的实现 --> <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MySqlImp"/> <bean id="usrDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImp"/> <!-- 配置manager层 --> <bean id="userManager" class="com.tgb.spring.manager.UserManagerImp"> <!-- manager指向配置好的dao层 这样就不用在manager中使用new dao--> <!-- 构造函数法注入 指向dao层实现的方法,即上述dao层实现的id值--> <constructor-arg ref="userDao4Mysql"/> </bean> </beans>注意:
(1)在需要注入的类中创建构造函数。
(2)在Spring配置文件中使用<constructor-arg>标签来设置需要注入的类
2、set方法设置
在需要注入的java类中添加set方法,如下:
package com.tgb.spring.manager; import com.tgb.spring.dao.IUserDao; public class UserManagerImp implements IUserManager { private IUserDao userDao; //使用set方法进行spring注入 public void setUserDao(IUserDao userDao) { this.userDao = userDao; } @Override public void addUser(String username, String password) { userDao.addUser(username, password); } }在Spring配置文件中进行如下配置:
<?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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <!-- 配置dao层的实现 --> <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MySqlImp"/> <bean id="usrDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImp"/> <!-- 配置manager层 --> <bean id="userManager" class="com.tgb.spring.manager.UserManagerImp"> <!-- manager指向配置好的dao层 这样就不用在manager中使用new dao--> <!-- set方法注入 --> <property name="userDao" ref="usrDao4Oracle"/> </bean> </beans>注意:
(1)在需要注入的类中必须实现set方法
(2)在Spring配置文件中使用<property>标签进行类指向。
小结:
通过上述配置实现,我们很容易发现使用Spring注入相对于之前使用new方式的优势,大量减少Factory和Singleton数量,使代码层次更加清晰。查找、定位、创建和管理对象关系,都由IOC管理。而且,使用配置的形式,使我们的操作更加灵活方便。