spring的一些基础知识回顾(二)

1.spel(动态生成)
#{}可以是别的bean,可以是别的bean属性,可以是方法(动态为属性赋值),可以是正则(matches),可以有运算符(+-*/^ )比较运算符(>,<,>=,<=,==)逻辑运算符(and,or,not,|,?:),可以 T(). 方式静态方法属性调用。




2.spring容器对bean中声明了init-method和destroy-method的方法在初始化和销毁时进行调用,可以在配置文件中配置或者注解。在注解开发使用
@PostConstruct和@PreDestroy


除了定义上述2个方法外,spring还提供了一个接口可以实现bean在init的前后添加自己的逻辑BeanPostProcessor
public class BeanPostPrcessorImpl implements BeanPostProcessor { 
    // Bean 实例化之前进行的处理
    public Object postProcessBeforeInitialization(Object bean, String beanName)
           throws BeansException {
       System.out.println("对象" + beanName + "开始实例化");
       return bean;
    }
 
    // Bean 实例化之后进行的处理
    public Object postProcessAfterInitialization(Object bean, String beanName)
           throws BeansException {
       System.out.println("对象" + beanName + "实例化完成");
       return bean;
    }

这2个接口方法返回bean用户可以自定义实现偷梁换柱
只要将这个BeanPostProcessor接口的实现定义到容器中就可以了,容器在加载它的时候回特殊处理(applicationcontext可以,而beanfactory则需要另外的方式),如下所示:
<bean class="com.spring.test.di.BeanPostPrcessorImpl"/>


3.除了xml配置bean,注解,java类,groovy配置




4.xml中配置bean除了直接配置类还可以使用静态工厂和实例工厂创建bean(用的少),spring还提供了一个接口FactoryBean,这样配置到
xml文件后容器发现这个bean实现了FactoryBean会自动调用生成bean的方法。


5.跨域引用使用<aop:scoped-proxy/>。需要引入CGLib的jar包。


6.在使用注解方式加载bean用<context:component-scan base-package="包1,包2">可以使用context:include-filter现在只需要哪些包和context:exclude-filter排除哪些包。


7.泛型依赖注入:只需要在父类中建立好依赖注入的泛型,子类会根据在显示的时候创建的T对应的替换类型自动建立子类之间的依赖关系。


8.aop术语:切面,通知,目标,代理。
连接点:程序执行到程序的某个位置,相当于方法执行前后者执行后
切点:相当于一个连接点的查询条件,一个切点对应多个连接点。
可以使用@order(权值)指定优先级
重用切点表达式:写一个空方法写上切入表达式,其他方法都是用这个方法作为切入点


9.jdbcTemplate和NamedParameterJdbcTemplate简化常规JDBC操作,模板方法操作。NamedParameterJdbcTemplate可以根据根据实体属性与数据库字段进行名称相同的映射,这样在插入和获取时取出数据时已经做了相应的转化。


10.事务(传播性,隔离性,异常是否回滚,只读,超时)
jdbc有DataSourceTransactionManger(mybatis也使用这个)
javaEE代码事务有JtaTransactionManger
hibernate有HibernateTransactionManger


以前普通java实现jdbc事务使用的是try...catch方式在不同的地方提交事务、回滚事务关闭连接等,针对切面来说也就是可以针对
不同的方法在不同的地方实现一个切面编程的模型,使用spring的AOP技术可以实现这种模式变得简单。


编程式事务和声明式事务
注解式声明式事务:xml配置数据源和事务以及<tx:annotation-driven transcation-manger="事务引用"/>,在需要事务的方法上加上transactional


编程式事务提供了事务模板(比较麻烦)


异常继承runtimeException


事务传播性:
require 底层方法将使用上层方法的事务(默认的传播行为) @Transactional(propagation=Propagation.REQUIRES)
require_new 底层方法使用自己的事务,成功自己可以提交   @Transactional(propagation=Propagation.REQUIRES_NEW)


Propagation :  key属性确定代理应该给哪个方法增加事务行为。这样的属性最重要的部份是传播行为。有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。




事务的隔离级别:
isolation指定,常用READ_COMMITTED
ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
      另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
      这种隔离级别会产生脏读,不可重复读和幻像读。
ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
      它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
      除了防止脏读,不可重复读外,还避免了幻像读。


异常是否回滚(默认有异常就回滚)


readonly 指定事务为只读事务,帮助数据库优化


timeout 指定强制回滚之前事务可以占用的时间,如果时间超过则事务自动回滚。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值