Spring框架

目录

1.Spring概述

2.Spring特点

3.Spring优点

4.主要jar包

5.Spring-IOC

1). BeanFactory

2).ApplicationContext 面向开发应用

6.Spring-AOP

1).AOP应用场景

2).AOP原理

3).Spring 提供了两种方式来生成代理对象

7.Spring生命周期

8.Spring面试题

1).Spring 支持 bean 的作用域有几种吗? 每种作用域是什么样的?

2).Spring 框架中都用到了哪些设计模式?

3).Spring 的对象默认是单例的还是多例的? 单例 bean 存不存在线程安全问题呢?

4). @Resource 和@Autowired 依赖注入的区别是什么? @Qualifier 使用场景是什么?

5).Spring常用注解

6).Spring中的隔离级别

7).Spring通知类型

8).BeanFactory和ApplicationContext的区别


1.Spring概述

        Spring认证框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。 Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架 。

        Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。

2.Spring特点

3.Spring优点

◆JAVA EE应该更加容易使用。

◆面向对象的设计比任何实现技术(比如JAVA EE)都重要。

◆面向接口编程,而不是针对类编程。Spring将使用接口的复杂度降低到零。

◆代码应该易于测试。Spring框架会帮助你,使代码的测试更加简单。

◆JavaBean提供了应用程序配置的最好方法。

◆在Java中,已检查异常(Checked exception)被过度使用。框架不应该迫使你捕获不能恢复的异常。

4.主要jar包

5.Spring-IOC

Ioc全称Inversion of Control,即“控制反转”,这是一种设计思想。对象创建的权利由Spring框架完成.由容器管理对象的生命周期.

  •  IOC 的意思是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。最直观的表达就是,IOC 让对象的创建不用去 new 了,可以由 spring 根据我们提供的配置文件自动生产,我们需要对象的时候,直接从 Spring 容器中获取即可.
  • Spring 的配置文件中配置了类的字节码位置及信息, 容器生成的时候加载配置文件识别字节码信息, 通过反射创建类的对象.
  • Spring 的 IOC 有三种注入方式 :构造器注入, setter 方法注入, 根据注解注入。

1). BeanFactory

BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用
Spring 框架的开发者,几乎所有的应用场合我们都直接使用 ApplicationContext 而非底层
的 BeanFactory。

  1. Spring 配置文件中每一个节点元素在 Spring 容器里都通过一个 BeanDefinition 对象表示,它描述了 Bean 的配置信息。而 BeanDefinitionRegistry 接口提供了向容器手工注册BeanDefinition 对象的方法。
  2. 位于类结构树的顶端 ,它最主要的方法就是 getBean(String beanName),该方法从容器中返回特定名称的 Bean,BeanFactory 的功能通过其他的接口得到不断扩展
  3. 该接口定义了访问容器中 Bean 基本信息的若干方法,如查看 Bean 的个数、获取某一类型Bean 的配置名、查看容器中是否包括某一 Bean 等方法
  4. 父子级联 IoC 容器的接口,子容器可以通过接口方法访问父容器; 通过HierarchicalBeanFactory 接口, Spring 的 IoC 容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的 Bean,但父容器不能访问子容器的 Bean。Spring 使用父子容器实现了很多功能
  5. 是一个重要的接口,增强了 IoC 容器的可定制性,它定义了设置类装载器、属性编辑器、容器初始化后置处理器等方法;
  6. 定义了将容器中的 Bean 按某种规则(如按名字匹配、按类型匹配等)进行自动装配的方法;
  7. 定义了允许在运行期间向容器注册单实例 Bean 的方法;对于单实例( singleton)的 Bean来说,BeanFactory 会缓存 Bean 实例,所以第二次使用 getBean() 获取 Bean 时将直接从IoC 容器的缓存中获取 Bean 实例。Spring 在 DefaultSingletonBeanRegistry 类中提供了一个用于缓存单实例 Bean 的缓存器,它是一个用 HashMap 实现的缓存器,单实例的 Bean 以beanName 为键保存在这个 HashMap 中。
  8. 在初始化 BeanFactory 时,必须为其提供一种日志框架,比如使用 Log4J, 即在类路径下提供 Log4J 配置文件,这样启动 Spring 容器才不会报错。

