spring知识点快速浏览

InitializingBean             实现方法          afterPropertiesSet spring工厂给对象初始化的接口
FactoryBean                  实现方法         getObject getObjectType isSingleton
BeanPostProcessor     实现方法          postProcessAfterInitialization 对象生命周期中的初始化之后执行 还有一个before 初始化之前,创建对象调用构造方法之后执行
MethodBeforeAdvice    
MethodInterceptor        实现方法         invoke(MethodInvocation  m)      其中MethodInvocation为原生方法   m.proceed()执行。

 

converter [kənˈvɜːrtər]
类型转换器接口

 

静态代理, 接口,原始类,代理类,导致代理类过多,不利于管理。OrderServiceImpl OrderService OrderServiceProxy
动态代理,动态字节码技术,不需要定义额外的代理类文件,都是JVM运行过程中动态创建的。
动态字节码框架:ASM Javassist Cglib

 

类加载器的作用:
1、通过类加载器把对应类的字节码文件加载进JVM
2、通过类加载器创建类的class对象,从而创建这个类的对象,每一个.class文件,自动分配与之对应的ClassLoader。


jdk动态代理(需要接口),Proxy.newProxyInstance(classLoader,interfaces,invocationhandler)
classloader:借用一个累加器,创建代理对象的class对象,进而可以创建代理对象。
interfaces: userSerivice.getClass().getInterfaces()
invocationhandler:


CGLib动态代理(父子继承关系创建对象):Enhancer .setClassLoader .setSuperClass .setCallback(MethodInterceptor)


基于注解开发
1、原始对象
2、额外功能 @Around
3、切入点 execution(* login(..))
4、组装切面 @Aspect切面类

 

 

 

proxy [ˈprɑːksi]
https://blog.csdn.net/HongYu012/article/details/123819787

 

 

注解实现spring aop
@Aspect
@Around("execution(* login(..))")
(ProceedingJoinPoint joinPoint)
<aop:aspectj-autoproxy />

 

如果需要在类的方法内部调用代理对象的方法,就需要本类实现ApplicationContextAware接口获得工厂,进而获得代理对象,spring会将系统中已经创建好的Apllcaition对象通过set方式注入,本类就可以通过成员变量的方式获取。

 

 

ClassPathXmlApplicationContext   
XmlBeanFactory   DefaultlistableBeanFactory+XmlBeanDefintionReader

 

 

 

 

 

 

spring对事务的开发
1、原始对象
2、额外功能,在之前的传统开发中是通过实现MethodInterceptor来实现额外功能,当我们手动写的时候肯定需要传入连接对象,原始方式执行前设置自动提交为fasle,原始方式执行后如果成功提交,失败回滚。
现在spring自己帮我们来做了这部操作,我们只需要实现创建DataSourceTransactionManager,并注入一个DataSource(有了DataSource我们就可以拿到连接)。
3、切入点, @Transactional 类和方法否可以加上这个注解
4、组装切面:<tx:annotation-driven transaction-manager=""/>

 

 

事务属性(描述事务特征的一系列值):
1、隔离属性
2、传播属性
3、自读属性
4、超时属性
5、异常属性
@Transactional(isloation=,propagation=,readOnly=,timeout=,rollbackFor=,noRollbackFor=,)

 

 

隔离属性的值
1、脏读 读了未提交的数据。 设置Isolation.READ_COMMITTED
2、不可重复读 多次读取同一数据,但是读取结果不一致,导致了数据不一致问题。 设置(行锁)Isolation.REPEATABLE_READ
3、幻影读 多次对整表进行查询统计,但是结果不一样,导致了数据不一致问题。 设置(表锁)Isolation.SERIALIZBALE

 


myql默认隔离属性是REPEATABLE_READ
oracle默认隔离属性是READ_COMMITTED

oracle不支持REPEATABLE_READ隔离属性,采用的是多版本比对的方式来解决,不可重复度。

 

 

 

 

传播属性
指的是一个大的事务中,包含嵌套了若干的小事务。常出现的场景为service层调用service层。


一个有六个传播属性的值和用法,下面只介绍三个常用的

 

 

只读属性(readonly):
针对只进行查询业务操作的业务方法,可以加入自读属性,提运行效率.
默认值为:false

 

 

超时属性(timeout):
应用场景,例T1事务在对一行数据进行插入操作,T2数据创建后要对这行数据进行查询操作。如果T2等待的时间过长,可能会导致连接超时,这时候超时属性就可以用于设置等待的时间。
当前事务访问数据时,有可能访问的数据被别的事务进行加锁的处理,那本事务就必须进入等待。
等待时间 秒
用例: @Transactional(timeout=2)
超时属性的默认值 -1:最终由对应的数据库来指定

 


异常属性(rollbackFor,noRollbacFor)
spring对事务的处理过程中
默认 对RuntimeException及其子类采用的是回滚的策略
默认 对Exception及其子类采用的是提交的策略
想要修改可以通过rollbackFor,noRollbacFor的属性值来修改
用例:@Transactional(rollbackFor={java.lang.Exception.class},noRollbackFor={java.lang.RuntimeException.class}) 这样子修改和默认方式就对调了
建议:实战时使用spring的默认异常属性

 

 

 

注解开发

 

 


注解开发的优点:
替换接口,实现调用双方的契约性。
传统开发过程中,对于开发者和调用者之间会使用接口的方式,达成约定,进而完成功能的调用。但是接口调用的当时可能会很繁琐,而且接口实现类在只需要实现
接口的某个方法的时候,也会出现需要实现全部方法,而出现的不便利的行为,一般这个时候会使用适配器的方式解决,但是也会比较繁琐(jdk8以后出现了default)
使用注解的时候会更加便利,spring会扫描接口,也达到了功能调用者和功能提供者之间达成约定的目的,而且更加灵活,方法名可以自定义。

 

 

@Componen注解等同于<bean>标签
其下的衍生注解@Controller 、@Service、@Repository的功能也是一样的,更精准的表达一个类型的作用
注意:Spring整合Mybatis开发过程中,不使用@Repository和@Component

 

@Autowired注解放置位置,
1、放置在对应成员变量的set方法上
2、直接把这个注解放置在成员变量上,Spring通过反射直接对成员变量进行注入(赋值)。

 

@Value注解不能作用在静态的成员变量上

 

posted @ 2022-04-19 20:45  宋songsong  阅读(25)  评论(0编辑  收藏  举报