spring-1

2019独角兽企业重金招聘Python工程师标准>>> 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

@Aspect
public 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

你可能感兴趣的:(数据库,设计模式,python)