2).ApplicationContext 面向开发应用

ApplicationContext 由 BeanFactory 派 生 而 来 , 提 供 了 更 多 面 向 实 际 应 用 的 功 能 。
ApplicationContext 继承了 HierarchicalBeanFactory 和 ListableBeanFactory 接口,在此基础
上,还通过多个其他的接口扩展了 BeanFactory 的功能

  1. ClassPathXmlApplicationContext:默认从类路径加载配置文件
  2. FileSystemXmlApplicationContext:默认从文件系统中装载配置文件
  3. ApplicationEventPublisher:让容器拥有发布应用上下文事件的功能,包括容器启动事件、关闭事件等。
  4. MessageSource:为应用提供 i18n 国际化消息访问的功能;
  5. ResourcePatternResolver : 所 有 ApplicationContext 实现类都实现了类似于PathMatchingResourcePatternResolver 的功能,可以通过带前缀的 Ant 风格的资源文件路径装载 Spring 的配置文件。
  6. LifeCycle:该接口是 Spring 2.0 加入的,该接口提供了 start()和 stop()两个方法,主要用于控制异步处理过程。在具体使用时,该接口同时被 ApplicationContext 实现及具体Bean 实现, ApplicationContext 会将 start/stop 的信息传递给容器中所有实现了该接口的 Bean,以达到管理和控制 JMX、任务调度等目的。
  7. ConfigurableApplicationContext 扩展于 ApplicationContext,它新增加了两个主要的方法: refresh()和 close(),让 ApplicationContext 具有启动、刷新和关闭应用上下文的能力。在应用上下文关闭的情况下调用 refresh()即可启动应用上下文,在已经启动的状态下,调用 refresh()则清除缓存并重新装载配置信息,而调用 close()则可关闭应用上下文。

6.Spring-AOP

 AOP,一般称为面向切面编程,作为面向对象的一种补充,用于将那些与业务无关,
但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被
命名为“切面”(Aspect). SpringAOP 使用的动态代理,所谓的动态代理就是说 AOP 框
架不会去修改字节码,而是每次运行时在内存中临时为方法生成一个 AOP 对象,这个 AOP
对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。

1).AOP应用场景

  • 1. Authentication 权限
  • 2. Caching 缓存
  • 3. Context passing 内容传递
  • 4. Error handling 错误处理
  • 5. Lazy loading 懒加载
  • 6. Debugging 调试
  • 7. logging, tracing, profiling and monitoring 记录跟踪 优化 校准
  • 8. Performance optimization 性能优化
  • 9. Persistence 持久化
  • 10. Resource pooling 资源池
  • 11. Synchronization 同步
  • 12. Transactions 事务

2).AOP原理

  • 方面(Aspect)一个关注点的模块化,这个关注点实现可能另外横切多个对象。事务管理是J2EE应用中一个很好的横切关注点例子。方面用Spring的 Advisor或拦截器实现
  • 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或特定的异常被抛出。
  • 通知(Advice):Spring中定义了四个advice: BeforeAdvice, AfterAdvice, ThrowAdvice和DynamicIntroductionAdvice
  • 切入点(Pointcut): Spring定义了Pointcut接口,用来组合MethodMatcher和ClassFilter,可以通过名字很清楚的理解, MethodMatcher是用来检查目标类的方法是否可以被应用此通知,而ClassFilter是用来检查Pointcut是否应该应用到目标类上
  • 引入(Introduction)Spring中要使用Introduction, 可有通过DelegatingIntroductionInterceptor来实现通知
  • 目标对象(Target Object): 包含连接点的对象。也被称作被通知或被代理对象。
  • AOP代理(AOP Proxy): AOP框架创建的对象,包含通知。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。
  • 织入(Weaving): 组装方面来创建一个被通知对象。这可以在编译时完成(例如使用AspectJ编译器),也可以在运行时完成。Spring和其他纯Java AOP框架一样,在运行时完成织入。

