概念
IOC:Inversion of Control 控制反转,即将生成对象的工作交给Spring容器来实现。
DI:Dependency Injection 依赖注入,将一个类需要的其他对象(即依赖)通过Spring容器注入。
—————————————————————————————————————————————————————————————————————————————
IOC:控制反转
首先,在工程的src目录下创建applicationContext.xml文件(applicationContext.xml文件通常可以放在src和WEB-INF目录下),并引入Spring的Schema验证,
该验证代码可以在xsd-config.html文件中找到(文件位于Spring开发包的docs/spring-framework-reference/html/xsd-config.html目录中)。<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.xsd"> </beans>
Dao层:
接口:
public interface UserDao {
public void save();
}
实现类:
public class UserDaoImpl implements UserDao{
@Override
public void save() {
System.out.println("持久层:添加用户...");
}
}
Service层
接口:
public interface UserService {
public void save();
}
实现类:
public class UserServiceImpl implements UserService{
@Override
public void save() {
System.out.println("业务层:添加用户...");
UserDao userDao = new UserDaoImpl();
userDao.save();
}
}
表现层:
public class UserServlet {
public void save(){
System.out.println("表现层: 添加用户 ...");
}
}
在applicationContext.xml文件中配置bean
<bean id="userServlet" class="cn.itcast.spring.a_quickstart.UserServlet"></bean>
<bean id="userService" class="cn.itcast.spring.a_quickstart.UserServiceImpl"></bean>
<bean id="userDao" class="cn.itcast.spring.a_quickstart.UserDaoImpl"></bean>
同时在UserServlet中添加获取业务层对象的代码:
public class UserServlet {
public void save(){
System.out.println("表现层: 添加用户 ...");
UserService userService = new UserServiceImpl();
userService.save();
}
}
测试用例:
@Test
public void regist(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserServlet userServlet = (UserServlet) applicationContext.getBean("userServlet");
userServlet.save();
}
输出结果:
至此,IOC的实例讲解完毕,通过IOC将生成的对象的操作交给Spring容器来完成,如果修改了代码或接口的实现,只需要修改配置文件,实现了松耦合。但是到这里并没有完成DI的操作。
—————————————————————————————————————————————————————————————————————————————
DI:依赖注入
修改UserServlet类添加userService成员变量,并生成set方法, 代码如下:
public class UserServlet {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void save(){
System.out.println("表现层: 添加用户 ...");
userService.save();
}
}
修改applicationContext.xml配置,代码如下:
<bean id="userServlet" class="cn.itcast.spring.a_quickstart.UserServlet">
<property name="userService" ref="userService" />
</bean>
<bean id="userService" class="cn.itcast.spring.a_quickstart.UserServiceImpl"></bean>
<bean id="userDao" class="cn.itcast.spring.a_quickstart.UserDaoImpl"></bean>
<property>标签中的name属性对应对象中的setXXX方法,代表对象中含有某个属性,ref属性代表引用的另一个Bean的id。
当返回UserServlet时,同时提供依赖的UserService对象。
依赖注入配置完成。