spring的概念
1.它是轻量级框架,可以方便的集成其他框架,事务管理的更加的方便,便于解耦
2.IOC主要用来管理bean,未用spring框架时,需要使用对象的时候,需要手动去new,有了spring框架之后,交给IOC容器管理。
3.AOP主要是面向切面编程,比如开发中需要经常记录日志,很多方法中都需要去写,这样与业务代码冗余到一起,不方便开发,使用AOP面向切面编程,就是将公共的方法提取出来,减少代码冗余。
它包括了哪些模块
spring core:核心类库,提供IOC服务;
spring aop:AOP服务,面向切面编程;
spring context:提供框架式的bean访问方式,以及企业功能(JNDI,定时任务等);
spring dao:对JDBC的抽象,简化了数据访问异常的处理;
spring orm:对现有orm框架的支持;
spring web:提供了基本的面向web的综合特性;
spring mvc:提供面向对象web应用的model-view-controller实现
优点
(1)spring属于低侵入式设计,代码的污染极低;
(2)spring的DI机制将对象之间的依赖关系交由框架处理,减低组件的耦合性;
(3)Spring提供了AOP技术,支持将一些通用任务,如安全、事务、日志、权限等进行集中式管理,从而提供更好的复用。
(4)spring对于主流的应用框架提供了集成支持。
作用域
singleton:默认是单例的,只有一个bean实例,通过scope属性设置其他作用域;
prototype:多例的,每次容器调用都会产生一个新的bean实例;
request:每一次http请求都会产生一个bean实例;
session:每个session中,都会有一个bean实例;
global-session:全局的http session。
生命周期
servlet实例化 - 初始化init - 接口调用处理service - 销毁destory。
实例化bean - 设置对象属性 - 处理Aware接口 - 创建成功调用 - 销毁destory。
bean的注入方式有哪些?
setter注入
构造器注入
注解注入
bean是线程安全的吗
spring中的bean默认是单例的,默认的是单例的bean,spring中对bean线程安全没有做特殊的处理,所以说,spring中不能保证bean是线程安全的。
谈谈对AOP的理解?
spring中的AOP即面向切面编程,面向切面编程是一种思想,即我们平常在开发中,比如记录日志,事物管理等,可能在很多地方都要使用,比如在A方法中记录日志,写了几行代码,可能B方法中,也要使用,这样就造成了代码冗余,重复代码太多,面向切面编程的思想,就是将这些方法提取出来,这样使用起来很方便,在需要的使用该方法的地方即可方便实现,如果有问题,也方便改。不至于每次出错改很多地方,提高了代码的复用性。
谈谈对IOC的理解?
IOC,就是我们经常所说的控制反转,DI,就是依赖注入,这两个是对同一个事物从不同角度的解释。没有使用spring框架的时候,我们需要使用一个对象,经常需要自己去手动new,需要自己取管理对象。使用spring的IOC容器之后,对象交给spring的IOC容器管理,bean的创建,初始化,结束,依赖注入等一系列,全部由IOC容器帮我们完成,我们在需要使用的时候,直接调用就行了。
Spring 框架中都用到了哪些设计模式?
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
(2)单例模式:Bean默认为单例模式。
(3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
(4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
(5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。
Spring事务的实现方式?
spring支持编程式事务管理和声明式事务管理两种方式:
①编程式事务管理使用TransactionTemplate。
②声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。
声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。
事务什么时候回滚
事务回滚规则定义了哪些异常会导致事务回滚而哪些不会。默认情况下,只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚。而在遇到检查型异常时不会回滚。 但是你可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。
事务为什么会超时原则
为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,也会占用数据库资源。事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。
@Transactional介绍
@Transactional注解 可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。
虽然@Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional注解应该只被应用到 public 方法上,这是由Spring AOP的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。
默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。
@Transactional注解属性的含义:
@Transactional注解里面的各个属性和咱们在上面讲的事务属性里面是一一对应的。用来设置事务的传播行为、隔离规则、回滚规则、事务超时、是否只读。
使用方式
@Transactional注解内部实现依赖于Spring AOP编程。而AOP在默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为。
@Transactional 注解尽量直接加在方法上
为什么:因为@Transactional直接加在类或者接口上,@Transactional注解会对类或者接口里面所有的public方法都有效(相当于所有的public方法都加上了@Transactional注解,而且注解带的参数都是一样的)。第一影响性能,可能有些方法我不需要@Transactional注解,第二方法不同可能@Transactional注解需要配置的参数也不同,比如有一个方法只是做查询操作,那咱们可能需要配置Transactional注解的readOnly参数。所以强烈建议@Transactional注解直接添加的需要的方法上。
@Transactional 注解必须添加在public方法上,private、protected方法上是无效的
在使用@Transactional 的时候一定要记住,在private,protected方法上添加@Transactional 注解不会有任何效果。相当于没加一样。即使外部能调到protected的方法也无效。和没有添加@Transactional一样。
ApplicationContext和BeanFacotry
相同
两者都是通过xml文件
不同
ApplicationContext和BeanFacotry相比,提供了更多的扩展功能,BeanFacotry是延迟加载
为什么ApplicationContext和BeanFacotry相比好处??
若Bean没完全注入,BeanFactory加载后,会在第一次调用后GetBean方法才会抛出异常;而ApplicationContext会在初始化的时候就开始进行加载了,检查依赖是否完全注入
spring常用注解
@Component:可以创建任意对象,将当前对象存入Spring容器中
@Repository:创建持久层(dao)对象,用来访问数据库
@Service:创建业务层(service)对象,处理业务逻辑,可以有事务功能
@Controller:创建表现层(controller)对象,接收请求,显示处理结果
赋值的注解
@Value:简单类型的属性赋值
@Autowired:Spring框架中引用类型的赋值注解,支持byName、byType赋值,默认是byType
@Autowired + @Qualifier:可以通过value指定具体的赋值对象。
@Resource:JDK中的注解,使用自动注入给引用类型赋值,支持byName、byType,默认是byName