目录
一、Spring是什么?
Spring是一个开源的轻量级的为Java应用程序提供基础性的服务的ioc和aop容器框架,目的是简化开发。
二、Spring核心类(API)
1.BeanFactory:是一个可以生产任意bean的工厂。采取延迟加载,第一次getBean时才会初始化Bean
2.ApplicationContext:是BeanFactory的子接口,功能强大,如:国际化配置,事件传递等,当配置文件被加载时实例化对象
三、SpringIOC
1.概念:就是控制反转,指创建对象的控制权的转移,也就是程序本身不在负责组件的创建,维护等,而是由Spring的容器(ApplicationContext)负责。ApplicationContext工具类通过读取配置文件管理对象。
2.Spring的ioc有哪些注入方式?
(1)Setter方式注入:<property>
(2)构造器注入:<construtor-arg>
(3)注解注入:@Autowired和Resource
3.IOC控制反转注解有哪些?
(1)@Componet:在没有明确层次时,还想交给Spring进行实例化时使用;
(2)@Controller:用于控制层
(3)@Service:用于业务层
(4)@Repository:用于 dao 层
以上注解功能:让当前类交给spring进行实例化对象,取代<bean>标签实例化的方式
4.DI依赖注入的注解有哪些?
用来给我们的依赖的内容进行动态的注入值,所谓DI是IOC的一种具体实现
(1)@Value:用于普通属性注入
(2)@Autowired:用于自定义引用数据类型的注入;
(3)@Resource:用于自定义引用数据类型的注入;
(4)@Autowired和@Resource区别
@Autowired是Spring中的注解,优先通过byType进行注入,如果当前type类型对象大于1的时候,需要结合@Qualifier(name值)进行byName注入
@Resource是Java中的注解,优先使用byName进行注入,如果失败那么就执行byType
四、Spring中都用到了哪些设计模式?
1.工厂模式
Spring使用工厂模式,通过BeanFactory和ApplicationContext来创建对象
2.单例模式
Bean默认为单例模式
3.策略模式
Resource的实现类,针对不同的资源文件,实现不同方式的资源获取策略
4.代理模式
Spring的Aop功能用到了JDK的动态代理和CGLIB字节码生成技术
5.模板方法
可以把相同部分的代码放在父类中,而将不同的代码放入不同的子类
6.适配器模式
SpringAop的增强或通知(Advice)使用到了适配器模式,MVC中也用到了适配器模式适配Controller
7.观察者模式
Spring事件驱动模型就是观察者模式的一个经典的应用
8.桥接模式
可以根据客户的需求能够动态切换不同的数据源
五、SpringAop
1.概念:是面向切面编程,AOP是OOP(面向对象编程)的延续,Aop采用横向抽取机制代替传统的纵向继承机制,提高代码的复用性
2.AOP是如何实现的
采用了代理设计模式
有接口和实现类:Spring采用JDK的动态代理
没有接口只有类:Spring采用cglib字节码增强代理
3.切点(Pointcut):已经被代理的方法(一个切点表达式可以定位多个类中的多个方法)
4.连接点(Joinpoint):在应用执行过程中能够插入切面的一个点
5.通知(Advice):增强,增强代码一共分为五类
(1)前置通知:before
(2)返回通知:afterReturning
(3)环绕通知:around
(4)异常通知:afterThrowing
(5)后置通知:after
6.切面(Aspect):切点和通知的结合,他既包括横切逻辑的定义,也包括连接点的定义
7.目标类(Target):需要代理的类
8.代理类(Proxy):切面类
9.织入(Weaving):指的是把通知应用到目标对象来创建代理类的过程
五、Spring有点有哪些?
1.属于低侵入式设计,代码的污染极低
2.Spring的DI机制将对象之间的依赖关系交由框架处理,降低组件的耦合度
3.Spring的aop技术支持将一些通用任务,如:事务,日志等,进行集中式管理,提高代码的复用性
4.Spring对主流的应用框架提供了集中式支持
六、单例和多例的区别?
1.所谓单例就是所有的请求都用一个对象实例来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求都用一个新的对象(实例)来处理。
2.单例模式和多例模式说明
(1)单例模式和多例模式都属于对象模式
(2)单例模式的对象在整个系统中只有一份,多例模式可以有多个实例
(3)它们都不对外提供构造方法,即构造方法都为私有
3.为什么用单例,多例
(1)之所以用单例,是应为没必要每个请求都新建一个新的对象,这样既浪费cpu又浪费内存
(2)之所以用多例,是为了防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象状态的改变导致了对象对另一个请求做了错误的处理
七、Spring事务的实现原理与实现方式?
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。Spring只提供统一事务管理接口,具体实现都是由各数据库自己实现,数据库事务的提交和回滚是通过 redo log 和 undo log实现的。Spring会在事务开始时,根据当前环境中设置的隔离级别,调整数据库隔离级别,由此保持一致。