spring学习之旅(一)
spring的意义
-
为什么要用spring?
因为spring可以简化企业级java开发。 -
如何简化java开发?
- 基于POJO的轻量级和最小侵入性的编程。(BOP,spring不会强迫使用者实现spring规范的借口或者继承spring规范的类)
- 通过依赖注入和接口实现低耦合。(依赖注入,DI,由spring负责协调各对象间的依赖关系;接口,对象通过接口来声明依赖关系,使得这种依赖可以在对象不知情的情况下,用不同的实现来进行替换。)
- 基于切面和惯例进行声明式编程。(面向切面编程,AOP,将一些系统级服务模块化,并且以声明的方式应用到其他组件中,这些系统服务又被称为横切关注点。AOP有切面、切点、通知等概念)
- 使用模板消除模板式代码。(spring通过模板封装来消除样板式代码。例如用过JDBCTemplate避免传统的JDBC样式代码)
- 关于耦合?
耦合有两面性:
- 紧密耦合的代码难以测试、难以复用、难以理解,而且会出现“打地鼠式”的bug特性。
- 为了完成有实际意义的功能,不同类之间又必须以适当的方式交互——完全没有耦合什么也做不了。
总而言之,耦合是必须的,但是必须小心谨慎的管理。
Spring 容器
- spring容器的作用?
spring容器是spring框架的核心。
- 创建Bean
- 装配Bean
- 管理Bean的生命周期
- spring容器的种类:
- bean工厂(beanFactory)(提供基本的DI支持)
- 应用上下文(ApplicationContext)(相对于beanFactory,提供应用框架级的服务)
- 应用上下文的种类:
- AnnotationConfigApplicationContext
- AnnotationConfigWebApplicationContext
- ClassPathXmlApplicationContext:在所有的类路径下查找文件
- FileSystemXmlApplicationContext:从指定的文件系统路径下查找文件
- XmlWebApplicationContext
- bean的生命周期
- Spring 对bean进行实例化。
- 将值和bean引用注入到bean对应的属性中。
- 如果bean实现了BeanNameAware接口,Spring可以将bean的id传递给setBeanName()方法。(让Bean获取自己在BeanFactory配置中的名字。)
- 如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入。
- 如果bean实现了ApplicationContextAware接口,Spring将调用setBeanFactory()方法,将ApplicationContext容器实例传入。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法。
- 如果bean实现了InitializingBean接口,spring将调用它们的afterPropertiesSet()方法。如果bean使用init-method 声明了初始化方法,那么该方法也会调用。
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法。
- 准备就绪,可以被应用程序使用。这些Bean将一直保存在应用上下文中,直到应用上下文被销毁。
- 如果bean实现了DisposableBean接口,Spring将调用它的destory()接口方法。如果bean使用destory-method声明销毁方法,该方法也会被调用。
- 如何在spring运行期间,根据条件动态获得想要的bean?
解答