勤学教育网合作机构>石家庄培训>

石家庄兄弟连教育

欢迎您!

全国统一学习专线 8:30-21:00
石家庄兄弟连教育

石家庄兄弟连分层次分阶段的学习,由浅入深,根据学员的不同层次因材施教,授课中使用的案例都是真实的案例

石家庄兄弟连教育> 石家庄教育培训>

石家庄java培训费

  • 课程介绍

  • 相关知识

  • 2019-11-09
石家庄兄弟连教育

Java 在电子商务领域以及网站开发领域占据了一定的席位。开发人员可以运用许多不同的框架来创建web项目,SpringMVC,Struts2.0以及frameworks。即使是简单的 servlet,jsp和以struts为基础的网站在政府项目中也经常被用到。例如医疗救护、保险、教育、国防以及其他的不同部门网站都是以Java为基础来开发的。

石家庄兄弟连课程体系




java发展前景  Java发展前景  
计算机的诞生及广泛应用推动了IT领域的发展,但21世纪的计算机早已不是访问INTERNET的的途径。各类更具信息化的电子产品逐渐进入IT领域,推动了PC时代的大发展。由于各种消费信息的急剧增加,传统的客户机的各方面条件均不如PC,PC的发展对服务器的应用管理体统也提出了更高标准。Java语言完全满足了PC的条件,在减少内存,直接在各类电子产品中运行,在网络中可被任何设备所识别,充分利用网络资源等方面有所突破创新,为PC时代的发展创造了有力条件。
 

大咖教学天团,课程体系引领IT革新
他们曾经敲过的代码现如今已是业界标杆,是中国互联网的参与者与见证者!

  • 马如忠 马如忠 icon

    精通Java、C、C++等主流开发语言,5年以上开发经验,非常丰富的IT从业经验和教育心得,兄弟连特色JAVA讲师,曾担任达内课程总监级讲师。

  • 李康 李康 icon

    曾任用友软件,飞企集团等上市公司技术总监,CTO等职务,12年以上的软件开发和项目管理经验,领导并参与研发中国移动ERP终端系统。


兄弟连教育(以下简称兄弟连)致力于高素质软件开发人才的培训与培养。公司成立于2007年,总部设在北京,目前已在上海、广州、深圳、郑州、沈阳、成都、南京、杭州、宁波、石家庄、南昌等城市设立了教学中心,业务范围覆盖全国。2016年5月获得华图教育1.25亿元投资,同年9月挂牌新三板。


体验才是王道
高起点才更牛叉
缔造Java课程行业新标准
 
 

详情请进入 石家庄兄弟连教育 已关注:151 咨询电话:

相关知识点:花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍。那看书有什么用呢?主要还是扩展视野,毕竟书是别人总结出来的东西,看一遍可以发现自己的理解偏差,而且还可以看到一些平时不太关注的内容,当然看也可以是一种学习技术的方式。

最开始只是想了解一下AOP,没想到就陷的这么深,为了搞清楚spring是如何完成切面功能这两天还是把Ioc部分的内容也给读了读。还是看懂了大概,只不过这复杂的内部结构确实不易理解与阅读,我在想Spring确实是个好的开源软件,但代码可能真的少了点亲近感。一个BeanFactory和FactroyBean就可以写上好几页纸来说明,毕竟这些名字没有多少Ioc的影子。

对于Ioc的功能就不再多说,这里主要是理解一下Ioc的关键代码,至于BeanFactory、ApplicationContent、Resource之类就不说了,直接从getBean开始吧。

从最基本的容器开始:

这里面有一个sayImpl的java代码,下面是spring.xml文件:

运行Client的会得到下面的结果:

我是5207.别aop我

这里的XmlBeanFactory只是用来解析Xml文件而创建的类,它本身只是传递了一个Resource而已,最终的容器功能是在AbstractBeanFactory中完成,那么我们直接就看AbstractBeanFactory中getBean的实现,而getBean又调用了doGetBean方法,这才是本尊。

下面是doGetBean的主要代码,代码太多,有些不是很重要的就删除了。

其实上面的代码中可以找出一段代码中完成核心调用的是createBean和getObjectForBeanInstance这两个方法。getObjectForBeanInstance的主要逻辑是

检查对象是否为FactoryBean类型,如果不是直接返回对象实例

如果是FactoryBean类型,那么就要通过FactoryBean的getObject来返回对象实例

看到这里就明白了FactoryBean的用处了吧,这个也是Spring Aop与Ioc进行交互的一个重要逻辑。

再来看看createBean

会发现createBean在AbstractBeanFactory中只是一个虚方法,说明是在派生类中实现的,前面是从XmlBeanFactory开始的,那么顺着它的继承关系看看,最终是在AbstractAutowireCapableBeanFactory中找到了createBean的实现:

代码太多了,找关键部分吧。createBean的过程主要是

生成bean的wrapper