3).Spring 提供了两种方式来生成代理对象

JDKProxy 和 Cglib,具体使用哪种方式生成由AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口,则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。

JDK动态代理

     JDK 动态代理只提供接口代理,不支持类代理,核心 InvocationHandler 接口和
Proxy 类,InvocationHandler 通过 invoke()方法反射来调用目标类中的代码,动态地将
横切逻辑和业务编织在一起,Proxy 利用 InvocationHandler 动态创建一个符合某一接口
的的实例, 生成目标类的代理对象。

CGLib代理

      如果代理类没有实现 InvocationHandler 接口,那么 Spring AOP 会选择使用
CGLIB 来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,
可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从
而实现 AOP。CGLIB 是通过继承的方式做的动态代理,因此如果某个类被标记为 final,
那么它是无法使用 CGLIB 做动态代理的。

7.Spring生命周期

  • 1. 实例化一个 Bean,也就是我们通常说的 new
  • 2. 按照 Spring 上下文对实例化的 Bean 进行配置,也就是 IOC 注入
  • 3. 如果这个 Bean 实现 dao 了 BeanNameAware 接口,会调用它实现的setBeanName(String beanId)方法,此处传递的是 Spring 配置文件中 Bean 的 ID
  • 4. 如果这个 Bean 实现了 BeanFactoryAware 接口,会调用它实现的 setBeanFactory(),传递的是 Spring 工厂本身(可以用这个方法获取到其他 Bean)
  • 5. 如果这个 Bean 实现了 ApplicationContextAware 接口,会调用setApplicationContext(ApplicationContext)方法,传入 Spring 上下文,该方式同样可以实现步骤 4,但比 4 更好,以为 ApplicationContext 是 BeanFactory 的子接口,有更多的实现方法
  • 6. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor 经常被用作是 Bean 内容的更改,并且由于这个是在 Bean 初始化结束时调用 After 方法,也可用于内存或缓存技术
  • 7. 如果这个Bean在Spring配置文件中配置了init-method属性会自动调用其配置的初始化方法
  • 8. 如果这个 Bean 关联了 BeanPostProcessor 接口,将会调用postAfterInitialization(Object obj, String s)方法。   注意:以上工作完成以后就可以用这个 Bean 了,那这个 Bean 是一个 single 的,所以一般情况下我们调用同一个 ID 的 Bean 会是在内容地址相同的实例
  • 9. 当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了 DisposableBean 接口,会调用其实现的 destroy 方法
  • 10. 最后,如果这个 Bean 的 Spring 配置中配置了 destroy-method 属性,会自动调用其配置的销毁方法

8.Spring面试题

1).Spring 支持 bean 的作用域有几种吗? 每种作用域是什么样的?

  1. singleton:默认作用域,单例 bean,每个容器中只有一个 bean 的实例。
  2. prototype:为每一个 bean 请求创建一个实例。
  3. request:为每一个 request 请求创建一个实例,在请求完成以后,bean 会失效并被垃圾回收器回收。
  4. session:与 request 范围类似,同一个 session 会话共享一个实例,不同会话使用不同的实例。
  5. global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在 global-session 中。

2).Spring 框架中都用到了哪些设计模式?

1. 工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例
2. 单例模式:Bean 默认为单例模式
3. 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术
4. 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate,
JpaTemplate
5. 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,
所 有 依 赖 于 它 的 对 象 都 会 得 到 通 知 被 制 动 更 新 , 如 Spring 中 listener 的 实 现
--ApplicationListener

3).Spring 的对象默认是单例的还是多例的? 单例 bean 存不存在线程安全问题呢?

1. 在 spring 中的对象默认是单例的,但是也可以配置为多例。
2. 单例bean对象对应的类存在可变的成员变量并且其中存在改变这个变量的线程时,
多线程操作该 bean 对象时会出现线程安全问题。
原因是:多线程操作如果改变成员变量,其他线程无法访问该 bean 对象,造成数据混
乱。
解决办法:在 bean 对象中避免定义可变成员变量;
在 bean 对象中定义一个 ThreadLocal 成员变量,将需要的可变成员变量保存在 ThreadLocal 中。

