2019独角兽企业重金招聘Python工程师标准>>>
##基础知识
###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设计问题:
- 过于面向底层,对使用者封装不够,每次都得写Connection,statement
- 异常的父类为SQLException,为checked exception,总是需要捕获并进行处理
- 没有定义子异常,而是通过ErrorCode来标识,但是errorCode留给了数据库提供商来定,
JDBC访问
- 基于Template的JDBC使用
核心类:JdbcTemplate
做两件事情:
-
封装jdbc,提供规范的数据库访问,例如查询:
public
T query(final String sql, final ResultSetExtractor rse) throws DataAccessException {} -
将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注解配置
-
目标类:
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异常
实际中的例子