1. Spring 是什么?
Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基 础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需 要关心业务需求。常见的配置方式有三种:基于 XML 的配置.基于注解的配置. 基于 Java 的配置
2. Spring 的 AOP 理解?
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。可用于权限认证.日志.事务处理。 AOP 实现的关键在于代理模式,AOP 代理主要分为静态代理和动态代理。静态代理的代表为 AspectJ;动态代理则以 Spring AO
3. Spring 的 IOC 理解?
OC 就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到 Spring 容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能复用。DI 依赖注入,和控制反转是同一个概念的不同角 度的描述,即 应用程序在运行时依赖 Spring 的 IOC 有三种注入方式 :构造器注入, setter 方法注入, 根据注解注入。
IOC 让相互协作的组件保持松散的耦合,而 AOP 编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。
4. Spring Bean 的生命周期?
- Spring对bean进行实例化,默认bean是单例;
- Spring对bean进行依赖注入;
- 如果bean实现了BeanNameAware接口,spring将bean的id传给setBeanName()方法;
- 如果bean实现了BeanFactoryAware接口,spring将调用setBeanFactory方法,将BeanFactory实例传进来;
- 如果bean实现了ApplicationContextAware接口,它的setApplicationContext()方法将被调用,将应用上下文的引用传入到bean中;
- 如果bean实现了BeanPostProcessor接口,它的postProcessBeforeInitialization方法将被调用;
- 如果bean实现了InitializingBean接口,spring将调用它的afterPropertiesSet接口方法,类似的如bean使用了init-method属性声明了初始化方法,该方法也会被调用;
- 如果bean实现了BeanPostProcessor接口,它的postProcessAfterInitialization接口方法将被调用;
- 此时bean已经准备就绪,可以被应用程序使用了,他们将一直驻留在应用上下文中,直到该应用上下文被销毁;
- 若bean实现了DisposableBean接口,spring将调用它的distroy()接口方法。同样的,如果bean使用了destroy-method属性声明了销毁方法,则该方法被调用;
5. 解释 Spring 支持的几种 bean 的作用
Spring 容器中的 bean 可以分为 5 个范围:
- singleton:默认,每个容器中只有一个 bean 的实例,单例的模式由BeanFactory 自身来维护
- prototype:为每一个 bean 请求提供一个实例。
- request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
- session:与 request 范围类似,确保每个 session 中有一个 bean 的实例,在 session 过期后,bean 会随之失效。
- global-session:全局作用域,global-session 和 Portlet 应用相关。 当你的应用部署在 Portlet 容器中工作时,它包含很多 portlet。如果你想要声明让所有的 portlet 共用全局的存储变量的话,那么这全局变量需要存储在global-session 中。全局作用域与 Servlet 中的 session 作用域效果相同。
6. spring 常见的注解
@Qualifier 注解一起使用。如下:@Autowired@Qualifier(“personDaoBean”)存在多个实例配合使用 @Autowired 默认按类型装配,如果我们想使用按名称装配,可以结合 @Controller 用于标注控制层组件(如 struts 中的 action) @Repository 用于标注数据访问组件,即 DAO 组件。 @Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 @Scope 用于指定 scope 作用域的(用在类上) @PostConstruct 用于指定初始化方法(用在方法上) @PreDestory 用于指定销毁方法(用在方法上) @Resource 默认按名称装配,当找不到与名称匹配的 bean 才会按类型装配。 @DependsOn:定义 Bean 初始化及销毁时的顺序 @Primary:自动装配时当出现多个 Bean 候选者时,被注解为@Primary 的Bean 将作为首选者,否则将抛出异常 @Resource 默认按名称装配,当找不到与名称匹配的 bean 才会按类型装配。 @Configuration 把一个类作为一个 IoC 容器,它的某个方法头上如果注册了 @Bean,就会作为这个 Spring 容器中的 Bean。 @Scope 注解 作用域 @Lazy(true) 表示延迟初始化 @Service 用于标注业务层组件.
7. Spring 框架中都用到了哪些设计模式?
- 工厂模式:BeanFactory 就是简单工厂模式的体现,用来创建对象的实例;
- 单例模式:Bean 默认为单例模式。
- 代理模式:Spring 的 AOP 功能用到了 JDK 的动态代理和 CGLIB 字节码生成技术;
- 模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
- 观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如 Spring 中listener 的实现–ApplicationListener。
8. Spring通知(Advice)有哪些类型?
(1)前置通知(Before Advice):在连接点(Join point)之前执行的通知。
(2)后置通知(After Advice):当连接点退出的时候执行的通知(不论是正常返回还是异常退出)。
(3)环绕通知(Around Advice):包围一个连接点的通知,这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也可以选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。
(4)返回后通知(AfterReturning Advice):在连接点正常完成后执行的通知(如果连接点抛出异常,则不执行)
(5)抛出异常后通知(AfterThrowing advice):在方法抛出异常退出时执行的通知
9. BeanFactory和ApplicationContext有什么区别?
BeanFactory是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理。ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能:
- 继承MessageSource,因此支持国际化。
- 资源文件访问,如URL和文件(ResourceLoader)。
- 载入多个(有继承关系)上下文(即同时加载多个配置文件) ,使得每一个上下文都专注于一个特定的层次,比如应用的web层。
- 提供在监听器中注册bean的事件。
BeanFactory通常以编程的方式被创建,ApplicationContext还能以声明的方式创建 BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。
10. Spring 的优点?
- spring属于低侵入式设计,代码的污染极低;
- spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
- Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。
- spring对于主流的应用框架提供了集成支持。
|