Spring框架核心简介

为什么要用spring?

在spring出现之前,对于javaEE开发而言,从容器中得到Bean需要大量的远程调用,反射,代理,序列化和反序列化等复杂步骤;其次,对EJB容器的依赖比较重,难以得到快速开发和测试目的.而在spring中,他会认为一切java类都是Bean都是资源,而容纳这些Bean的就是他所提供的IoC容器.
spring的优势他不依赖spring所提供的API,使得spring更加灵活.spring可以整合很多框架,比如mybatis,EJB等,他所提供的是一个支持他们开发的模板.
spring提供的策略:

  • 可以通过配置(XML,注解)扩展POJO功能,通过依赖注入理念扩展功能,建议通过接口编程,降低系统耦合度,提高系统可读性和可扩展性.
  • 提供面向切面编程,能够把精力集中于业务开发.
  • 为整合各个框架,spring提供了模板类,比如:SqlSessionTemplate,RedisTemplate等.

spring IoC容器

首先,什么是控制反转?
控制反转就是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式.
而在spring中实现控制反转的就是IoC容器,其实现方法是依赖注入(Dependency Injection,DI).可以把各个模块接口都提交给IoC容器,最大好处就是降低模块对象之间耦合度,在这样被动模式下,对象的生产依靠IoC容器.
IoC容器的设计?
其主要基于BeanFactory和ApplicationContext两个接口,而后者又是前者的子接口,所以大部分场景下会使用后者作为IoC容器.
BeanFactory接口的主要方法:多个getBean(),不同的参数类型;isSingleton()判断是否单例,默认true.
通过实现类ClassPathXmlApplicationContext初始化spring IoC容器.

ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-cfg.xml");

IoC的初始化?
Bean初始化分三步:

  • 资源定位,(XML或注解)
  • BeanDefinition的载入,即spring根据配置获取对应POJO
  • BeanDefinition的注册,即把POJO往IoC容器中注册

做完初始化,但是没有完成依赖注入,即还没有
把配置的资源(属性值)给Bean,那么它还不能完全使用,对于依赖注入,还有一个配置选项lazy-init,默认false,也就是IoC默认自动初始化Bean,如果设置为true,那么只有当使用getBean方法获取它时,它才会进行初始化,完成依赖注入.
Bean的生命周期?

  • 如果Bean实现了接口BeanNameAware的setBeanName方法,则调之.
  • 如果实现了BeanFactoryAware的setBeanFactory方法,则调之.
  • 如果Bean实现了ApplicationContextAware的setApplicationContext方法,并且Spring IoC容器也必须是ApplicationContext接口的实现类,则调之.
  • 如果实现了BeanPostProcessor的postProcessBeforeInitialization方法方法,则调之.
  • 如果实现了BeanFactoryPostProcessor的afterPropertiesSet方法,则调之.
  • 如果Bean自定义了初始化方法,它就会调用已定义的初始化方法.
  • 如果实现BeanPostProcessor的postProcessAfterInitialization方法,调之.此时bean就完成了初始化,那么bean就生存在IoC容器中了.当服务器或IoC容器关闭时,会调用下面方法完成Bean的销毁.
  • 如果Bean实现了DisposableBean接口的destroy方法,则调之.
  • 如果自定义了销毁方法,则调之.

注:对于接口BeanPostProcessor是针对所有Bean而言的,即一个Bean实现所有Bean都调用,接口DisposableBean是针对Spring IoC容器本身的,其他的接口只针对单一Bean

装配spring bean

依赖注入的三种?
构造器注入,setter注入(主要的),接口注入
配置的三种方式?
隐式Bean的发现机制和自动装配原则,
在java的接口和类中实现配置,
在XML中显示配置.
Bean的作用域?
spring提供4种,根据情况决定是否生成新对象
singleton(单例),prototype(原型):每次注入或获取bean时都会创建一个新实例,
session(会话),request(请求)

AOP-面向切面编程

