2021-08-26 依赖注入DI和控制反转IoC

依赖注入DI(Dependency Injection),与控制反转IoC含义相同,只不过这两个是从两个角度描述同一个概念:

        IoC:使用Spring框架之后,对象的实例由Spring容器创建。也就叫控制翻转。

        DI:从Spring容器的角度来看,Spring容器将被依赖对象赋值给调用者的成员变量,相当于为调用者注入了它依赖的实例。这就是Spring的依赖注入。

依赖注入的实现方式:

第一步:创建一个接口

package com.ithema.ioc;

public interface UserService {
	//在接口中定义say()方法
	public void say();

}

第二步:创建Impl实现类

package com.ithema.ioc;

public class UserServiceImpl implements UserService {
	
	
	/*
	 * 如果想调用需要有UserDao这个属性,
	 * 需要依赖一个UserDao
	*/
	
	
	//第三步:(依赖UserDao)声明UserDao属性
	private UserDao userDao;
	
	
	
	//get方法,这里没用到
	public UserDao getUserDao() {
		return userDao;
	}

	/*
	 * Alt+Shift+S自动生成get/setter
	 * 第五步:创建一个UserDao对象 userDao,目前声明的是空的,想要UserDao的方法,需要setter方法实现依赖注入
	 * 在Spring中,添加UserDao属性的setter方法用于实现依赖注入
	 * 
	 * 写完之后,进入xml配置文件,配置
	 */
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
	
	
	@Override
	public void say() {
		// TODO Auto-generated method stub
		//第一步:实现这个接口,控制台输出一句话
		System.out.println("userService say hello World!");
		
		
		
		/*
		 * 第二步:
		 * 当前是在继承UserService中的Impl实现类,如果想调用UserDao中的方法,需要依赖一个UserDao属性(声明一个UserDao)
		*/
		
		
		
		/*
		 *第四步: 声明过UserDao后,调用UserDao中的say()方法
		 *	   	 调用UserDao中say()方法,执行输出语句;
		 */
		this.userDao.say();
		
		
		
	}



}

第三步:配置UserService的xml配置文件

<?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-4.3.xsd">
        
        <!-- 进行配置,将指定类配置给spring,让spring创建其对象的实例 -->
		<bean id="userDao" class="com.ithema.ioc.UserDaoImpl"></bean>
		<!-- class实现类的权限命名 -->
		
		
		<!--在main里用到,这里用作参考、加深记忆
			 Spring获取Bean的实例两种方法:
        1、Object getBean(String name);

                根据容器中Bean的id或name来获取指定的Bean,返回顶层类型,Object(对象)类型,获取后需要强制类型转换

        2、<T> T getBean(Class<T> requiredType)

                根据类对象的类型来获取Bean的实例。由于时泛型方法,因此不需要强制转换类型
		 -->
		 
		 
		<!-- UserService的配置: 添加一个id为userService的实例 -->
		<bean id="userService" class="com.ithema.ioc.UserServiceImpl">
		
			<!-- 将id为userDao的Bean实例 注入到userService实例中 -->	
			<property name="userDao" ref="userDao"></property>
			<!-- 实现依赖注入时 property 的name属性为需要实现依赖注入的属性
				ref为注入来源bean的id,这里来源于上一个bean的id
			  -->
		</bean>
</beans>

第四步:配置xml完成后,创建一个TestDI的测试文件

        想要使用xml配置文件首先需要加载它

        1、加载配置文件

//1.初始化Spring容器,加载配置文件
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");

        2、创建(加载)Spring容器后,就可以获取Spring容器中的Bean。

Spring获取Bean的实例两种方法:
                (1)、Object getBean(String name);

                根据容器中Bean的id或name来获取指定的Bean,返回顶层类型,Object(对象)类型,获取后需要强制类型转换

                (2)、<T> T getBean(Class<T> requiredType)

                根据类对象的类型来获取Bean的实例。由于时泛型方法,因此不需要强制转换类型
 

//2.通过容器获取UserService实例
		UserService  userService=(UserService) applicationContext.getBean("userService");

        3、调用say()方法

//3.调用实例中的say()方法
		userService.say();

整体:

package com.ithema.ioc;

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

public class TestDI {
	public static void main(String[] args) {
		//1.初始化Spring容器,加载配置文件
		ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
		//2.通过容器获取UserService实例
		UserService  userService=(UserService) applicationContext.getBean("userService");
		//3.调用实例中的say()方法
		userService.say();
	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值