什么是spring?
理解说明:
spring是一个轻量级的开发框架,设计理念就是让开发人员面向接口开发。
作用:
解决企业开发复杂性,让开发人员专注于应用程序的开发
优点:
低耦合(为什么方便解耦-spring将所有对象的创建和依赖关系,都有自己来管理),
AOP(面向切面)
声明式事务
方便解耦
集成各种框架
缺点:spring的依赖反射,而反射影响性能
spring中用到哪些设计模式?
*工厂模式:beanFactory管理所有spring注册的对象,称之为Bean用唯一标识来获取Bean对象,
*单例模式:所有的bean都是单例模式
*代理模式:spring中AOP基于代理模式
模板模式:spring中的JDBCRestemplate,restTemplate
观察者模式:spring中的applicationListener
适配器模式:
spring特点:
AOP,IOC,事务管理。
那些模块组成?
数据库-orm框架
aop 分层 提供自定义拦截器,切点。
放bean的 核心容器,提供基本的操作,控制反转,依赖注入。
web(servlet)
test 测试
讲解一下spring中的核心容器?(bean Factory)
bean factory是任何以spring为基础的应用的核心,它让spring成为一个容器。
是工厂模式的一种实现,用于spring的bean管理,控制反转(平时都是自己new对象,现在由spring进行管理实例化)。
spring中有那些不同类型的事件?
上下文更新事件—>上下文开始---->上下文停止---->上下文关闭
前三种都是当容器调用Configrable Application Context的接口进行更新,开始,和结束。
上下文关闭事件是通过 Application Context 中被关闭时,会将所有单例Bean都被销毁。
请求处理事件:处理http请求结束时候,如果该bean实现了Application Listener接口,Application Event被发布以后,bean会被自动通知。
application listener
是spring请求处理事件的关键,配合Application Event一起使用来完成Application context的事件机制。
spring应用程序有哪些不同的组件?
进行拆分,基础–核心–功能–切面–配置;
基础:用户在使用时候的接口。
核心:bean的使用。
功能:一些接口的实现。
切面:aop的使用。如前置通知输出请求日志。
配置:spring的配置文件,如jdbc的链接。
什么是控制反转?
把之前自己来管理的如自己new对象,全部交由spring进行管理。
控制反转有什么作用?
解耦,管理对象。
控制反转的优点?
把应用的代码量降到最低,就如依赖注入如果手动去,先对普通对象的创建,在对依赖对象或者属性进行赋值。
加载服务的的饿加载和懒加载。
饿加载:spring容器初始化的时候进行bean创建,消耗资源,利用发现错误。
懒加载:spring容器中在使用bean的时候进行加载,消耗资源较小,不利于提前发现错误。
通过 default-lazy-init=“true” 创建bean时 开启懒加载。
控制反转的实现原理?
反射加工厂模式。
反射包括jdk的动态代理还有cg代理,
动态代理是bean实现jdk的动态代理的接口,重写父类的方法。
cg代理,自动生成bean的子类。进行父类的方法。
控制反转的特点?
依赖注入。
bean Factory 和application Context的区别?
applicationContext是beanFactory的子接口。
beanFactory采用的时懒加载,调用getBean时候创建bean。
applicationContext采用饿加载,启动容器的时候创建bean。
什么是依赖注入?
是在bean初始化前进行遍历bean中的元素,方法是否有生成bean的注解(bean,conmpoent)有的话spring进行单例池中进行查找,有的话拿出来,给当前bean进行赋值。没有则进行创建依赖bean。
构造器和setter注入的区别?
构造器:强制注入,setter:可选注入
什么是spring beans?
形成spring主干对象,被spring ioc 初始化,管理的java对象统称为beans。
bean定义包含什么?
它所属的元数据,和生命周期。
配置元数据方式有,xml,注解,java。
单例bean是线程安全的吗?
不是,为什么,因为默认是单例模式无状态,没有进行线程封装。
解决方法
把作用域重singleton变为prototype,这要请求bean相当于new,所以是线程安全。
非要单例的话,用Thread Local。
bean的生命周期?
实例化->实例化前->实例化后->放入单例池->销毁
先是对声明的bean进行实例化执行流程是如果有构造器就是先构造器注入,如果实现bean name aware调用方法Set Bean Name,如果实现Bean Factory Aware 调用Set Bean Factory方法,如果实现了Application Context Aware调用set Application Context方法,如果实现了Bean Post Proscessor调用默认初始方法,如果你自己声明了初始化方法注解@post Construct自定义了初始化方法,则使用该方法。这时候放入单例池中,最后销毁,调用disposable Bean的destroy方法,或则自定义实现的自定义销毁方法。
什么是bean的自动装配?
通过bean Factory进行bean之间的依赖关系。
有哪些装配bean的方式?
by type 根据参数类型
by name根据bean的名称
构造器 根据无参构造器进行by type进行
自动 先根据构造器,没有就进行by type
@Autowired自动装配过程?
在bean的初始化前spring会对bean中的标有@Autowied会去找到所属要的bean然后装配当该对象中,同样autowired会先进行bytype后byname。
什么是基于java的spring注解配置?
@bean,@configuration
bean作用与方法上需要返回,configuration作用在类上,把这个类交由spring ioc 管理。
@autowired和@Resourse区别?
Autowried默认通过类型注入,且注入的bean必须存在。
Resourse默认通过name进行注入,且注入的未找到会通过类型注入。
spring中的事务传播?
1.propagation_required(需要传播):如果有事务就加入,没有就新建。
2.propagation_supports(可有可无传播):如果有事务就加入没有就非事务执行。
3.propagation_mandtory(强制传播):有事务就加入,没事务就报错。
4.propagation_requires_news(新传播):有没有都要创建
5.propagation_not_supported (忽略传播):全部非事务,有事务挂起。
6.propagation_never(不要传播):有事务就报错。
7.propagation_nested(包含传播):有事务就包含执行,没有就做换类型required。
spring事务隔离?
五种级别。默认使用数据库隔离级别,
其他四种和数据库相同。
读未提交,可能引发脏读,幻读,不可重复读。
读已提交,可能引发不可重复读,幻读。
可重复读,可能引发幻读。
串行化。不会引发,但是会给表上锁,开销巨大。
spring AOP?
面向切面编程,对业务无关进行的管理,前置通知,环绕通知,后置通知,异常通知。
springAop和aspectj AOP的区别?
spring是动态代理,aspectj 是静态代理,
静态代理会修改.class的字节码(自己创建一个代理类并用注解声明通知类型)会在编译class文件中添加,动态代理是在运行时候创建一个代理类,复制父类的方法,调用方法。
jdk代理和cglib代理?
jdk是接口代理,不支持类代理,主要是类proxy,invocation handler,如果没有实现该接口会使用cglib,cglib是通过继承,创建一个子类继承父类的方法。