Spring面试基础
Spring框架相关组件
- Spring Core:核心类库,提供IOC服务。
- Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等)。
- Spring AOP:AOP服务。
- Spring DOA:对JDBC的抽象,简化了数据访问异常的处理。
- Spring ORM:对现有的ORM框架的支持。
- Spring Web:提供了基本的面向Web的综合特性,例如多方文件上传。
Spring MVC:提供面向Web应用的Model-View-Controller实现。
什么是IOC和DI
IOC
IOC就是控制反转,是指创建对象的控制权的转移,以前创建对象的主动权和时机是由自己把控的,而现在这种权力转移到Spring容器中,并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系,对象与对象之间松散耦合,也利于功能的复用。DI依赖注入,和控制反转是同一个概念的不同角度的描述,即 应用程序在运行时依赖IoC容器来动态注入对象需要的外部资源。
- DI
DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
Spring Bean的配置方式
- 基于XML的配置
- 基于注解的配置(@Component、@Respository、@Controller、@Service)
在Spring的配置文件中定义注解扫描的范围<context:component-scan base-package="com.itcast" />
或在主配置类上使用@ComponentScan注解
这样com.itcast包下所有标注了 @Component、@Repository、@Controller注解的类,会被注册到容器中。
基于Java类+配置注解的方式(@Comfiguration 写在类上、@Bean 写在方法上)
IOC容器Bean的常见属性
id:Bean的唯一标识,IOC容器中Bean的id标签不能重复,否则报错。
- name:Bena的别名,可以定义多个。
- class:Bean的全限定类名,指向ClassPath下类定义走在位置。
- factory-method:工厂方法属性,通过该属性我们可以调用一个指定的静态工厂方法,创建Bean实例。
- scope:Bean的作用范围。
- init-method:Bean初始化时执行的方法。
- destory-method:Bean销毁时执行的方法。
- autowrie:Bean的自动装配方式,可选值,默认值:no不进行自动装配。
- property:用setter方法给Bean的对象注入属性,类似set方法。
constructor-arg:用构造器给Bean对象注入属性。
IOC容器Bean的作用域
singleton:单例模式,表示整个IOC容器共享一个Bean,也就是说每次通过getBean()方法获取的Bean都是同一个。
- prototype:多例模式,每次对该Bean请求时(将其注入到另一个Bean中,或者以程序的方式调用容器的getBean()方法)都会创建一个新的Bean实例。
- request:每次HTTP请求将会生成各自的Bean实例。
- session:每次会话请求对应一个Bean实例。
-
IOC依赖注入方式
构造器注入:constructor-arg标签
- setter方法注入:property标签
-
IOC容器中重要的类

BeanFactory接口:顶级接口,仅提供了最基本的容器方法,如getBean()。
- 实现类
- XmlBeanFactory。
- 实现类
ApplicationContext接口:扩展了BeanFactory,提供了很多功能,是我们常用的容器。
@ComponentScan:组件扫描,会扫描指定包下的以下注解
- @Controller:标注当前类为容器的对象,代表控制组件。
- @Service:标注当前类为容器的对象,代表服务组件。
- @Repository:标注当前类为容器的对象,代表持久组件。
- @Component:标注当前类为容器的对象,代表组件。
- @Autowired:自动装配注解,默认按类型装配 。
- @Transactional:事务注解。
- @Value:将配置文件中的值注入到指定字段。
- @Bean:配置bean对象,与
标签作用一致。 @Configuration:标注当前的java类是一个配置类。
@AutoWried注解和@Resource注解的区别
两者都可以用来装配Bean,都可以写在字段上,或写在setter方法上。
- @AutoWried默认按类型装配(这个注解是属于spring的),默认情况下必须要求以来对象存在,如果要允许null值,可以设置它的required属性为false:
@Autowired(required=false),如果我们想使用名称装配可以搭配@Qualifier注解进行使用。 - @Resource(这个注解属于J2EE的),默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行安装名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
Spring面试重点
IOC容器初始化流程
