IoC发展简介:你可能对IoC有些误会?
什么是IOC
IOC其实是一种编程思想或原则。相对于传统的编程方式(如从前文到后文这样串行顺序的方式),比如用传统方式,当我依赖一个对象,我要去创建它,对它进行属性配置,然后我才能使用这个对象。
但是对于IOC这种方式来说,它使对象或者组件的创建更为透明,不需要过多的关注细节(如创建对象、给对象设置属性,这些ioc容器都给我们设置好了),以达到解耦的目的。控制反转,简单来理解其实就是把获取依赖对象的方式,交给IOC容器来实现,由主动拉取,变为被动获取。
IoC主要实现策略:面试官总问IoC和DI的区别,他真的理解吗?
IoC 主要实现策略
以上就是讨论关于主流IOC的一个实现策略,可划分为2个部分:
- Dependency Lookup(依赖查找)
- Dependency Injection(依赖注入)
在SpringFrameWork里面这2部分都有涉猎,这两部分都很重要
IoC容器的职责:IoC除了依赖注入,还涵盖哪些职责呢?
依赖查找和依赖注入是对依赖处理的2种实现方式.依赖查找是主动的实现方式,依赖注入是被动的实现方式(尽管也有主动的方式),但是大多数工作时被容器给做掉了.无论是那种方式,最重要的还是最依赖的处理,依赖怎么来的以及怎么把它返回给客户端.这其中有不少环节.例如根据名或者类型来查找.其中也会涉及到类型转换.
生命周期
- 容器的生命周期.容器自己有自己的启动停止,暂停,终止回滚等操作.
- 托管资源并非是SpringBean.
配置
容器的配置(例如定时任务的容器)
外部化配置:属性配置:xml,properties,yaml
外部化配置和上面的生命周期中含义一直.
除了Spring,还有其它的IOC容器实现吗?
IOC是一种原则(好莱坞原则),IOC容器是将理论落地后的实现方式,具体可以实现哪些就参考职责.Ioc容器的实现并非只有Spring一家,在JavaSE,JavaEE,开源领域都有对IOC原则的容器的响应实现.
传统IoC容器实现:JavaBeans也是IoC容器吗?
/**
* @author 秦啸
* @Description Setter/Getter 方法
* 可写方法(Writable)/可读方法(Readable)
* @Date 创建于 2020/4/22 8:43
*/
public class Person {
String name;
Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
/**
* @author 秦啸
* @Description
* @Date 创建于 2020/4/22 8:47
*/
public class BeanInfoDemo {
public static void main(String[] args) throws IntrospectionException {
BeanInfo beanInfo = Introspector.getBeanInfo(Person.class,Object.class);
Stream.of(beanInfo.getPropertyDescriptors())
.forEach(propertyDescriptor -> {
System.out.println(propertyDescriptor);
// propertyDescriptor 允许添加属性编辑器 - PropertyEditor
// GUI -> text(String) -> PropertyType
// name-> String
// age -> Integer
Class<?> propertyType = propertyDescriptor.getPropertyType();
String propertyName = propertyType.getName();
if ("age".equals(propertyName)){// 为"age"字段/属性增加 O
//String -> Integer
propertyDescriptor.setPropertyEditorClass(StringToIntegerPropertyEditor.class);
}
});
}
static class StringToIntegerPropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
Integer value = Integer.valueOf(text);
setValue(value);
}
}
}
轻量级IoC容器:如何界定IoC容器的“轻重”?
释放掉一些容器,容器更轻
最大化的代码复用
更大的程度上的面向对象
更大化的产品化
更好的测试
依赖查找 VS. 依赖注入:为什么Spring总会强调后者,而选择性忽视前者?
面试题
什么是 IoC ?
简单地说,IoC 是反转控制,类似于好莱坞原则,主要有依赖查找和依赖注入实现
按照IOC的定义,很多方面都是IOC.常说的 JavaBeans是IoC的一个容器实现,Servllet也是IoC容器的实现,因为Servlet可以去依赖或者反向的通过JDNI的方式进行得到一些外部的资源,包括DataSource或者相关的EJB的组件.
与此同时,像是Spring Framework依赖注入框架也能够帮助我们实现IoC,
依赖查找和依赖注入的区别?
依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准 API
实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和
API
Spring 作为 IoC 容器有什么优势?
典型的 IoC 管理,依赖查找和依赖注入
AOP 抽象
事务抽象
事件机制
SPI 扩展
强大的第三方整合
易测试性
更好的面向对象