。。。。。。。。。。。。。。。。。。。。。。。。。
Spring
Aware
本来就是Spring
设计用来框架内部使用的,用Aware是为了让Bean和Spring框架耦合,当然不使用也可以实现,我个人觉得应该是两个原因,一是老师为了教学效果,因为前面用到了Aware,二大概是为了耦合吧,有轮子不用自己造,不也挺好的
看不懂的话多写写,到时候做项目的时候再一步步解决问题。我也是只学过java基础,但是只要你的编程思维过关的话基本都是可以学会的。
stringutils导错包了,换一个
单元测试的方法加@Test了吗
这个UnitTestBase类是需要自己建的,你建了没有呢?
信息够不够 不够还有一部分
实现了awre接口的bean在被初始化之后就可以获得相应资源了,Aware接口对IOC容器的上下文的引用,和通过getBean方法启动时获得的容器效果是一样的
查看一下getBean(arg)方法的参数是不是写对了?检查容器中是否已经有arg参数名所对应的对象?
设值注入,自动调用set方法
比如某个类里,你需要使用到Spring管理的Bean的话,你实现ApplicationContextAware接口能通过ApplicationContext拿到这个Bean,方便得使用,其他资源也是一样的,比如你要对request里的某些东西特殊处理,那你就能通过实现某个接口,拿到servletContext来对request做一些操作。
获取相应Spring资源
可以获得在配置文件中定义好的Bean的ID名,因为有setter函数,获得之后可以通过这个id名,动态获得对应的实例对象(感觉没啥必要,毕竟直接就能注入了,可能有需要这个ID名创建对象无法 直接获取的场景吧!)我说的可能不对,望各位大佬指点下
而且声音有点小,电脑音量开最大了
是对Spring相应资源进行操作的。其实用的并不广泛,可以先做了解,等到真正用到时再做详细了解也不迟。
两个图片是一样的,第一次提问题,不会使用截图
就拿BeanNameAware接口来说,在Bean应用上下文的生命周期中它首先会实例化这个bean,然后设置属性值,之后就会调用BeanNameAware中的setBeanName()方法。如果你实现这个接口后,就可以通过setBeanName这个方法获取Bean的id。
\\s是正则表达式,可以匹配任意空白字符,这里的目的是想要以,来分割各个配置文件,但为了防止逗号后还有空格之类的东西就用了这个正则表达式
我也碰到了这个问题
用DefaultListableBeanFactory实现的容器实例化对象时不会调用ApplicationContextAware方法
改用ClassPathXmlApplicationContext实现的容器则没问题。
不知道为何Spring提供两种容器的实现类,功能看起来差不多。
终于完成Spring基础了,老师7个小时的课程,我70个小时感觉都不止了。。。给还在努力学的小伙伴们点建议。沉下心来,实操老师的代码,哪怕是照着写(我认为非常重要;ps 老师提供的源码好好参考下),等你的例子能跑起来后(中间肯定会有很多错误,处理错误和异常的过程虽然可能很痛苦,但是这也是学习和理解的最好时候)然后就是仔细研读每个类,每个方法,每个Xml节点和属性。等你真正理解了,你会恍然大悟。原来这个是多么简单基础的东西。加油!我也继续了。
用于日志管理的
setBeanName方法是在bean初始化时调用的,setApplicationConText是在实现BeanFactoryAware接口后调用的方法,我个人认为是先调用setBeanName初始化bean,然后实现接口的时候调用setApplicationConText方法
是的,不光是ApplicationContext,根据实现的接口,Spring内置的其他一些对象也可以注入。
应该主要还是为了利用这些对象对Spring做一些扩展应用。
这两个方法的触发位置不一样,其中setBeanName是initialilizeBean方法中的invokeAwareMethods执行的,他会查看bean是否实现各自aware接口,其中就有setbeanName方法的
在执行完invokeAwareMethods之后,后续的applyBeanPostProcessorsBeforeInitialization中,会使用到不同的BPP去调用实例化的后续操作,其中就有使用ApplicationContextAwareProcessor这个BPP去调用setApplicationContext完成上下文applicationContext的填充
lazy-init="false" 立退加载, 表示spring启动时,立刻进行实例化。
lazy-init="true"> 延迟加载 ,设置为lazy的bean将不会在ApplicationContext启动时提前被实例化,而是在第一次向容器通过getBean索取bean时实例化的。
如果一个设置了立即加载的bean1,引用了一个延迟加载的bean2,那么bean1在容器启动时被实例化,而bean2由于被bean1引用,所以也被实例化,这种情况也符合延迟加载的bean在第一次调用时才被实例化的规则。
prototype取一次是一个新的,存在方式就是实例化的对象。装配时启动时完成,具体方式看你怎么写,能放n个bean。
因为它实现了ApplicationContextAware这个接口
每个bean都有个自己所属的class,这个class实现aware接口的话那么set方法就会得到这个bean的name。
怎么不大呢,比如你在使用了struts2的Action的时候,如果要使用request那么要在每一个方法中都要写ActionContext.getContext();我若果继承了requestAware方法,直接就使用定义的那一个request就可以了