1.Spring的核心容器有哪些模块组成?
答:Spring的核心容器是其他模块建立的基础,由Spring-core、Spring-beans、Spring-context、Spring-Context-support和Spring-expression(Spring表达式语言)等模块组成。
2.如何找到Spring框架的官方API?
答:将下载到的ZIP文件解压缩,解压缩后的目录结构中,docs目录包含Spring的API文档和开发规范。
SpringIOC的流程与代码步骤
SpringIOC的流程与代码步骤_Java_微尘的博客-CSDN博客_ioc的流程
一、IOC的流程
1、创建BeanFactory容器
2、使用BeanDefinitionReader解析XML中的Bean定义,生成BeanDefinition到容器中
3、后置处理器BeanFacotryPostProcesser处理增强Bean,比如处理dateSrouce中的${jdbc.url}占位符
4、通过反射,得到实例化后的Bean。
5、Bean的初始化,包括填充属性,执行Aware方法,Bean的前后PostProcesser的处理,得到完整的Bean
6、获得对象。
二、代码角度分析
ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
User user = ac.getBean(User.class);
执行流程
**1、先执行ApplicationContext的refresh(),创建beanFactory容器
2、加载配置文件,解析bean定义信息,封装BeanDefiniton
3、执行BeanFactoryPostProcesser准备工作:准备BeanPostProcesser,广播器,监听器
4、实例化
5、初始化
6、获取对象**
ApplicationContext的子类AbstractApplicationContext的refresh()包含13个子方法
三、图解
1.举例说明IoC容器的实现方式有哪些?
答:Sping提供了两种类型的IOC 容器实现:BeanFactory和ApplicationContext。
BeanFactory接口有多个实现类,其中比较常用的是org.springframework.beans.factory.xml.XmlBeanFactory,该类会根据XML配置文件中的定义来装配Bean。创建BeanFactory实例时,需要提供XML文件的绝对路径。例如:
BeanFactory beanFac = new XmlBeanFactory(
new FileSystemResource("D:\\eclipse-workspace\\ch1\\src\\applicationContext.xml")
);
ApplicationContext是BeanFactory的子接口,也称为应用上下文,由org.springframework.context.ApplicationContext接口定义。创建ApplicationContext接口实例通常有三种方法:通过ClassPathXmlApplicationContext创建、通过FileSystemXmlApplicationContext创建、通过Web服务器实例化ApplicationContext容器。
1)通过ClassPathXmlApplicationContext创建
ClassPathXmlApplicationContext将从类路径classPath目录(src根目录)寻找指定的XML配置文件,例如:
ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
2)通过FileSystemXmlApplicationContext创建
FileSystemXmlApplicationContext将从指定文件的绝对路径中寻找XML配置文件,找到并装载完成ApplicationContext的实例化工作。例如:
ApplicationContext appCon =
new FileSystemXmlApplicationContext("D:\\eclipse-workspace\\ch1\\src\\applicationContext.xml");
3)通过Web服务器实例化ApplicationContext容器
Web服务器实例化ApplicationContext容器时,一般使用基于org.springframework.web.context.ContextLoaderListener的实现方式(需要将spring-web-5.0.2.RELEASE.jar复制到WEB-INF/lib目录中),此方法只需在web.xml中添加如下代码:
<context-param>
<!-- 加载src目录下的applicationContext.xml文件 -->
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</context-param>
<!-- 指定以ContextLoaderListener方式启动Spring容器 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
2.在Spring框架中,什么是控制反转?什么是依赖注入?使用控制反转与依赖注入有什么优点?
答:控制反转(Inversion of Control,IoC)是一个比较抽象的概念,是Spring框架的核心,用来消减计算机程序的耦合问题。依赖注入(Dependency Injection,DI)是IoC的另外一种说法,只是从不同的角度,描述相同的概念。
当某个Java对象(调用者,比如您)需要调用另一个Java对象(被调用者,即被依赖对象,比如面包)时,在传统编程模式下,调用者通常会采用“new 被调用者”的代码方式来创建对象(比如您自己制作面包)。这种方式会增加调用者与被调用者之间的耦合性,不利于后期代码的升级与维护。
当Spring框架出现后,对象的实例不再由调用者来创建,而是由Spring容器(比如面包店)来创建。Spring容器会负责控制程序之间的关系(比如面包店负责控制您与面包的关系),而不是由调用者的程序代码直接控制。这样,控制权由调用者转移到Spring容器,控制权发生了反转,这就是Spring的控制反转。
从Spring容器角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。
综上所述,控制反转是一种通过描述(在Spring中可以是XML或注解)并通过第三方去产生或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入。
1.Bean的实例化有哪几种常见的方法?
答:Spring框架实例化Bean有三种方式:构造方法实例化、静态工厂实例化和实例工厂实例化。
2.简述基于注解的装配方式的基本用法。
答:1)使用注解创建Bean的实现类,如:
@Component()
/**相当于@Component("annotationUser")或@Component(value = "annotationUser"),annotationUser为Bean的id,默认为首字母小写的类名**/
public class AnnotationUser {
@Value("chenheng")//只注入了简单的值,复杂值的注入目前使用该方式还解决不了
private String uname;
/**省略setter和getter方法**/
}
2)配置注解
需要在配置文件中配置注解,注解配置方式如下:
<context:component-scan base-package="Bean所在的包路径"/>
3.@Autowired与@Resource的区别是什么?
答:该注解与@Autowired功能一样。区别在于,该注解默认是按照名称来装配注入的,只有当找不到与名称匹配的Bean才会按照类型来装配注入;而@Autowired默认按照Bean的类型进行装配,如果想按照名称来装配注入,则需要结合@Qualifier注解一起使用。
1.什么是AOP?有哪些术语?为什么要学习AOP编程?
答:AOP(Aspect-Oriented Programming),即面向切面编程。
在Spring AOP框架中,涉及以下常用术语:切面、连接点、切入点、通知(增强处理)、引入、目标对象、代理、组入。
AOP采取横向抽取机制,即将分散在各个方法中的重复代码提取出来,然后在程序编译或运行阶段,再将这些抽取出来的代码应用到需要执行的地方。这种横向抽取机制,采用传统的OOP是无法办到的,因为OOP实现的是父子关系的纵向重用。但是AOP不是OOP的替代品,而是OOP的补充,它们相辅相成。
2.在Java中,有哪些常用的动态代理技术?
答:在Java中,有多种动态代理技术,如JDK、CGLIB、Javassist、ASM,其中最常用的动态代理技术有JDK和CGLIB。
3.AspectJ框架的AOP开发方式有哪几种?
答:使用AspectJ实现Spring AOP的方式有两种:一是基于XML配置开发AspectJ,一是基于注解开发AspectJ。
1.什么是编程式事务管理?在Spring中有哪几种编程式事务管理?
答:在代码中显式调用beginTransaction()、commit()、rollback()等事务处理相关的方法,这就是编程式事务管理。
在Spring中有基于底层API的编程式事务管理和基于TransactionTemplate的编程式事务管理。
2.简述声明式事务管理的处理方式。
答:Spring的声明式事务管理,是通过AOP技术实现的事务管理,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
Spring的声明式事务管理可以通过两种方式来实现,一是基于XML的方式,一是基于@Transactional注解的方式。
基于XML方式的声明式事务管理是通过在配置文件中配置事务规则的相关声明来实现的。Spring框架提供了tx命名空间来配置事务,<tx:advice>元素来配置事务的通知。配置<tx:advice>元素时,一般需要指定id和transaction-manager属性,其中id属性是配置文件中的唯一标识,transaction-manager属性指定事务管理器。另外,还需要<tx:attributes>子元素,该子元素可配置多个<tx:method>子元素指定执行事务的细节。
@Transactional注解可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有public方法将都具有该类型的事务属性,同时,也可以在方法级别使用该注解来覆盖类级别的定义。
基于@Transactional注解声明式事务管理
@Transactional注解可以作用于接口、接口方法、类以及类的方法上。当作用于类上时,该类的所有public方法都将具有该类型的事务属性,同时也可以在方法级别使用该注解来覆盖类级别的定义。虽然@Transactional注解可以作用于接口、接口方法、类以及类的方法上,但是Spring小组建议不要在接口或者接口方法上使用该注解,因为它只有在使用基于接口的代理时才会生效。