Spring 核心 是 IOC (DI)和 AOP,也就是控制反转(将生成bean的责任交给spring容器),DI依赖注入(web应用中一般都是由各个组件相互依赖协作才能完成一定
的功能,spring面向接口注入依赖的组件,一定程度解耦了代码,因为我们不用关心实现接口实现,只要注入接口,不同的人不同的接口实现spring并不关心),创建组件之间
的协作行为通常称为装配。 spring有多种装配bean的方式,一种是按照xml方式装配,另一种是按照Java来描述配置(也就是建一个javaconfig将配置像正常javal类一样配置在
里面)。
Spring容器有两种容器实现。一种是bean工厂,一种是应用上下文,一般使用应用上下文,bean工厂对大多数应用都太低级了
Spring上下午全权负责 对象的创建 和组装。 spring 自带了多种上下文的实现,它们唯一的区别就是加载配置文件的方式不同
例如:
AnnotationConfigApplicationContext, 从一个或者多个基于Java的配置类中加载Spring应用上下文,也就是所有的配置在JavaConfig 类的这种形式 ;
AnnotationConfigWebApplicationContext, 从一个或者多个基于Java的配置类中加载Spring Web应用上下文;
ClassPathXmlApplicationContext 从类路径下 的一个或多个XML配置文件加载上下文的定义,把应用上下文的定义文件如beans标签中的所有bean 作为资源类;
FileSystemXmlApplicationContext 把文件系统下的一个或者多个xml配置文件中加载上下文的定义;XmlWebApplicationContext 从web应用下的一个或者多个xml配置文件加载上下文定义
例如手动加载上下文的例子:AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(JavaConfig.class);
Student student = ac.getBean("beanId"); 其它形式的上下文创建跟这类似
AOP面向切面编程,允许我们把系统各处的功能分离出来形成可重用的组件,例如 日志,事务管理,安全这样的功能,很多模块可能都会用到,我们可以把他们抽离出来作为一个切面公用,不仅减少了代码量而且降低了耦合
bean的生命周期
1、Spring对bean进行实例化
2、将值和bean的引用注入到bean对应的属性中
3、如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBeanName()方法
4、如果bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,将BeanFactory容器实例传入;
5、如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文传入进来
6、如果bean实现了BeanPostProcessor接口,Spring将调用他们的post-ProcessBeforeInitialization()方法
7、如果bean实现了InitializingBean接口,Spring将调用他们的After-PropertiesSet()方法,如果bean使用了init-method声明初始化方法,该方法也会被调用
8、如果bean实现了BeanPostProcessor接口,Spring将调用他们的post-ProcessAfterInitialization()方法
9、此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用的上下文中,直到应用上下文被销毁
10、如果bean实现了DisposableBean接口,spring将调用它的destroy()接口方法。同样,如果bean使用了destroy-method声明销毁方法,该
方法也会被调用