用大白话来说一说对spring IOC、DI 的理解

IOC控制反转
先从最基础的mvc三层来讲,一般在controller中new出service的实现类,在service中new出dao实现类,层层联系都非常紧密,专业来讲就是耦合度高,spring为了解耦合,想不再以new对象的形式来获取一个实例,然后就有了控制反转一说,看反转这个字面意思也感觉好像我不是主动去拿我要的实例对象了,而是以一种方式递给我,的确,spring有ioc容器一说,这个容器也就是xml配置文件,在配置文件中可以配置bean,一个bean就相当于一个类,你可以从容器中取出你要的实例对象,例如以下:

<bean id="person" class="cn.hp.bean.Person"></bean>
public static void main(String[] args) {
	ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
	Person person = app.getBean("person",Person.class);
	System.out.println(person);
}

第一个代码片段是在配置文件中定义bean,第二个是获取person实例对象,但是看到main方法,这不还是要手动获取实例对象嘛,还是存在一定的耦合啊,这时候要用到对成员属性值的注入;

DI依赖注入
这个注入就是为类中的属性赋予值,之前我们说控制反转,希望能把bean实例自动递给我们,DI就可以实现这个操作,还是以三层且面向接口举例子,在controller层中定义一个service接口,你可以通过配置xml或给service接口加上注解的方式,把service实现类赋予接口,前提是controller和service实现类要在容器中,代码以下:

@Controller
public class UserController {
	@Autowired
	private UserService service;
	
	public void hello(){
		service.hello();
	}
}
@Service
public class UserServiceImpl implements UserService {
	@Autowired
	private UserDao dao;
	
	@Override
	public String hello() {
		return dao.hello();
	}
}

DI可以将在容器中匹配到类型一致的实例注入给相应接口,这样的确实现了反转及自动注入的效果,极致的解除了耦合,那如果容器中存在多个类型一致的实现类该怎么办,可以使用@Qualifier(value="")@Resource(name="")注解来灵活获取某一个实现类,也不需改动Java代码。

对IOC与DI举一个生活中场景的小例子
你要给你女儿过生日,你所在的镇上没有蛋糕店,你只能自己操心自己做,后来镇上开了一家蛋糕店,你只要给店里打个电话说出你的需求,店家会骑车把蛋糕送到你家门口,你感到很开心。

发布了12 篇原创文章 · 获赞 3 · 访问量 239

猜你喜欢

转载自blog.csdn.net/qq_38599840/article/details/104852277
今日推荐