什么是控制反转(IOC)?
把对象的创建、初始化、销毁交给 spring 来管理,而不是由开发者控制,实现控制反转
底层原理:xml解析、工厂模式、反射
什么是依赖注入(DI)?
从spring的配置文件中获取这个对象的实例,在编译阶段并不知道是哪个,只有在运行阶段才知道是哪个对象,作用是解耦合
java中有三种依赖注入的方式
- 构造器注入
- Setter 方法注入
- 接口注入
BeanFactory 和 ApplicationContext 有什么区别?
BeanFactory:
加载配置文件的时候不会创建对象,在获取对象时才去创建对象
ApplicationContext:
在加载配置文件的时候就会把再配置文件中的对象创建,他有两个实现类
- FileSystemXmlApplicationContext();写的是xml文件的系统路径
- ClassPathXmlApplicationContext();写的是xml文件的类路径
Spring 有几种配置方式?
- 基于XML的配置
- 基于注解的配置
- 基于java配置类
使用XML配置bean的方式?
在spring的xml中使用bean标签,标签中添加对应的属性,就可以实现对象的创建,id属性:唯一表示,class属性:类全路径,创建对象时,默认执行无参构造,若没有则会报错
在bean标签中使用子标签可以通过对象的set方法进行赋值
<bean id="book" class="com.hty.Book">
<!--bean标签中使用property完成属性注入-->
<property name="bname" value="1"></property>
<property name="bauthor" value="1"></property>
<!--注入null-->
<property name="address">
<null/>
</property>
</bean>
<!--使用p名称空间注入可以简化配置-->
<bean id="book" class="com.hty.Book" p:bname="1" p:bauthor="1"></bean>
还可以使用有参构造进行赋值,使用的是bean中的constructor-arg标签
<bean id="orders" class="com.hty.Orders">
<constructor-arg name="oname" value="1"></constructor-arg>
<constructor-arg name="address" value="1"></constructor-arg>
</bean>
如何用基于 Java 配置的方式配置 Spring?
使用@Configuration
注解和@Bean
注解共同实现
@Configuration
注解可以让一个类称为spring的配置类,在一个方法上使用@Bean注解,就可以让这个方法的返回值的对象被spring管理
对于这类配置需要使用AnnotationConfigApplicationContext
来获取对象
还需要在xml文件中加入<context:annotation-config/>
来让注解生效
@Autowired和@Qualifier的区别?
使用 @Autowired 注解进行装配,只能是根据类型进行匹配。@Autowired 注解可以用于 Setter 方法、构造函数、字段,甚至普通方法,前提是方法必须有至少一个参数。
@Qualifier(“ppp”) 可以按照名称来注入bean
Spring Bean 的生命周期?
-
无参构造创建
bean
实例 -
为
bean
的属性设置值 -
把
bean
实例传递给bean
后置处理器的方法PostProcessBeforeInitialization
-
调用
bean
的初始化的方法(需要配置)[init-method属性] -
把
bean
实例传递给bean
后置处理器的方法PostProcessAfterInitialization
-
bean
的使用 -
容器关闭时候,调用bean销毁的方法(要配置)之后再测试类中调用
context.close()
方法
注:context
需要强转为ClassPathXmlApplicationContext
类型
Bean的作用域?
在spring中的默认情况下,bean
是单实例,可以在配置文件中进行配置,在bean
标签中有一个属性scope
,用于设置实例,singleton
表示单例,prototype
表示多例
request
:在请求 bean
范围内会每一个来自客户端的网络请求创建一个实例,在请求完成以后,bean
会失效并被垃圾回收器回收。
Session
:与请求范围类似,确保每个 session
中有一个 bean
的实例,在 session
过期后,bean
会随之失效。
Spring 框架中的单例 Beans 是线程安全的么?
Spring 框架并没有对单例 bean
进行任何多线程的封装处理,大部分的 Spring bean
并没有可变的状态,但是如果是model
对象会不断的变化,那么就需要自行保证线程安全
最简单的方法就是将bean
的作用域从singleton
变为prototype
即可
简述AOP?
Aspect Oriented Program, 面向(方面)切面的编程;Filter(过滤器) 也是一种 AOP. AOP 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充. AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点.可以举例通过事务说明.
AOP术语?
-
连接点
类中哪些方法可以被增强,这些方法被称为连接点
-
切入点
实际被真正增强的方法称为切入点
-
通知(增强)
实际增强的逻辑部分称为通知(增强),通知有多种类型
前置通知、后置通知、环绕通知、异常通知、最终通知
-
切面
是动作,把通知应用到切入点过程
spring的事务管理
在配置文件中开启事务
<!--开启事务注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
在需要事务的方法上添加注解
@Transactional(propagation = Propagation.REQUIRED)