学习Spring框架已有1个月,实习做得最多的就是把Spring啃了下来,还是很开心。相信每个敲代码的孩纸都是折翼的天使,因为善良和坚持,终会有所收获。
Spring平台实在大,最主要部分可以分为:IoC、AOP、组件。组件又包括流行一时的Spring MVC、Spring Boot、Spring JDBC等等,包罗万象。
(一) IOC:控制反转与注入依赖相信很多人都会被这个搞晕掉。其实都是指IOC容器,不过是概念上各有侧重。举个例子,以往在Serivice层中调用Dao层,我们用代码控制:XXDao dao=new XXDao();在Spring中,我们把创建交给了IOC容器解决,只需要:@Autowired XXDao dao;把代码控制的部分交给IOC容器管理 ,这就是控制反转。那么注入依赖呢?刚提到,@Autowired就是自动注入依赖标签。容器在管理过程中,就替代我们完成把XXDao导入的工作,这就是注入依赖。
1、IOC容器框架:
最基本的IOC容器就是BeanFactory。万物不离其宗,所有的IOC容器都是继承这个接口去实现。IOC容器的核心两者是BeanFactory与ApplicationContext。后者是在前者的基础上,继承了Resource等一系列高大上组件从而丰富了IOC容器。所以说,最基本的是BeanFactory,可是最常用的莫过于ApplicationContext。当然,还有许许多多的容器,如下图:
2、IOC容器中Bean生命周期:
(1) Bean实例创建;
(2) 为Bean实例设置属性;
(3) 调用Bean的初始化方法;
(4) 应用可通过IOC容器使用Bean;
(5) 当容器关闭时,调用Bean销毁方法;
3、 IOC容器管理Bean有4个工序:寻找Bean定义资源、载入和注册、注入依赖。前三者在IOC容器初始化中完成,注入依赖就具有不确定性。当预实例化时也在初始化中。准确地定义应该是,注入依赖发生在用户第一次向IOC容器索要Bean时触发,getBean方法是其入口函数。
(1) 定义资源。Spring有容乃大,无论你是ClathFile,还是XML还是外部资源 ,都是允许的。一开始接触Bean配置文件时,十分地艰辛~仿造网上的教程写了无数个,最后还是提示找不到配置文件,愁煞我也。后面坑走得多了,就有经验了。注意点如下:①默认文件名。什么是默认文件名呢?Spring配置文件默认为applicationContext.xml据了解。你可以有很多个配置文件,但要乖乖地import到一个文件中提供给程序。当然名字可更改,如图所示:
<Context-param>
<context-param>
<param-name>自定义名称</param-name>
</context-param>
</Context-param>
②路径,默认路径在ClathPath:下,不要担心,你是可以配置路径的。在自定义名称标签下再添加一段<param-value>自定义路径</param-value>.
③导入包。有时候什么都没问题,还是出错时,说不定就是导入包不对。比如,Spring框架中包有很多,core/aop啊什么的。不同的包各有侧重,具体见官方文档描述。当所需要的类刚好没导入时,问题就会出现。所以,耐心地看出错清单,提示还是很清楚的 ,导入相应的包问题就解决了。
(2) 载入资源。给了Bean定义文档,容器会去分析结构,然后呢?然后就是把信息转化成容器内部数据结构。这个说起来很抽象,其实不过就是转出POJO便于后续处理。
(3) 注册。注册过程就是将载入中转化成的内部数据结构映射到HASHMAP中。没错,Spring最基本的注册工具就是Map。Key是Bean名字,值就是内部数据结构。
(4) 注入依赖。这个说起来就大了呢。Bean依赖关系管理主要分为3种注入模式:自动注入@Autowired,构造函数、BeanDefinition的属性值。粗略而言,容器检测是否有索要Bean,检测到后调用getBean将其载入进来。
4、 最基本的IOC容器的使用过程
贴一段我的简单运用:
ClassPathResource resource=new ClassPathResource("applicationContext.xml");//定义BeanDefinition信息
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFactory();//创建IOC容器
XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(beanFactory);//创建IOC容器的BeanDefinition阅读器
reader.loadBeanDefinitions(resource);//导入资源,IOC容器回调创建bean
CommonEmployee bean=(CommonEmployee)beanFactory.getBean("targetbean");
bean.setName("wang");
System.out.print("OK"+bean.getName());
不得吧说IoC容器博大精深,三眼两语并不能真正阐述清楚。以上只是入门见解,而更多的知识与思想都只能通过看源码和官方文档进行补充。