Spring
- 在spring2.5中,是有
applicationContext.xml
配置文件的,名字可以随意取,在工作项目中,FcoApiServletApplicationContextConfig 类进行配置。 - 在容器文件中配置Bean(service/dao/domain/action/数据源),bean元素的作用是,当我们spring框架加载的时候。spring就会自动创建一个bean对象,并放入内存
- 用到java反射机制 class.forName(“com.coupang…”)
- IOC(Inverse Of Controll) 控制反转: 就是把创建对象和维护对象的关系的权利从程序转移到spring的容器(applicationContext.xml)
- DI(dependency inject) 依赖注入: 实际上和ioc是一个概念,spring设计者认为DI更准确表示spring核心。(惠普两个哥们提出的)
- bean的scope
-
singleton : 单例 默认 prototype : 原型 request : 一次性请求有效(java web开发中) session : session级有效(java web开发中) global-session : 在web中spring容器applicationContext一致
- singleton 当你new applicationContext是会默认帮你创建一个,而prototype不会,prototype在每次getBean是创建对象,每次创建的对象还不一样。因为singleton已经定下来了就创建一个对象,所以会事先创建。
- 三种获取applicationContext的方式
-
1. ClassPathXmlApplicationContext -> 通过类路径 2. FileSystemXmlApplicationContext -> 通过文件路径(绝对路径) 3. XmlWebApplicationContext -> 从web系统中加载,tomcat启动时就会
- 也可以使用注解的方式
-
比如说 @PostConstruct 相当于 <bean init-method="" /> @PreDestroy 相当于 <bean destory-method="myDestory()" />
- 自动装配 Autowiring modes
-
有五种模式:byName/ byType/ constructor/ autodetect/ default/ no 韩老师的观点,能不用就不用,除非明确指定要用,因为没有直接set的清晰
- 在spring2.5中 通过配置来启用注解
-
题外话
- 学习框架最重要的就是学会各个配置。
- 当年的structs 是管理web层的,接管jsp/action/表单等,主要体现出mvc的数据输入,数据的处理,数据的显示分离。
-
面试题
- 从applicationContext应用中获取bean 和 在beanFactory 容器中获取bean 的区别?
-
如果使用applicationContext。则配置的bean是singleton不管你用不用,都被实例化,(prototype不会)好处是可以预先加载,坏处是消耗内存,一般不在移动设备项目中使用 如果是beanFactory,则当你实例化该对象的时候,配置的bean不会马上被实例化,延迟加载所有的bean, 当你使用的时候才被实例,好处是节约内存,坏处是速度慢。 规定: 一般没要求就用applicationContext。(90%)
- bean的生命周期 (Applicationcontext)
-
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 没有。
- AOP
-
创建通知的五种类型
通知类型 接口 描述 Around org.aopalliance.intercept.MethodInterceptor 拦截对目标方法调用 Before Org.springFramework.aop.MethodBeforeDevice 在目标方法调用前调用 After Org.springFramework.aop.AfterReturningAdvice 在目标方法调用后调用 Throws Org.springFramework.aop.ThrowAdvice 在目标方法抛出异常时调用