AOP概念?
面向切面编程,通过动态代理模式,带来管控各个对象操作的切面环境,管理包括日志,数据库事务等操作,让我们用于可以在反射原有对象方法之前正常返回,异常返回事后插入自己的逻辑代码的能力,甚至取代原始方法.在一些常用流程中,比如数据库事务,AOP会提供默认的实现逻辑和一些简单配置.
为什么使用AOP?
现实中一些内容并不是面向对象(OOP)可以解决的,比如数据库事务,多个对象需要在同一个事务中控制时候,就需要面向切面编程.首先它可以拦截一些方法,然后把各个对象组织成一个整体,比如网站的交易记录需要记录日志,如果约定好动态流程,就可以在交易前后,交易正常或异常发生时,通过这些约定记录相关日志了.使我们只用关注业务逻辑代码,提高代码可读性和可维护性.
术语?
切面(Aspect):就是在一个怎么样环境中工作,在动态代理中相当于拦截器.
通知(Advice):切面开启后,切面的方法,相当于拦截器的方法.分为:前置通知,后置通知,返回通知,异常通知,环绕通知.
切点(Pointcut):被切面拦截的方法就是一个切点,切面将可以将其切点和被拦截的方法按一定的逻辑织入到约定流程中.
连接点(join point):是一个判断条件,由它可以指定哪些是切点.对于是切点,spring才会使用对应的切面对其拦截.
织入(Weaving):是一个生成代理对象的过程,spring以JDK和CGLIB动态代理来生成的.
spring中实现AOP的4个方式?
使用@AspectJ注解驱动切面.
使用XML配置AOP
使用ProxyFactoryBean和对应的接口实现AOP
使用AspectJ注入切面
注意:AOP并不是spring特有,有些AOP能对方法的参数进行拦截,而spring只能支持方法拦截.
如何使用@AspectJ注解开发spring AOP?
创建切面类上加@Aspect,在其方法上加@Before(),@AfterThrowing()等.在通知方法的注解内些连接点表达式(execution(* com.类的全限定名.被拦截方法名(…))),也可以用注解@pointcut()避免重复些那些表达式.最后@EnableAspectJAutoProxy代表着启用AspectJ框架的自动代理,这时spring才会生成动态代理对象,进而使用AOP
多切面?
当有多个切面时他是随机执行的,需要指定一下切面执行顺序,可以在切面类上加@Order(数字)来指定执行顺序.并且spring底层是通过责任链模式处理多个切面的,比如:处理结果为
before1…
before2…
before3…
test…
after3…
afterReturning3…
after2…
afterReturning2…
after1…
afterReturning1…

spring数据库事务管理

数据库事务管理器?
常用DataSourceTransactionManager,它又继承抽象事务管理器AbstractPlatformTransactionManager,而这个又实现了PlatformTransactionManager接口.
@Transactional?
它属于声明式事务中的注解方式,可用在类或方法上.
配置项:isolation:隔离级别 propagation:传播行为 timeout:超时时间 readOnly:是否开启只读事务 rollbackFor:回滚事务的异常类定义,即只有当方法产生所定义的异常时才回滚 noRollbackFor:当产生哪些异常时不回滚事务.
而这些配置项的选择都定义在事务定义器TransactionDefinition接口内.
注意:传播行为中设置为NESTED时,spring会先去探测当前数据库是否支持保存点技术,如果不支持,他就会和REQUIRES_NEW一样创建新事务去运行代码,以达到内部方法发生异常时并不回滚当前事务的目的.
该注解的底层实现是spring AOP技术,而spring AOP技术使用动态代理,意味着对于静态static方法和非public方法,注解都是失效的.另外如果一个类的方法调用自身类的另一个方法即自调用,被调用的那个方法上的事务注解也会失效,因为这相当于自己调用自己的过程,并不存在代理对象的调用,这样就不会产生AOP去为我们设置@Transactional配置的参数.
解决上面问题方法:使用两个服务类,利用spring IoC容器为你生成代理对象.另外,也可以getBean()方法直接从容器中获取代理对象.
声名式事务的约定流程?
在spring IoC容器初始化时,spring会读入这个注解或者XML配置的事务信息,并且保存到一个事务定义类里(TransactionDefinition接口的子类),以备将来使用.当运行时会让spring拦截注解标注的某一方法或类的所有方法,有了AOP的概念,那么它就会把你编写的代码织入到AOP的流程中.
首先spring通过事务管理器(PlatformTransactionManager的子类)创建事务,同时会把事务中定义的配置属性往事务上设置,然后启动业务代码,spring会通过反射方式调度开发者的业务代码,若发生异常则回滚.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值