Spring-DI控制反转和IOC依赖注入

Posted 2sheep2simple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring-DI控制反转和IOC依赖注入相关的知识,希望对你有一定的参考价值。

Spring-DI控制反转和IOC依赖注入

DI控制反转实例

IDEAJ自动导入Spring框架

技术图片

创建UserDao.java接口
public interface UserDao {
    public void say();
}
创建UserDaoImpl.java继承UserDao.java并重写say()方法
public class UserDaoImpl implements UserDao{
    @Override
    public void say() {
        System.out.println("i am a UserDaoImpl");
    }
}
创建SpringBean配置文件ApplicationContext.xml

这个温江,相当于花名册,Spring中的Bean全部需要在这里注册,当遇到实例化某个Bean时,只需要翻开花名册,根据它的name来获取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.xsd">
       <bean id = "userDao"  class="UserDaoImpl"></bean>
</beans>
创建DI的测试类TestDI.java并实例化userDao对象

ApplicationContext类是Spring中的org.springframework.context.BeanFactory的子接口,是Spring中的Bean实例加工厂。

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestDI {
    ApplicationContext applicationContext =
            new ClassPathXmlApplicationContext("ApplicationContext.xml");
    UserDao userDao = (UserDao) applicationContext.getBean("userDao");
    @Test
    public void testDI() {
        userDao.say();
    }
}
测试testDI()方法

通过JUnit4运行testDI()方法,运行结果如下:

技术图片

总结

控制反转(DI)本质上是一种创建实例化对象的方式,通过控制反转,程序员不需要通过new关键字来创建对象,而是直接通过对象的名字从BeanFactory的子接口ApplicationContext中取出实例化好的对象,BeanFactory本质上是Spring中容器。

依赖注入

创建UserService.java接口
public interface UserService {
    public void  say();
}
创建UserServiceImpl.java继承UserService.java并重写say()方法
public class UserServiceImpl implements UserService{
    @Override
    public void say() {
        System.out.println("i am a UserServiceImpl !");
    }
}
UserServiceImpl.java中声明UserDao对象,并生成setUserDao()方法注入UserDao对象
public class UserServiceImpl implements UserService{

    private UserDao userDao;

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

    @Override
    public void say() {
        userDao.say();
        System.out.println("i am a UserServiceImpl !");
    }
}
ApplicationContext.xml文件中配置UserServiceImpl
<?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.xsd">
       <bean id = "userDao"  class="UserDaoImpl"></bean>
       <!-- 将id为uerDao的Bean实例注入到userService实例中 -->
       <bean id = "userService" class="UserServiceImpl" >
              <!-- property标签调用userService实例中的setUserDao方法实现依赖注入 -->
              <property name="userDao" ref="userDao"></property>
              <!-- name属性表示userService实例中的属性名称,
                   ref属性表示userService实例中的属性值 -->
       </bean>
</beans>
创建IOC的测试类TestIOC.java并实例化userService对象
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestIOC {
    
    ApplicationContext applicationContext =
            new ClassPathXmlApplicationContext("ApplicationContext.xml");
    UserService userService = (UserService) applicationContext.getBean("userService");
    @Test
    public void testIOC() {
        userService.say();
    }
}
测试testIOC()方法

技术图片

总结

UserServiceImpl.java里实例化UserDao对象作为它的属性,UseServiceImpl.javaUserDaoImpl.java产生依赖关系。通过setUserDao()方法将userDao对象注入就叫做依赖注入。

以上是关于Spring-DI控制反转和IOC依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

PHP依赖注入,控制反转,反射Ioc容器和服务提供者各个概念的理解和使用

spring依赖注入,和控制反转。用自己的话说是怎么说的。最好能够用代码来解释

spring------控制反转(IOC)/依赖注入(DI)

IOC 控制反转IOC 简介 ( 依赖注入的两种实现方式 | 编译期注入 | 运行期注入 )

控制反转(IOC)和依赖注入(DI)的区别