Spring实践第三天 (SpringDI:依赖注入) Spring实践第一天(ioc 简单 HelloWorld)

说明:

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

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

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层需要做相应修改

扫描二维码关注公众号,回复: 9063993 查看本文章

UserService不变:

package com.nenu.service;

public interface UserService {
    public void add();
}

UserService需要作出相应修改:

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();
    }
    
    //下面需要和 bean 对应的 setter、getter、constructor等
    public UserServiceImpl() {

    }
    
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public UserDao getUserDao() {
        return 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">

    <!-- 1.采用构造方法来创建 -->
    <!--Spring配置依赖关系:
    property 属性,ref 引用到依赖的类,如果是值才用 value;-->
    <!-- 在 bean里配置依赖 -->
    <bean id="UserService" class="com.nenu.service.impl.UserServiceImpl">
        <!-- 提供setter方法注入 -->
        <property name="userDao" ref="userDao"/>
        <!--通过构造方法的方式来注入
        <constructor-arg name="userDao" ref="userDao"></constructor-arg>
        -->
    </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:

猜你喜欢

转载自www.cnblogs.com/yangf428/p/12291740.html