Spring
applicationContext.xml
配置文件的,名字可以随意取,在工作项目中,FcoApiServletApplicationContextConfig 类进行配置。singleton : 单例 默认
prototype : 原型
request : 一次性请求有效(java web开发中)
session : session级有效(java web开发中)
global-session : 在web中spring容器applicationContext一致
1. ClassPathXmlApplicationContext -> 通过类路径
2. FileSystemXmlApplicationContext -> 通过文件路径(绝对路径)
3. XmlWebApplicationContext -> 从web系统中加载,tomcat启动时就会
比如说 @PostConstruct 相当于 <bean init-method="" />
@PreDestroy 相当于 <bean destory-method="myDestory()" />
有五种模式:byName/ byType/ constructor/ autodetect/ default/ no
韩老师的观点,能不用就不用,除非明确指定要用,因为没有直接set的清晰
题外话
面试题
如果使用applicationContext。则配置的bean是singleton不管你用不用,都被实例化,(prototype不会)好处是可以预先加载,坏处是消耗内存,一般不在移动设备项目中使用
如果是beanFactory,则当你实例化该对象的时候,配置的bean不会马上被实例化,延迟加载所有的bean, 当你使用的时候才被实例,好处是节约内存,坏处是速度慢。
规定: 一般没要求就用applicationContext。(90%)
1. 实例化,当我们的程序加载beans.xml文件是就开始实例化,把我们的bean(前提是scope=sinlgton)实例化到内存。可以用构造函数来证明。
2. 设置属性,调用set方法设置属性
3. 调用BeanNameAware接口的setBeanName()方法,用法:实现BeanNameAware接口,重载setBeanName方法有个args的参数为bean的name。
4. 调用BeanFactoryAware接口的setBeanFactory()方法,用法同上,方法参数是beanFactory
5. 调用ApplicationContextAware接口的setApplicationContext方法,参数是ApplicationContext对象
6. 调用BeanPostProcessor接口(后置处理器)的两个方法,不过用法与上面三个不同。正确用法是新建一个类去实现此接口,然后再配置文件中配置成bean。神奇的是每个bean创建是都会自动调用BeanPostProcessor接口对的两个方法,像filter的感觉。此步骤是调用**before**方法,第九步是调用**after**方法。
7. 调用initialBean的afterPropertiesSet()方法,用法同3,4,5
8. 调用定制的初始化方法,比如在配置文件中<bean initial-method="init()" />,则init()方法就被调用.
9. 调用6的**after**方法。
10. bean 可以正常使用了。。。。。
当容器关闭时:
11. 容器关闭,调用DisposableBean接口的destory()方法,用方法同3,4,5
12. 调用定制的销毁方法 <bean destory-method="myDestory()" />
小结: 在实际开发中往往没用到这么多,一般是 1->2->6->9->10->11
思考,如果是BeanFactory方式来获取,是否一样
答案:5,6,9 没有。
创建通知的五种类型
通知类型 | 接口 | 描述 |
---|---|---|
Around | org.aopalliance.intercept.MethodInterceptor | 拦截对目标方法调用 |
Before | Org.springFramework.aop.MethodBeforeDevice | 在目标方法调用前调用 |
After | Org.springFramework.aop.AfterReturningAdvice | 在目标方法调用后调用 |
Throws | Org.springFramework.aop.ThrowAdvice | 在目标方法抛出异常时调用 |