最近看文章,看到一个概念,spring的IOC是个啥?依赖注入又是个啥?
为什么用spring?解决什么问题?怎么用?
要搞清除这个问题首先明确一个概念,java中所有的object都需要new出来,才能够使用。问题来了,早期没有框架的时候,我们都要自己手动的去new各种object,如果写的大大咧咧,可能导致资源的严重浪费。而且每个object中的方法中可能会包含其他的object,各种混乱。
设计模式中讲求的几个关键点:低耦合
,减少入侵
,所以spring框架的诞生就为我们解决了这个问题。springioc容器,就是帮助我们创建,管理,销毁Object的。在实际应用中,我们大多用到的是创建,也就是xml配置文件的方式告诉spring怎么去创建一个object(可能大家叫注册)。
如果是springmvc项目,xml一定有这样配置bean的代码(在没有注解之前,这类代码会有很大一堆):
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
</bean>
回想之前学到的反射,多么的熟悉,class的全称,还有属性名称和值。
spring IOC的实现原理就是通过反射,创建object
至于反射的相关知识这不详细的介绍了。所以并不是不new对象了,而是因为spring接管了这部分功能。项目启动的时候,spring的ioc容器首先构建起来,然后他会去扫xml配置文件,然后查看有哪些bean注册,然后依据class的名称初始化这个对象。
啥是依赖注入?
上面只讲解到了简单的注入一个bean,且只是一个属性。我们实际的项目中不可能这么简单啊。比如mvc设计模式中经常用到的service和dao层。
public UserServiceImpl implements IUserService{
private IUserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void findOne(String uid){
User user = userDao.findById(uid);
}
}
@Controller
public class UserController{
private IUserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public User findOne(){
return userService.findOne("1");
}
}
看这2个类,controller引用了service,而service引用了dao。那么在xml配置文件中是怎么配置的?
<bean name="userDao" class="com.xxx.dao.impl.UserDaoImpl"/>
<!-- 声明userService对象,交给spring创建 -->
<bean name="userService" class="com.xxx.service.impl.UserServiceImpl">
<!-- 注入userDao对象,需要set方法-->
<property name="userDao" ref="userDao"/>
</bean>
这种一个对象中需要引入另外一个对象的情况下,spring在解析的时候发现userService依赖userDao,所以先注入userDao。这就是依赖注入。
现在springboot,springcloud等微服务中都已经差不多省略掉了配置文件了,底层对应用也越来越透明,但是还是要了解一下底层
基础不牢,地动山摇。
总结
本文没有去追踪spring的源码,只是大致上简单的讲解一下ioc的概念,至于spring底层实现用到的设计模式大家自己有时间还是要看下加深印象。