整理一下spring框架

为什么要使用Spring?Spring主要两个有功能为我们的业务对象管理提供了非常便捷的方法:
* DI(Dependency Injection,依赖注入)
* AOP(Aspect Oriented Programming,面向切面编程)

Java Bean每一个类实现了Bean的规范才可以由Spring来接管,那么Bean的规范是什么呢?
* 必须是个公有(public)类
* 有无参构造函数
* 用公共方法暴露内部成员属性(getter,setter)

实现这样规范的类,被称为Java Bean。即是一种可重用的组件。DI-依赖注入简单来说,一个系统中可能会有成千上万个对象。如果要手工维护它们之间的关系,这里就需要面向切面来编程关于BeanBean的生命周期如你所见,在bean准备就绪之前,bean工厂执行了若干启动步骤。我们对图进行详细描述:
1. Spring对bean进行实例化;
2. Spring将值和bean的引用注入到bean对应的属性中;
3. 如果bean实现了BeanNameAware接口,Spring将bean的ID传递给setBean-Name()方法;
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声明了销毁方法,该方法也会被调用。

Bean的作用域Spring定义了多种Bean作用域,可以基于这些作用域创建bean,包括:单例(Singleton):在整个应用中,只创建bean的一个实例。
* 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean实例。
* 会话(Session):在Web应用中,为每个会话创建一个bean实例。
* 请求(Rquest):在Web应用中,为每个请求创建一个bean实例。

在代码里看起来是这样的:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)public class MyIsBean{…}XML版本:<bean id="BEANID"class = "com.my.beans"scope=“prototype”>在默认情况下,Spring应用上下文中所有bean都是作为以单例(singleton)的形式创建的。也就是说,不管给定的一个bean被注入到其他bean多少次,每次所注入的都是同一个实例。在大多数情况下,单例bean是很理想的方案。初始化和垃圾回收对象实例所带来的成本只留给一些小规模任务,在这些任务中,让对象保持无状态并且在应用中反复重用这些对象可能并不合理。有时候,可能会发现,你所使用的类是易变的(mutable),它们会保持一些状态,因此重用是不安全的。在这种情况下,将class声明为单例的bean就不是什么好主意了,因为对象会被污染,稍后重用的时候会出现意想不到的问题。声明Bean以下是声明Bean的注解:
* @Component 组件,没有明确的角色
* @Service 在业务逻辑层使用
* @Repository 在数据访问层使用
* @Controller 在展现层使用(MVC -> Spring MVC)使用
* 在这里,可以指定bean的id名:Component(“yourBeanName”)
* 同时,Spring支持将@Named作为@Component注解的替代方案。两者之间有一些细微的差异,但是在大多数场景中,它们是可以互相替换的。
条件化的Bean假设你希望一个或多个bean只有在应用的类路径下包含特定的库时才创建。或者我们希望某个bean只有当另外某个特定的bean也声明了之后才会创建。我们还可能要求只有某个特定的环境变量设置之后,才会创建某个bean。在Spring 4之前,很难实现这种级别的条件化配置,但是Spring 4引入了一个新的@Conditional注解,它可以用到带有@Bean注解的方法上。如果给定的条件计算结果为true,就会创建这个bean,否则的话,这个bean会被忽略。通过ConditionContext,我们可以做到如下几点:
* 借助getRegistry()返回的BeanDefinitionRegistry检查bean定义;
* 借助getBeanFactory()返回的ConfigurableListableBeanFactory检查bean是否存在,甚至探查bean的属性;
* 借助getEnvironment()返回的Environment检查环境变量是否存在以及它的值是什么;
* 读取并探查getResourceLoader()返回的ResourceLoader所加载的资源;
* 借助getClassLoader()返回的ClassLoader加载并检查类是否存在。
Bean的初始化和销毁
* Java配置方式:initMethod和destoryMethod
* 注解:@PostConstruct和@PreDestory

通常想要激活的是开发环境的profile。比如Profile(“dev”)Application Event使用Application Event可以做到Bean与Bean之间的通信Spring的事件需要遵循如下流程:
* 自定义事件,集成ApplicationEvent
* 定义事件监听器,实现ApplicationListener
* 使用容器发布事件

关于AOP名词介绍通知(Advice)通知定义了切面是什么以及何时使用。除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题。它应该应用在某个方法被调用之前?之后?之前和之后都调用?还是只在方法抛出异常时调用?Spring切面可以应用5种类型的通知:
* 前置通知(Before):在目标方法被调用之前调用通知功能;
* 后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;
* 返回通知(After-returning):在目标方法成功执行之后调用通知;
* 异常通知(After-throwing):在目标方法抛出异常后调用通知;
* 环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。
切面(Aspect)通知+切点=切面引入(Introduction)引入允许我们向现有的类添加新方法或属性织入(Weaving)织入是把切面应用到目标对象并创建新的代理对象的过程。切面在指定的连接点被织入到目标对象中。在目标对象的生命周期里有多个点可以进行织入:
* 编译期:切面在目标类编译时被织入。这种方式需要特殊的编译器。AspectJ的织入编译器就是以这种方式织入切面的。
* 类加载期:切面在目标类加载到JVM时被织入。这种方式需要特殊的类加载器(ClassLoader),它可以在目标类被引入应用之前增强该目标类的字节码。AspectJ 5的加载时织入(load-time weaving,LTW)就支持以这种方式织入切面。
* 运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的。

Spring对AOP的支持:
1. 基于代理的经典Spring AOP;
2. 纯POJO切面(4.x版本需要XML配置);
3. @AspectJ注解驱动的切面;
4. 注入式AspectJ切面(适用于Spring各版本)。

这些导入配置的方式主要范围以下三种类型:
* 第一类:直接导入配置类
* 第二类:依据条件选择配置类
* 第三类:动态注册Bean
ApplicationContext 的子类主要包含两个方面:
* ConfigurableApplicationContext 表示该 Context 是可修改的,也就是在构建 Context 中用户可以动态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的 Context,即 AbstractRefreshableApplicationContext类。
* WebApplicationContext 顾名思义,就是为 web 准备的 Context 他可以直接访问到 ServletContext,通常情况下,这个接口使用的少。

再往下分就是按照构建 Context 的文件类型,接着就是访问 Context 的方式。这样一级一级构成了完整的 Context 等级层次。总体来说 ApplicationContext 必须要完成以下几件事:
* 标识一个应用环境
* 利用 BeanFactory 创建 Bean 对象
* 保存对象关系表
* 能够捕获各种事件
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值