spring的ioc容器
我的理解之什么是spring ico容器
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
很多公司面试的时候都问有没有用过spring,我当然回答用过。但是你让我说它的原理,我还真的搞不明白,因为都是整合成了框架后再用的,甚至更加成熟的框架,是在spring的基础上再一次重构,抽象,所以就更加搞不明白这些到底是什么了。
当然,公司追去的是效益,所以就整理出一套工业化的东西,让来的新人可以直接上手干活,写来写去都是curd。时间一长,完全忘记了底层的代码是怎么写的,甚至很多基础的代码的都不会了,比如让我现在写一个二叉树,我就已经写不出来了。
扯远了,那么,spring到底是个什么东西了?我在网上查了很多资料(虽然网上的资料全部雷同),都说spring的核定是ioc和aop,其中ioc是控制反转,aop是面向切面。
那么问题来了,控制反转是什么?
提示:以下是本篇文章正文内容,下面案例可供参考
一、IOC是什么?
是一种编程思维,为了降低各个模块之间的耦合度而存在的。那么,什么是解耦?
二、实例代码
1. 不使用spring来管理bean的情况下
代码如下(示例):
public class PersonServiceBean {
// 因为需要使用personDao中的save方法,所以必须要new一个personDaoD 的实例
private PersonDao personDao = new PersonDaoBean();
public void save(Person person){
personDao.save(person);
}
}
从上面的代码可以看出,因为需要使用personDao中的save方法,所以必须要new一个personDaoD 的实例,这种写法,在设计模式中被称为“组合”,组合是一种耦合度比较高的关系;组合的类与被组合的类具有相同的生命周期;
那么如果要降低耦合度,可以怎么改呢?
2. 使用聚合的方式来解耦
代码如下(示例):
public class PersonServiceBean {
private PersonDao personDao ;
//通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean,当然也可以使用setter方法进行注入。
public PersonServiceBean(PersonDao personDao){
this.personDao=personDao;
}
public void save(Person person){
personDao.save(person);
}
}
上面这种办法,就是通过PersonServiceBean的构造器传参数,在设计模式中被称为“聚合”,聚合比组合的耦合关系要低,并且,很多情况下,都推荐使用聚合,而不是组合。
另外,我们在项目中,常见的写法:
public class PersonServiceBean {
@resource
private PersonDao personDao ;
public void save(Person person){
personDao.save(person);
}
}
可以看出,通过注解的方式,让代码看起来更加清爽了;
说多一句,现在很多项目,都已经不使用 @Autowired 了,因为@Autowired是spring的注解,而 @resource是jdk8的注解。
总结
这只是spring ioc的一个简洁,下一篇文章,我会详细的写spring是如何通过编程式和注解式去管理bean的。
推荐阅读
-
Spring AOP访问目标方法的参数操作示例
-
将Spring Boot应用程序绑定到Cloud Foundry中的服务的方法
-
Spring Boot应用程序创建可部署的war文件到tomcat
-
Spring Data Jpa 中级联操作CascadeType的含义
-
spring Boot环境下dubbo+zookeeper的一个基础讲解与示例
-
java中Memcached的使用实例(包括与Spring整合)
-
Spring Cloud分布式微服务实战,养成应对复杂业务的综合技术能力
-
Redis快速部署为Docker容器的实现方法
-
SpringBoot+Spring Security无法实现跨域的解决方案
-
Spring Cloud OAuth2中/oauth/token的返回内容格式