目录
单例模式和多例模式singleton&&prototype
多创建几个对象,看初始化情况,地址是不是一样
初始化只执行一次
属性注入DI
构造方法 constructor-arg name value
set方法property ref
接口注入方法
bean的生命周期你相关注解
PostConstruct==init-method
PreDestroy==destroy-method
XML管理bean 注解完成属性注入
<context:annotation-config>没有扫描的情况下,使用属性注入的注解
proxy.newProxyInstrance(UserDao.getClass().getClassLoader(),UserDao.getClass().getInterface(),this)
@RunWith(SpringJUnit4ClassRunner)
@ContextConfiguration(classpath:applicationContext.xml)
AOP配置
<aop:config>
//需要增强的类和方法
<aop:pointcut expression="execution(*com.itheima.userdao.save(..))" id="pointcut1"/>
//设置切面
<aop:aspect ref="myAspect">
<aop:before method="checkpri" pointcut-ref="pointcut1"/>
</aop:aspect >
</aop:config>
前置通知before
后置通知after-returning获得方法的返回值
环绕通知
public Object around(ProceedingJointPoint joinPoint){
system.out.println("执行前通知");
Object object = joinPoint.proceed();
system.out.println("执行后通知");
return object;
}
异常通知
最终通知
有接口,底层是jdk的动态代理
没有接口,底层是cglib
dbcp BasicDataSource
<bean id="dataSource" class=" org.apache.tomcat.dbcp.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///spring4_day03"/>
<property name="username" value="root"/>
<property name="password" value="123"/>
</bean>
c3p0 ComboPooledDataSource
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql:///spring4_day03"/>
<property name="user" value="root"/>
<property name="password" value="123"/>
</bean>
查询
@Test
public void demo4() {
List<Customer> list = jdbcTemplate.query("select * from account", new MyRowMapper());
for (Customer customer : list) {
System.out.println(customer);
}
}
public class MyRowMapper implements RowMapper<Customer>{
@Override
public Customer mapRow(ResultSet rs, int arwNum) throws SQLException {
Customer customer = new Customer();
customer.setId(rs.getInt("id"));
customer.setName(rs.getString("name"));
customer.setMoney(rs.getDouble("money"));
return customer;
}
}
事务管理
事务的特性
- 原子性:事务不可分割
- 一致性:事务执行前后数据完整性保持一致
- 隔离性:一个事务的执行不应该受到其他事务的干扰
- 持久性:一旦事务结束,数据就持久化到数据库
如果不考虑隔离性引发安全性问题
- 读问题
- 脏读 :一个事务读到另一个事务未提交的数据
- 不可重复读 :一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
- 虚读、幻读 :一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致。
- 写问题
- 丢失更新
解决读问题
- 设置事务的隔离级别
- Read uncommitted :未提交读,任何读问题解决不了。
- Read committed :已提交读,解决脏读,但是不可重复读和虚读有可能发生。
- Repeatable read :重复读,解决脏读和不可重复读,但是虚读有可能发生。
- Serializable :解决所有读问题。
Spring的事务管理的API
- PlatformTransactionManager:平台事务管理器
- 平台事务管理器:接口,是Spring用于管理事务的真正的对象。
- DataSourceTransactionManager :底层使用JDBC管理事务
- HibernateTransactionManager :底层使用Hibernate管理事务
TransactionDefinition :事务定义信息
- 事务定义:用于定义事务的相关的信息,隔离级别、超时信息、传播行为、是否只读
TransactionStatus:事务的状态
- 事务状态:用于记录在事务管理过程中,事务的状态的对象。
事务管理的API的关系:
Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。
Spring的事务的传播行为
Spring的传播行为
- Spring中提供了七种事务的传播行为:
- 保证多个操作在同一个事务中
- PROPAGATION_REQUIRED :默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
- PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
- PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。
- 保证多个操作在同一个事务中
-
- 保证多个操作不在同一个事务中
- PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
- PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。
- PROPAGATION_NEVER :如果A中有事务,报异常。
- 保证多个操作不在同一个事务中
-
- 嵌套式事务
- PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。
- 嵌套式事务
编程式事务管理
声明式事务管理