一.Spring
1.什么是Spring框架?
Spring是一种开源框架,用于简化开发,整合框架。主要包含三个方面:IOC,DI,AOP
IOC:控制反转,将对象的创建权交给spring框架创建
DI:依赖注入,给容器中的bean与bean之间建立的依赖关系
AOP:面向切面编程
2.IOC容器有哪些?
ClassPathXmlApplicationContext,FileSystemXmlApplicationContext,AnnotaionConfigApplicationContext,Beanfactoy
3.DI
依赖注入,给容器中bean的属性赋值就叫依赖注入。
依赖注入的方式有哪些?
构造器注入
<constructor-arg name="" ref="" / value="">
setter注入
<property name="" ref="" / value="">
4.ApplicationContext和BeanFactory的区别?
ApplicatinContext和BeanFactory都是spring容器
BeanFactory是底层接口,ApplicationContext是派生接口,功能更强大。BeanFactory是懒加载(使用的时候才会创建bean),当内存不足时可以选择BeanFactory容器。ApplicationContext默认在容器初始化时就会加载所有bean,优点是拿来即用,无需加载,缺点是起始阶段太占内存。
5.BeanFactory和FactorvBean的区别?
BeanFactory是spring容器,FactoryBean是工厂bean,用于创建bean,并将创建出来的bean放到容器中。
6.bean标签中的属性?
<bean id="" name="" class="" scope="" init-method="" desctory-method="" lazy-init="" autowire=""/>
id:创建Bean对象的名称
name:给bean对象起别名
class:要创建什么类型的对象
scope:singleton(默认为单例),prototype多例
init-method:初始化方法
desctory-method:销毁方法
lazy-init:是否为懒加载
autowire:是否自动装配
7.Spring中的单例Bean是线程安全的吗?怎么解决线程安全问题?
不安全。但是spring中Bena是无状态的,也就是不存储任何内容,从某种意义上是线程安全的。
1.把bean的作用域改为非单例 prototype
2,把共享变量放到ThreadLocal中,ThreadLocal是线程私有变量,线程间隔离,也可以解决线程安全问题
8.简单描述下Spring容器中bean的生命周期?
BeanDefinition >> 实例化 >> 注入依赖 >> 初始化 >> 使用 >> 销毁
1.先通过配置文件或者注解拿到所有的BeanDefinition,并放到BeanDefinitionMap中
2.从BeanDefinitionMap中拿到bean定义并进行实例化 new
3.依赖注入,给容器中的bean与bean建立依赖关系
4.初始化,给属性赋值
5.初始化完成后,就可以把bean放到spring容器中,ConcurrentHashMap,我们使用的时候就可以通过getBean来获取bean
6.容器销毁的时候,bean也会跟着销毁
BeanDefinition是bean定义。描述的是这个bean的类型,既这个bean的名字,有哪些属性,有哪些构造函数,有哪些方法。
9.AOP的理解?
概念?
面向切面编程。把公共代码抽取出来,并在不改变原始代码的基础上对方法进行功能增强。连接点:所有可以被功能增强的方法都是连接点
切入点:进行了功能增强的方法就是切入点
通知:共性功能
通知类:通知所在的类就是通知类
切面:切入点+通知就是切面。描述的是 在哪些方法上进行什么功能增强
10.AOP底层原理?
动态代理。在程序运行期间动态的生成一个代理对象,当调用到原始方法时,真正执行的是代理对象的代理方法。
动态代理实现方式有两种,基于JDK的动态代理(反射)和基于CGLib的动态代理(继承)。
11.AOP五种通知类型?
前置通知:@Before
后置通知:@After
环绕通知:@Around
异常后通知:@AfterThrowing
返回后通知:@AfterReturning
12.注解
Spring中用过哪些注解?
定义bean: @Component @Controller @Service @Repository
依赖注入:@Autowired @Qualifier @Resource @Value
定义第三方bean:@Bean
配置类注解:@Configuration @Import @PropertySource @ComponentScan
bean的作用范围和生命周期:@Scope @PostConstruct @PreDestroy
13.事务
Spring中事务的作用?
保证业务层的方法同时成功同时失败
如何添加事务?
1. @Transactional
2. 在主配置类上添加 @EnableTransactionManager
3. 把事务管理器交给Spring管理 PlateformTransactionManagement事务传播行为的作用?
用于解决业务层方法相互调用产生的事务问题,描述的是 事务协调员是否要和事务管理员同成功同失败事务传播行为有哪些?
默认、新建、支持、不支持
说一下事务的ACID?
1.原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,保证事务要么同时成功,要么同时失败。
2.一致性(Consistency):事务的前后数据的完整性必须保持一致
3.隔离性(Isolation):事务的隔离性是指多个用户并发的访问数据库时,数据库为每一个用户开启事务,不能被其他事务操作所干扰,多个并发的事务之间要相互隔离
4.持久性(Durability):持久性是指事务一旦被提交,它对数据库的数据修改是永久性的,即使数据库发生故障也不能对其有任何影响
事务的隔离级别?
1.读未提交(read uncommitted):另一个事务修改了数据,但未提交数据,而本事务在select中会读到这些未被提交数据(脏读)
2.读以提交(read committed)RC:事务能够看到的数据都是其他事务已经提交的修改,也就是保证不会看到任何中间性状态,当然脏读也不会出现。
3.可重复读(repeatable read)RR:保证同一个事务中多次读取的数据是一致的,这是 MySQL InnoDB 引擎的默认隔离级别。
4.串行化(serializable):并发事务之间是串行化的,通常意味着读取需要获取共享读锁,更新需要获取排他写锁,如果 SQL 使用 WHERE 语句,还会获取区间锁,是最高的隔离级别。