SpringIOC理解

最近看文章,看到一个概念,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底层实现用到的设计模式大家自己有时间还是要看下加深印象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值