“Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架”,这是百度百科里面的内容。(概念自己百度,我怕讲得不好会被喷。/手动狗头)
注意:本次内容只涉及类和浅层使用,不涉及源码。
Spring的设计思想堪称典范,是绝佳的学习资料,今天涉及到的技术有:xml解析、工厂模式和反射。IOC(Inversion of Control)控制反转,主要作用就是通过配置文件和注解来创建Bean对象以及完成依赖注入DI(Dependency Injection)的操作,今天要说的是配置文件,不会涉及注解。
控制反转IOC:首先大家要知道两个接口:BeanFactory和ApplicationContext,后者是前者的子接口,两者主要作用是创建对象,功能都由其子实现类完成,下面贴上一行Spring常用的创建对象的代码:
//创建spring容器对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//从该容器对象中获取UserService对象
UserService userService = applicationContext.getBean("userService", UserService.class);
//调用userService方法进行业务逻辑处理
userService.add();
上面用的ClassPathXmlApplicationContext便是ApplicationContext 的一个子实现类。通过带参构造传入ConfigLocation(配置文件地址),然后由BeanDefinitionReader的子实现类XmlBeanDefinitionReader(不同配置文件对应不同的子类)来解析配置文件,并根据解析后的结果生成BeanDefination(Bean的内容),再利用反射的技术结合BeanDefination生成该对象并提供getBean方法返回。为了更好理解,下面贴一张配置文件图:
如上图:BeanDefinition便记录了Bean对象信息(案例只用了一部分),id是Bean对象的名称且唯一(知道名字就可以知道地址,进行反射调用),property是要往userService注入的依赖,userDao也是一个可以实现的类。 依赖就是后者作为前者的一部分出现。如student和pen就是一种聚合关系的依赖:
class Student
private Pen pen;
private setPen(Pen pen){this.pen = pen;}
如上图,若要给Student注入Pen,则需要利用反射调用setPen方法和Pen对象,再将后者作为前者的参数Invoke一下就可以了,这样Pen就被注入到Student中成为了Student类的成员变量,完成依赖注入。
以上便是大致原理,不过漏了一个比较重要的类BeanDefinitionRegistry,作用主要就是存储BeanDefinition的,没有涉及到源码,所以漏掉也不影响。
鉴于标题,这次也不会讲源码了(其实是内容太多,起码要码半本书)。希望能对大家学习Spring的使用有一点点小小的帮助,如果内容有错误,也请大佬指正。



