zoukankan      html  css  js  c++  java
  • Spring实践第三天 (SpringDI:依赖注入)

    说明:

     昨天已经采用构造方法建立了一个项目并测试成功,

    今天的项目实践如果看不懂就请参考我昨天实践写的博文:

    Spring实践第一天(ioc 简单 HelloWorld)

    入门小白,请多指教!

     

     

    一、创建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:

     明日原理加更~

  • 相关阅读:
    SDN第二次上机作业
    全面而清晰的网络流
    source命令详解
    C++ 优先队列存放自定义类型的指针时自定义优先级失效的解决方法
    find命令查找文件和文件夹
    OOAD
    NULL与nullptr
    Segment fault 常见原因
    虚函数的用法
    使用gdb调试段错误
  • 原文地址:https://www.cnblogs.com/yangf428/p/12291740.html
Copyright © 2011-2022 走看看