4). @Resource 和@Autowired 依赖注入的区别是什么? @Qualifier 使用场景是什么?

  1. @Resource    只能放在属性上,表示先按照属性名匹配 IOC 容器中对象 id 给属性注入值若没有成功,会继续根据当前属性的类型匹配 IOC 容器中同类型对象来注入值。                               若指定name 属性@Resource(name = "对象 id"),则只能按照对象 id 注入值。
  2. @Autowird                                                                                                                                      放在属性上:表示先按照类型给属性注入值如果 IOC 容器中存在多个与属性同类型的对象,则会按照属性名注入值。也可以配合@Qualifier("IOC 容器中对象 id")注解直接按照名称注入值。                                                                                                                                         放在方法上:表示自动执行当前方法,如果方法有参数,会自动从 IOC 容器中寻找同类型的对象给参数传值。也可以在参数上添加@Qualifier("IOC 容器中对象 id")注解按照名称寻找对象给参数传值。
  3. @Qualifier 使用场景:   @Qualifier("IOC 容器中对象 id")可以配合@Autowird 一起使用, 表示根据指定的 id 在 Spring 容器中匹配对象

5).Spring常用注解

1. @Component(任何层) @Controller @Service @Repository(dao): 用于实例化对象
2. @Scope : 设置 Spring 对象的作用域
3. @PostConstruct @PreDestroy : 用于设置 Spring 创建对象在对象创建之后和销毁之前要执行的方法
4. @Value: 简单属性的依赖注入
5. @Autowired: 对象属性的依赖注入
6. @Qualifier: 要和@Autowired 联合使用,代表在按照类型匹配的基础上,再按照名称匹配。
7. @Resource 按照属性名称依赖注入
8. @ComponentScan: 组件扫描
9. @Bean: 表在方法上,用于将方法的返回值对象放入容器
10. @PropertySource: 用于引入其它的 properties 配置文件
11. @Import: 在一个配置类中导入其它配置类的内容
12. @Configuration: 被此注解标注的类,会被 Spring 认为是配置类。Spring 在启动的时候会自动扫描并加载所有配置类,然后将配置 类中 bean 放入容器
13. @Transactional 此注解可以标在类上,也可以表在方法上,表示当前类中的方法具有事务管理功能。

6).Spring中的隔离级别

ISOLATION 隔离的意思
① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,
使用数据库默认的事务隔离级别。
② ISOLATION_READ_UNCOMMITTED:读未提交,允许另外一个事务可以看到这个
事务未提交的数据。
③ ISOLATION_READ_COMMITTED:读已提交,保证一个事务修改的数据提交后才
能被另一事务读取,而且能看到该事务对已有记录的更新。解决脏读问题
④ ISOLATION_REPEATABLE_READ:可重复读,保证一个事务修改的数据提交后才
能被另一事务读取,但是不能看到该事务对已有记录的更新。行锁
⑤ ISOLATION_SERIALIZABLE:一个事务在执行的过程中完全看不到其他事务对数据
库所做的更新。表锁

7).Spring通知类型

  1. 前置通知(Before Advice):在连接点(Join point)之前执行的通知。
  2. 后置通知(After Advice):当连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
  3. 环绕通知(Around Advice):包围一个连接点的通知,这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的 行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
  4. 返回后通知(AfterReturning Advice):在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
  5. 抛出异常后通知(AfterThrowing advice):在方法抛出异常退出时执行的通知

8).BeanFactory和ApplicationContext的区别

  • BeanFactory:      Spring 最顶层的接口,实现了 Spring 容器的最基础的一些功能, 调用起来比较麻烦, 一般面向 Spring 自身使用。BeanFactory 在启动的时候不会去实例化 Bean,从容器中拿 Bean 的时候才会去实例化
  • ApplicationContext:       是 BeanFactory 的子接口,扩展了其功能, 一般面向程序员身使用。ApplicationContext 在启动的时候就把所有的 Bean 全部实例化了
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值