springioc原理及实现
springIoc 原理
spring重要的两大特性: ioc aop
ioc 又称控制反转
什么是控制反转呢?
如 A类 需要引用B类,而传统的做法,就是在A类中 用new 或者Java反射的方法去实例化B类,然后去应用B对象做一些需要的事情,这样的做法使A类与B类强耦合在一起。不利于代码的开发与维护。因此诞生了ioc 这种思想(1996)就是将这种引用关系,交给ioc容器帮你管理,由以前的主动引用创建变为被动引用创建,有ioc容器帮你搞定。
为什么要提到工厂模式呢?
所有的class都交给ioc容器去管理,ioc容器就想一个工厂一样,你需要什么样的bean他就会帮你去创建什么样bean 因此,在这种情景下,那么beanfactory的创建就是用了工厂模式。demo实例:
public Object getBean(String beanName) {
Object reObject = null;
try {
Class class1 = Class.forName(beanName);
try {
Constructor declaredConstructor = class1.getDeclaredConstructor();
try {
reObject = declaredConstructor.newInstance();
Field[] fields = class1.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
DapengAop annotation = fields[i].getDeclaredAnnotation(DapengAop.class);
if (annotation != null) {
Object bean = getBean(fields[i].getType().getName());
if(!fields[i].isAccessible()) fields[0].setAccessible(true);
fields[i].set(reObject, bean);
}
}
} catch (InstantiationException | IllegalAccessException | IllegalArgumentException
| InvocationTargetException e) {
e.printStackTrace();
}
} catch (NoSuchMethodException | SecurityException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return reObject;
}
那么怎样去实例化bean的呢?
java的反射机制
如果你用的是 xml配置的方式 那么他就会读取xml配置文件到conext中然后根据xml中配置的bean将其实例化。注解的方式,开启注解扫描的文件路径,开启注解。然后同样通过java反射将相应的bean实例化。编码的方式也是一样。
说道ioc不得不说一下 “依赖注入”
比如,我们上面所说的A类引用B类,那么A类依赖B类,怎么样将B类注入到A类中去的呢,
有常用几种方式: 构造注入(通过构造器注入)、设置注入(set、get);
@autowire、@resoucre 同样也是通过加载到class文件去扫描注解遇到这些注解就通过递归的方式,将相应的应用实例化。
需要注意的地方
applicationContext spring容器的上下文件 可以获取ioc容器中的bean 通过getbean(),是不是似曾相识。可以通过实现 ApplicationContextAware接口去获取applicationContext上下文。