Spring简单入门

目录

单例模式和多例模式singleton&&prototype

属性注入DI

AOP配置


单例模式和多例模式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;
		}
		
	}

事务管理

事务的特性

  1. 原子性:事务不可分割
  2. 一致性:事务执行前后数据完整性保持一致
  3. 隔离性:一个事务的执行不应该受到其他事务的干扰
  4. 持久性:一旦事务结束,数据就持久化到数据库

如果不考虑隔离性引发安全性问题

  1. 读问题
    1. 脏读 :一个事务读到另一个事务未提交的数据
    2. 不可重复读 :一个事务读到另一个事务已经提交的update的数据,导致一个事务中多次查询结果不一致
    3. 虚读、幻读 :一个事务读到另一个事务已经提交的insert的数据,导致一个事务中多次查询结果不一致。
  2. 写问题
    1. 丢失更新

解决读问题

  1. 设置事务的隔离级别
    1. Read uncommitted :未提交读,任何读问题解决不了。
    2. Read committed :已提交读,解决脏读,但是不可重复读和虚读有可能发生。
    3. Repeatable read :重复读,解决脏读和不可重复读,但是虚读有可能发生。
    4. Serializable :解决所有读问题。

Spring的事务管理的API

  1. PlatformTransactionManager平台事务管理器
  2. 平台事务管理器:接口,是Spring用于管理事务的真正的对象。
    1. DataSourceTransactionManager :底层使用JDBC管理事务
    2. HibernateTransactionManager :底层使用Hibernate管理事务

TransactionDefinition :事务定义信息

  1. 事务定义:用于定义事务的相关的信息,隔离级别、超时信息、传播行为、是否只读

TransactionStatus事务的状态

  1. 事务状态:用于记录在事务管理过程中,事务的状态的对象。

事务管理的API的关系:

Spring进行事务管理的时候,首先平台事务管理器根据事务定义信息进行事务的管理,在事务管理过程中,产生各种状态,将这些状态的信息记录到事务状态的对象中。

Spring的事务的传播行为

Spring的传播行为

  1. Spring中提供了七种事务的传播行为:
    1. 保证多个操作在同一个事务中
      1. PROPAGATION_REQUIRED :默认值,如果A中有事务,使用A中的事务,如果A没有,创建一个新的事务,将操作包含进来
      2. PROPAGATION_SUPPORTS :支持事务,如果A中有事务,使用A中的事务。如果A没有事务,不使用事务。
      3. PROPAGATION_MANDATORY :如果A中有事务,使用A中的事务。如果A没有事务,抛出异常。

 

    1. 保证多个操作不在同一个事务中
      1. PROPAGATION_REQUIRES_NEW :如果A中有事务,将A的事务挂起(暂停),创建新事务,只包含自身操作。如果A中没有事务,创建一个新事务,包含自身操作。
      2. PROPAGATION_NOT_SUPPORTED :如果A中有事务,将A的事务挂起。不使用事务管理。
      3. PROPAGATION_NEVER :如果A中有事务,报异常。

 

    1. 嵌套式事务
      1. PROPAGATION_NESTED :嵌套事务,如果A中有事务,按照A的事务执行,执行完成后,设置一个保存点,执行B中的操作,如果没有异常,执行通过,如果有异常,可以选择回滚到最初始位置,也可以回滚到保存点。

编程式事务管理

声明式事务管理

 

猜你喜欢

转载自blog.csdn.net/TangXiaoPang/article/details/86775495