spring之控制反转IOC和依赖注入DI

分手后的思念是犯贱 2024-04-17 06:27 157阅读 0赞

一、Spring中IOC控制反转的概念

控制反转就是我们在代码中生成一个对象时候不用手动去new这个对象了,而是把生产实例对象的工作交给了spring容器,spring容器在加载的时候读取配置文件applicationContext.xml配置文件,加载我们配置好的一些bean,来生成这些对象。

二、传统的servlet中和使用Spring框架后的对照

举个例子:

  1. public interface IUserDao {
  2. public void findByUsernameAndPassowrd();
  3. }
  4. public class UserDaoImpl implements IUserDao{
  5. @Override
  6. public void findByUsernameAndPassowrd() {
  7. System.out.println("UserDaoImpl dao已经加载");
  8. }
  9. }
  10. public interface IUserService {
  11. public void login();
  12. }
  13. public class UserServiceImpl implements IUserService{
  14. @Override
  15. public void login() {
  16. IUserDao userDao = new UserDaoImpl();
  17. userDao.findByUsernameAndPassowrd();
  18. System.out.println("UserServiceImpl -- service已经加载");
  19. }
  20. }
  21. public class SpringTest {
  22. @Test
  23. public void test(){
  24. //传统的方式
  25. IUserService userService = new UserServiceImpl();
  26. userService.login();
  27. }
  28. }

以上的几个类中,在测试类中调用service的方法和在service中调用dao中的方法都是要我们去new 一个对象,然后去调用对象的方法,这样的话如果在多个方法中我们都要去调用service或者dao中的方法的时候,我们就要每次都去手写生成对象然后再去调用对象的方法,很是麻烦,于是我们就引入了spring框架中的ioc控制反转,把生成对象的任务交给了spring容器来处理,在spring容器加载的时候去生成对象。
比如我们把dao层生成对象的方法交给spring容器来处理,在applicationContext.xml文件这样来配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- spring中,每个要创建的对象都是一个bean节点 -->
  7. <!-- 设置2个参数,一个 id ,另一个 class -->
  8. <!-- class:要new的对象,包含 包名和类名 -->
  9. <!-- id:标识,java代码中根据这个标识来使用创建的对象 -->
  10. <!--创建dao对象-->
  11. <bean id="userDao" class="com.igeek.UserDaoImpl"></bean>
  12. <!--创建service对象 -->
  13. <bean name="userService" class="com.igeek.spring.UserServiceImpl"></bean>
  14. </beans>

在applicationContext.xml中控制反转体现在:

  1. <bean id="userDao" class="com.igeek.UserDaoImpl"></bean>
  2. <bean name="userService" class="com.igeek.spring.UserServiceImpl">

配置的这个bean会在spring容器加载的时候来生成对象来供其他类来使用。
那么在测试类中和dao中就可以这样来调用:

  1. public class SpringTest {
  2. @Test
  3. public void test(){
  4. //传统的方式
  5. //IUserService userService = new UserServiceImpl();
  6. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  7. IUserService userService = (IUserService)ac.getBean("userService"); //这个userDao一定要对应配置文件中的 bean id 或name.
  8. userService.login();
  9. }
  10. }
  11. public class UserServiceImpl implements IUserService{
  12. @Override
  13. public void login() {
  14. //IUserDao userDao = new UserDaoImpl();
  15. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  16. IUserDao userDao = (IUserDao)ac.getBean("userDao");
  17. userDao.findByUsernameAndPassowrd();
  18. System.out.println("UserServiceImpl -- service已经加载");
  19. }
  20. }

以上把创建userDao和userService的对象的任务交给了spring容器。但是现在还有一个问题就是我们每次用对象都要读取spring配置文件去getBean来拿到对象有些麻烦,于是就引入了下一个概念DI依赖注入:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="
  5. http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  6. <!-- spring中,每个要创建的对象都是一个bean节点 -->
  7. <!-- 设置2个参数,一个 id ,另一个 class -->
  8. <!-- class:要new的对象,包含 包名和类名 -->
  9. <!-- id:标识,java代码中根据这个标识来使用创建的对象 -->
  10. <bean id="userDao" class="com.igeek.UserDaoImpl"></bean>
  11. <!--创建service对象 -->
  12. <bean name="userService" class="com.igeek.spring.UserServiceImpl">
  13. <!-- 配置依赖注入 -->
  14. <!-- ref: userDao =bean id="userDao" -->
  15. <!--name="userDao" 与 UserServiceImpl中 setUserDao方法对应 -->
  16. <property name="userDao" ref="userDao"></property>
  17. </bean>
  18. </beans>

在配置文件中我们在userService的配置bean中用property这个标签属性注入了userDao这个依赖的对象。

  1. <bean name="userService" class="com.igeek.spring.UserServiceImpl">
  2. <!-- 配置依赖注入 -->
  3. <!-- ref: userDao =bean id="userDao" -->
  4. <!--name="userDao" 与 UserServiceImpl中 setUserDao方法对应 -->
  5. <property name="userDao" ref="userDao"></property>
  6. </bean>

配置完成后我们可以在service实现类中,这里我们用set方法来获取到这个对象就可以了

  1. public class UserServiceImpl implements IUserService{
  2. private IUserDao userDao;
  3. public void setUserDao(IUserDao userDao){
  4. this.userDao = userDao;
  5. }
  6. @Override
  7. public void login() {
  8. //IUserDao userDao = new UserDaoImpl();
  9. //ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  10. //IUserDao userDao = (IUserDao)ac.getBean("userDao");
  11. userDao.findByUsernameAndPassowrd();
  12. System.out.println("UserServiceImpl -- service已经加载");
  13. }
  14. }

发表评论

表情:
评论列表 (有 0 条评论,157人围观)

还没有评论,来说两句吧...

相关阅读