Spring实践第三天 (SpringDI:依赖注入)
说明:
昨天已经采用构造方法建立了一个项目并测试成功,
今天的项目实践如果看不懂就请参考我昨天实践写的博文:
入门小白,请多指教!
一、创建Dao类
如上图说明中的目录,创建UserDao接口:
package com.nenu.dao; public interface UserDao { public void add(); }
和 UserDao 对应的类 UserDaoImpl:
package com.nenu.dao.impl; import com.nenu.dao.UserDao; public class UserDaoImpl implements UserDao { @Override public void add(){ System.out.println("UserDaoImpl add"); } }
而相应的Service层需要做相应修改
UserService不变:
package com.nenu.service; public interface UserService { public void add(); }
UserServiceImpl需要作出相应修改:
package com.nenu.service.impl; import com.nenu.dao.UserDao; import com.nenu.dao.impl.UserDaoImpl; import com.nenu.service.UserService; public class UserServiceImpl implements UserService { private UserDao userDao;//面向接口 @Override public void add() { System.out.println("UserServiceImpl add……"); userDao.add();//面向接口的userDao再进行add方法调用 } //这是一个setter方法,设置userDao属性的值 public void setUserDao(UserDaoImpl userDao) { this.userDao = userDao; }
//这是构造方法,设置userDao属性的值 public UserServiceImpl(UserDao userDao) { this.userDao = userDao; } }
二、配置依赖的关系
在applicationContext.xml中配置bean以及其中的对应的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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-3.0.xsd">
<!-- Spring配置依赖关系,两种方法任选其一 -->
<bean id="UserService" class="com.nenu.service.impl.UserServiceImpl">
<!--第一种方式:setter方法-->
<!--<property name="userDao" ref="UserDao"/>-->
<!--第二种方式-->
<constructor-arg name="userDao" ref="UserDao"/>
</bean>
<bean id="UserDao" class="com.nenu.dao.impl.UserDaoImpl"/>
</beans>
三、测试
在测试类UserTest中写测试代码:
package com.nenu; import com.nenu.service.UserService; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class UserTest { @Test public void userTest(){ //1.加载容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //2.通过容器获取里面的bean UserService userService = (UserService) applicationContext.getBean("UserService"); //3.执行 userService.add(); } }
成功辣!!!
四、总结
依赖注入主要有两种变体(下面的两个子章将结合实例涵盖它们):
序号 | 依赖注入类型 & 描述 |
---|---|
1 | Constructor-based dependency injection
当容器调用带有多个参数的构造函数类时,实现基于构造函数的 DI,每个代表在其他类中的一个依赖关系。 |
2 | Setter-based dependency injection
基于 setter 方法的 DI 是通过在调用无参数的构造函数或无参数的静态工厂方法实例化 bean 之后容器调用 beans 的 setter 方法来实现的。 |
你可以混合这两种方法,基于构造函数和基于 setter 方法的 DI,然而使用有强制性依存关系的构造函数和有可选依赖关系的 sette r是一个好的做法。
代码是 DI 原理的清洗机,当对象与它们的依赖关系被提供时,解耦效果更明显。对象不查找它的依赖关系,也不知道依赖关系的位置或类,而这一切都由 Spring 框架控制的。
什么是依赖?
如果说“is a”代表继承, 那么“has a”就代表依赖!
- 依赖:一个对象需要使用另一个对象
- 注入:通过第三方使这个对象实例化
Servlet 依赖 Service, Service 依赖 Dao:
明日原理加更~