博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-1
阅读量:6034 次
发布时间:2019-06-20

本文共 5004 字,大约阅读时间需要 16 分钟。

hot3.png

##基础知识

###1.IoC容器

负责实例化,配置程序中的对象,并建立对象间的依赖

代表:BeanFactory

###2.Bean概念 由IoC管理的对象叫Bean

###3.bean作用域

  • singleton:bean只会在ioc容器中存在一个实例,生命周期由spring容器管理,获取bean时返回同一个bean

    • 通过注册表方式:所有单例的bean放到一个map里,通过get()方法拿到
    • 实现类:DefaultSingletonBeanRegistry
  • prototype:向容器请求bean获取全新的bean

###4.资源访问 Resource接口提供对外部资源访问的一致接口

有多种实现类,来实现对不同资源的访问

ResourceLoader用于返回Resource对象,实现类:DefaultResourceLoader

ResourceLoaderAware:用于获得ResourceLoader实例

使用策略的设计模式:

ApplictionContext 实现了ResourceLoader接口,可以获得Resource实例

当用ApplictionContext获取Resource实例时,系统将采用和ApplictionContext相同的策略来访问资源:

ApplicationContext ctx=new ClassPathXmlApplicationContext("hello.xml");    	Resource resource=ctx.getResource("book.xml");   		System.out.println(resource.getFilename());

ctx.getResource将采用ClassPathResource的获取方式

###5.AOP 分类:

  • 静态代理:AOP框架提供的命令进行编译,在编译阶段生成AOP代理类,称为编译时增强
  • 动态代理:运行时借助JDK动态代理,或者CGLIB在内存中临时生成动态代理类,称为运行时增强
    • 如果目标类没有实现任何接口,使用CGLIB

AspectJ是一个基于java语言的AOP实现,

两种配置方式:

  • Annotation注解配置方式
  • xml配置方式

###6.spring数据访问

  • 统一的数据访问异常层次体系

由于数据库访问异常调用方不知道如何处理,因此适合定义为unchecked exception

spring异常父类:DataAccessException

jdbc设计问题:

  1. 过于面向底层,对使用者封装不够,每次都得写Connection,statement
  2. 异常的父类为SQLException,为checked exception,总是需要捕获并进行处理
  3. 没有定义子异常,而是通过ErrorCode来标识,但是errorCode留给了数据库提供商来定,

JDBC访问

  • 基于Template的JDBC使用

核心类:JdbcTemplate

做两件事情:

  1. 封装jdbc,提供规范的数据库访问,例如查询:

    public 
    T query(final String sql, final ResultSetExtractor
    rse) throws DataAccessException {}
  2. 将SQLException进行统一转义,转成spring的DataAccessException异常体系

  • 数据库资源管理:DataSource

实现类:

  • DriverManagerDataSource

  • ComboPoledDataSrouce:c3p0连接池

  • spring对ORM方案的支持

    spring对各种数据访问方式的管理和使用,都是通过相应的模板统一建模管理,  具体的访问逻辑由相应的回调接口提供,从而将数据访问的资源管理跟具体的数据访问逻辑分离

例如对ibatis的支持:

核心类:SqlMapClientTemplate提供模板方法

调用:SqlMapClientCallback.doInSqlMapClient(session)

###7.事务管理

设计原则:让事务管理的关注点和数据访问关注点分离

####三个主要接口

  • PlatformTransactionManager
  • TransactionDefinition
  • TransactionStatus

关系: PlatformTransactionManager将参照TransactionDefinition中的属性定义开启事务,事务过程中的状态由TransactionStatus负责

####TransactionDefinition 定义事务属性:隔离级别,超时时间

  • 事务的传播行为 默认值:PROPAGATION_REQUIRED,表示如果当前存在一个事务,加入该事务;如果不存在,创建一个新事务。

  • 实现类:TransactionTemplate

####TransactionStatus 定义事务过程中的事务状态

  • 实现类:SimpleTransactionStatus

####PlatformTransactionManager 事务的核心组件