首先是创建好bean,然后将新创建的bean实例并放在BeanWrapper中返回。

populateBean的调用

1、先是执行InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation,这里会有实例创建后的一个回调,如果是false会退出整个过程。

2、完成对象的注入autowireByName/autowireByType,这里就看到很眼熟的东西了吧“autowire”。

3、调用InstantiationAwareBeanPostProcessor的postProcessPropertyValues

4、最后是applyPropertyValues方法,把属性值都写入

initializeBean的调用

1、先是invokeAwareMethods,完成BeanNameAware、BeanClassLoaderAware、BeanFactoryAware的注入

2、然后是BeanPostProcessor的postProcessBeforeInitialization调用

3、完成InitializingBean的调用

4、然后是BeanPostProcessor的postProcessAfterInitialization调用,这里就是后面Aop中Advistor接管对象的地方啦

可以看到initializeBean方法最后返回的是wrappedBean有两种可能,一种是经过BeanPostProcessor生成的对象,如果当前bean没有注册BeanPostProcessor的话就直接返回bean自己。aop中就运用这个方法来完成代码的切面编程。

小结

写到这Ioc创建一个对象的过程就说完了,过程中发现了很多Ioc容器对一个对象生成过程的技巧与奥秘,也理解了为什么可以在spring中灵活的完成对对象创建的各种“干预”。

好了,接下来开始进入spring aop部分,前面的例子做一些补充加入aop的功能,spring.xml如下:

这里有一个环绕增强及一个切面,最后使用DefaultAdvisorAutoProxyCreator来完成自动代理。前面在学习Ioc时使用的是XmlBeanFactory,是一个基本的基于xml的ioc容器,那么我们再使用ClassPathXmlApplicationContext吧,看看会发生什么变化:

执行结果:

我是5207.别aop我

大家好:我是5207.希望大家多多点赞.

别aop我

可以发现使用ClassPathXmlApplicationContext容器时aop的功能才有用,有点奇怪。?际嵌寥〉呐渲梦?督峁?煌?兀空饫镏饕?荁eanFactory和ApplicationContext的主要区别之一。查看XmlBeanFactory的加载过程发现其只是调用了一个XmlBeanDefinitionReader读取了spring.xml并解析为BeanDefinition,然后具体的bean都要到getBean时才会去实例化,而且bean的依赖也要自己去处理。

那applicationContext呢?从ClassPathXmlApplicationContext的代码发现就复杂一些,在构造函数中有一个调用比较特别:

看到这里发现多了一个refresh()的过程,进去一看一堆的处理。其实主要过程就是初始化Ioc容器,完成容器的配置,加载好并注册好各种回调。比如前面提到的BeanPostProcessor就是在这个refresh里就完成了注册。

正因为refresh这个过程我们用起spring来才会觉得简单好用。

有了上面的基础再来看DefaultAdvisorAutoProxyCreator就会简单的多。我们可以看一下DefaultAdvisorAutoProxyCreator的类继承关系,其中有一个AbstractAutoProxyCreator需要特别关注。这个AbstractAutoProxyCreator实现了一堆的接口:

其中SmartInstantiationAwareBeanPostProcessor继承关系中最底层的是BeanPostProcessor,前面说明Ioc的时候提到过,BeanPostProcessor可以在getBean时返回BeanPostProcessor加工过的对象。好了,奥秘就在这里啦,看一下AbstractAutoProxyCreator中如何实现的吧:

其中Before方法啥也没做,都在After中完成的。在After中有一个wrapIfNecessary方法,这个方法的作用是如果需要进行代理则生成代理并返回代理对象实例。

方法中使用了一个缓存advisedBeans存取bean是否需要advise,如果是需要的话就会存TRUE,否则就是FALSE,这样下次再来取时不用再判断直接返回结果就行。当然最重要的是如果是需要为bean生成代理时则会创建代理啦。至于如何判断是否需要代理是通过一个getAdvicesAndAdvisorsForBean方法来完成的,如果getAdvicesAndAdvisorsForBean返回的是DO_NOT_PROXY则表示不需要代理。为了扩展getAdvicesAndAdvisorsForBean是抽象方法。从DefaultAdvisorAutoProxyCreator的父类AbstractAdvisorAutoProxyCreator中找到了getAdvicesAndAdvisorsForBean的实现:

这里面会查找所有的Advisors并返回,当然这个过程中因为Advisor是包含了Advice的,所以Aop的基本要素就到齐了。然后回到wrapIfNecessary中,接着就会调用createProxy来生成代理对象啦。

createProxy过程主要是通过ProxyFactory来生成代理对象,在之前的《学习AOP之深入一点Spring Aop》里已经讲过。最后将生成的代理对象放入缓存并返回给Ioc容器。

  • 校区地址
  • 学校相册
  • 推荐课程
  • 相关学校
  • 相关文章

温馨提示:提交留言后老师会第一时间与您联系!热线电话:

手机访问

#tel_400#