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