基于策略模式,对事务界定进行统一抽象,具体的界定策略的实现,交给实现类

  • 实现类:
    • 局部事务:DataSourceTransactionManager(jdbc,ibatis的)
    • 分布式事务:JtaTransactionManager

重要类:

  • TransactionSynchronizationManager:管理当前事务状态以及资源
  • AbstractPlatformTransactionManager:作为各个实现类的父类,使用模板的设计模式,封装了固定的事务处理逻辑,将与事务资源的相关操作留给子类来做

DataSourceTransactionManager重要方法

  • getTransaction()
    • 作用:开启一个事务

###配置

####1.spring核心类

  • spring-core:
  • spring-beans
  • spring-context
  • spring-asm
  • spring-expression

###实践 ####1.通过ApplicationContext获取实例 bean配置文件:

获取实例

public void sayTest(){    ApplicationContext context=new ClassPathXmlApplicationContext("Hello.xml");    HelloService service=context.getBean("hello",HelloService.class);    service.sayHello();}

####2.延迟初始化Bean

####3.资源访问

public void resourceTest() throws IOException {    ResourceLoader loader=new DefaultResourceLoader();    Resource resource=loader.getResource("hello.property");    Assert.assertNotNull(resource);    System.out.println("description:"+resource.getDescription());    System.out.println("filename:"+resource.getFilename());    String content=CharStreams.toString(new InputStreamReader(resource.getInputStream()));    System.out.println(content);}

####4.aop注解配置

  1. 目标类:

    public class HelloServiceImpl implements HelloService {     public void sayHello() {         System.out.println("i am saying hello");     } }

2.aop

@Aspectpublic class LogAdvice {    @Pointcut("execution(* com.dundun.service.impl.HelloServiceImpl.sayHello*(..))")    public void pointcut(){}    @Before("pointcut()")    public void before(){        System.out.println("before");    }        @Around("pointcut()")    public void arount(ProceedingJoinPoint joinPoint) throws Throwable {        System.out.println("around before");        joinPoint.proceed();        System.out.println("around after");    }        @After("pointcut()")    public void after(){        System.out.println("after");    }}

3.xml配置

4.测试类

public class AopTest {	    @Test	    public void helloTest(){	        ApplicationContext ctx=new ClassPathXmlApplicationContext("aop.xml");	        HelloServiceImpl service=ctx.getBean("helloService",HelloServiceImpl.class);	        service.sayHello();			    }	}

输出:

before	around before	i am saying hello	after	around after

####5.AOP应用:定制化异常处理

需要实现ThrowsAdvice接口,定义需要捕获的异常,然后做操作:

public void afterThrowing(Method method,Object[] args,Object target,NumberFormatException e)throws Throwable{    System.out.println("number exception*************");    System.out.println("Error happened in class: " + target.getClass().getName());    System.out.println("Error happened in method: " + method.getName());    System.out.println("Exception class: " + e.getClass().getName());    System.out.println("number exception end*************************************");}

捕获NumberFormatException异常

转载于:https://my.oschina.net/SearchVera/blog/669114

你可能感兴趣的文章
ABP学习日记1
查看>>
python----文件读写
查看>>
Statement对象
查看>>
[转].NET 数字格式化:忽略末尾零
查看>>
Java电商项目面试题(五)
查看>>
JS根据经纬度获取地址信息
查看>>
linux链路聚合
查看>>
思科——NAT的应用
查看>>
MFS分布式文件系统服务搭建
查看>>
上海云栖:金融政企行业的CDN最佳实践
查看>>
开拓创新,这才是该做的事情
查看>>
gitlab https
查看>>
生成树协议(STP)
查看>>
Systemd曝3漏洞,大部分Linux将受到***
查看>>
Kodi ‘Leia’ 18.2 最终版发布
查看>>
微信内嵌浏览器打开手机浏览器下载APP(APK)的方法
查看>>
linux nc命令参数及用法详解
查看>>
oracle教程之DML事务锁定的机制
查看>>
Oracle RMAN配置EXCLUDE FOR TABLESPACE
查看>>
我的友情链接
查看>>