本帖最后由 小石姐姐 于 2018-7-31 10:39 编辑
Sping一站式框架
Sping介绍Sping体系Spring优点方便解耦,简化开发 Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 AOP编程的支持 Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 声明式事务的支持 只需要通过配置就可以完成对事务的管理,而无需手动编程 方便程序的测试 Spring对Junit4支持,可以通过注解方便的测试Spring程序 方便集成各种优秀框架 Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持 降低JavaEE API的使用难度 Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低
IOC和DIIOC inversion of controller控制反转 DI dependency injection依赖注入 区别 IOC 控制反转,是指对象实例化权利由spring容器来管理 DI 依赖注入 在spring创建对象的过程中,对象所依赖的属性通过配置注入对象中。
Bean获取与实例化BeanFactory与ApplicationContext关系和区别BeanFactory采用延迟加载的方案,只有在调用的getBean时才会实例化Bean
ApplicationContext是BeanFactory的子接口,有如下实现类,会在读取xml文件时立即创建Bean对象
ApplicationContext会在配置文件加载时,就会初始化Bean,并且会提供不同的应用层的Context实现,例如web开发种的的WebApplicationContext
bean标签中id和name的区别 id中不能存在特殊符号,name中可以,id符合xml的规范,name是为了更好的扩展 Bean的实例化方式Bean的生命周期instantiate bean对象实例化 populate properties 封装属性 如果Bean实现BeanNameAware执行setBeanName 如果Bean实现BeanFactoryAwar或ApplicationContextAwar设置工厂setBeanFactory或上下文对象setApplicationContext 如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization 如果Bean实现InitializingBean执行afterPropertiesSet 调用自定义的init-method方法 如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization 执行业务处理 如果Bean实现DisposableBean执行destroy 调用自定义的destroy-method
对于bean的生命周期方法: 第三步与第四步是让Bean了解spring容器。 第五步与第八步 可以针对指定的Bean进行功能增强,这时一般会使用动态代理. 第六步与第十步:通过实现指定的接口来完成init与destroy操作 但是在开发中一般不使用第6步与第10步,原因是我们可以使用第7步与第11步来完成。 第7步与第11步的初始化与销毁操作它无耦合,推荐使用的。但是必须在配置文件中指定初始化与销毁的方法 <bean init-method="" destroy-method=""></bean> 总结: 对于bean的生命周期,我们需要关注的主要有两个方法: Bean的作用域在bean标签中有一个scope属性,用于描述bean的作用域 可取值: singleton单例 prototype多例 request用于web开发中,将bean对象通过request.setAttribute()存储到request域中 session用于web开发中,将bean对象通过session.setAttribute()存储到session域中
Bean属性注入spELl表达式spEL表达式的格式 #{表达式} 注解开发引入约束 context 类上注解(一般不加注解后面的value值)
@Component(" ") @Repository(" ") @Service(" ") @Controller(" ")
以上注解一般javaEE三层架构的对象才会使用这些注解 @Scope
prototype singleton request session
属性上注解
方法上注解
注意:对于销毁的方法,只有对单例的对象才有效果,而且需要调用ApplicationContext.close()方法时才能执行
整合JUnit4导入test的jar包 在测试类上添加注解: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") 在web中的应用到与web的jar包 web.xml中配置一个Listener <listener>
<listener-class>org.springframework.context.ContextLoaderListener</listener-class>
</listener>在web.xml中配置applicationContext.xml文件的位置 默认情况下会在WEB-INF目录下查找applicationContext.xml 如果applicationContext.xml文件不是在默认位置,我们可以在web.xml文件中配置 <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>classpath:applicationContext.xml 它代表的是在当前工程的类路径下(可以理解成是在src)下来查找applicationContext.xml文件。 contextConfigLocation它是在listener中声明的一个常量,描述的就是spring配置文件的位置。 //获取ApplicationContext对象
ApplicationContext context = (ApplicationContext) request.getServletContext().getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
AOPOOP面向切面编程 OOD面向对象设计 AOP面向切面编程 日志记录 性能统计 事务处理 安全控制 异常检测
概念 [td] 概念 | 英文 | 解释 | 目标对象 | target | 被增强的对象 | 连接点 | jointpoint | 可能被增强的方法 | 切入点 | pointcut | 被增强的方法 | 通知/增强 | advice | 增加的功能 | 切面 | aspect | 对具体的方法做出的具体的增强 | 代理对象 | proxy | 增强后的对象 | 织入 | weaving | 增强的过程 |
Cglib动态代理 创建Enhancer Enhancer enhance = new Enhancer(); 传递目标对象的Class enhance.setSuperclass(target.getClass()); 设置回调操作,需要实现Callback接口(子接口MethodInterceptor) enhance.setCallback(this); 创建代理对象 enhance.create(); intercept方法 public Object intercept(Object proxy, Method method,Object[] args MethodProxy methodProxy){
return method.invoke(target,args)
}
doRecoveryActions JdbcTemplate连接池及JdbcTemplate配置<!-- Spring内置连接池配置 -->
[Java] 纯文本查看 复制代码 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///springtest"></property>
<property name="username" value="root"></property>
<property name="password" value="1003"></property>
</bean>
<!-- c3p0内置连接池配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql:///springtest"></property>
<property name="user" value="root"></property>
<property name="password" value="1003"></property>
</bean>
<!-- JdbcTemplate配置 -->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>引入外部配置文件<context:property-placeholder location="classpath:ds.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driverClass}"></property>
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
</bean>JdbcTemplate的CRUD
update方法 可以执行insert/update/delete操作 select操作
简单数据类型 QueryForObject(sql,类型.class,参数) 复杂数据类型 单个对象 Object object = QueryForObject(sql,new RowMapper<T>,参数) 多个对象 List<T> list = Query(sql,new RowMapper<T>,参数)
对结果集进行封装 RowMapper的一个实现类BeanPropertyRowMapper 使用前提: 如果使用BeanPropertyRowmapper,实体类必须提供一个无参数的public构造方法,类中的bean属性名称与表中的列要对应 注意:这个类是在spring2.5后提供。
Spring事务管理优点:
提供一致的对于不同的事务管理的API 支持声明式事务管理(重点) 编程事务管理(在开发中应用比较少) 优秀的整合与Spring的数据访问
Spring事务管理的三个接口PlatformTransactionManager事务管理器,可以选择相关的平台 TransactionDefinition定义事务的相关信息,如隔离/传播/超时/只读 TransactionStatus描述事务具体的运行状态
PlatformTransactionManagerAPI
TransactionStatus getTransaction(TransactionDefinitaion definition) throw TransactionException void commit(TransactionStatus) status throw TransactionException void rollback(TransactionStatus) status throw TransactionException
实现类
DataSourceTransactionManager 主要针对于JdbcTemplate开发 MyBatis开发 HibernateTransactionManasger主要针对于Hibernate开发 JpaTransactionManager 主要针对于JPA开发
TransactionDefinition隔离
ISOLATION_DEFUALT 它使用后端数据库的默认隔离级别(spring中选项) ISOLATION_READ_UNCOMMITTED 不能解决问题,会发生脏读 不可重复读 虚读 ISOLATION_READ_COMMITTED 可以解决脏读 会产生不可重复读与虚读。 ISOLATION_REPEATABLE_READ 可以解决脏读,不可重复读 解决不了虚读 ISOLATION_SERIALIZABLE 串行化,可以解决所有问题
传播 常用的有三种
PROPAGATION_REQUIRED 默认值 两个操作处于同一个事务,如果之前没有事务,新建一个事务 PROPAGATION_REQUIRES_NEW两个操作处于不同的事务 PROPAGATION_NESTED它是一种嵌套事务,它是使用SavePoint来实现的。事务回滚时可以回滚到指定的savepoint,注意:它只对DataSourceTransactionManager有作用
以下了解 PROPAGATION_SUPPORTS支持当前事务,如果不存在,就不使用事务 PROPAGATION_MANDATORY 支持当前事务,如果不存在,抛出异常 PROPAGATION_NOT_SUPPORTED 以非事务运行,如果有事务存在,挂起当前事务 PROPAGATION_NEVER 以非事务运行,如果有事务存在,抛出异常
TransactionStatus
|