1、DI概念

(1)依赖

一个对象需要另一个对象。

(2)注入

通过set方法进行另一个对象实例的设置。

如:

StudentDao studentDao=new StudentDaoImpl();

(3)DI(Dependency Injection)

DI被称为依赖注入,意思是由框架或容器将被调用类注入给调用对象,来解除调用对象和被调用对象之间的依赖关系,DI需要和IoC思想配合使用。

(4)优缺点

优点:

降低了代码的耦合度

缺点:

采用反射的方式来实现DI,在一定程度会影响性能,但是与其好处相比缺点可以忽略

 

 

2、DI实例

(1)分别创建Service层和Dao层的接口和实现类:

Service层:

public interface StudentService {
    public void addStudent();
}
 
public class StudentServiceImpl implements StudentService {
private StudentDao studentDao;

public StudentServiceImpl() {
System.out.println("service的实现类被创建了!!");
}

public StudentDao getStudentDao() {
return studentDao;
}
public void setStudentDao(StudentDao studentDao) {
this.studentDao = studentDao;
}
public void addStudent(){
System.out.println("StudentService的实现类的Add方法!!");
studentDao.addStudent();
}
}
 

Dao层:

public interface StudentDao {
    public void addStudent();
}
public class StudentDaoImpl implements StudentDao {
    @Override
    public void addStudent() {
        System.out.println("StudentDao的实现类的Add方法!!");
    }
}

(2)配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    <bean id="studentDao" class="pers.zhb.dao.StudentDaoImpl">
    </bean>

    <bean id="studentService" class="pers.zhb.service.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"></property>
    </bean>
</beans>

将studentDao配置到StudentServiceImpl

(3)测试:

public class TestDi {
    public static void main(String[] args) {
        ApplicationContext applicationContext=new
                ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象
        StudentServiceImpl studentService=(StudentServiceImpl) applicationContext.getBean("studentService");
        studentService.addStudent();

    }
}

 

3、解耦

(1)以前获取dao层对象的方式:

StudentDao studentDao=new StudentDaoImpl();

(2)spring获取dao层对象的方式:

public class StudentServiceImpl {
    private StudentDao studentDao;
    public StudentDao getStudentDao() {
        return studentDao;
    }
    public void setStudentDao(StudentDao studentDao) {
        this.studentDao = studentDao;
    }
    public void addStudent(){
        System.out.println("StudentService的实现类的Add方法!!");
        studentDao.addStudent();
    }
}

直接调用的接口,不知道实现类的具体情况。将对象的管理交给了spring容器,由spring容器负责对象的创建、对象之间的依赖管理等,可以降低耦合度

 

每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