浅谈Spring

IOC

控制反转是指将对象的创建与生命周期维护交给程序而不是代码。例如Bean的创建交给SPring,创建后统一放入Bean容器中储存,用到的时候由Spring提供。

AOP

AOP(面向切面编程)的实现机制就是基于动态代理的。当Spring初始化时,如果识别到有切面配置的Bean,则会为其类创建代理对象并放入Bean仓库,在之后通过AutoWired在其他类中引用时,实际上引用的是Bean仓库中的代理对象。

动态代理是一种更为方便的代理方式,即不针对特定类的代理方式。它通过反射机制获取到要代理的类的变量以及方法,同时生成了一个代理对象(实现了InvocationHandler),通过这个代理对象可以访问要代理类的变量以及方法。此时,我们可以对这个代理对象的invoke方法进行定制:

 @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
        //调用方法之前,我们可以添加自己的操作
        System.out.println("before method " + method.getName());
        Object result = method.invoke(target, args);
        //调用方法之后,我们同样可以添加自己的操作
        System.out.println("after method " + method.getName());
        return result;
    }

反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。

生命周期

        - 实例化Bean,利用Bean的信息反射出Bean实例

        - 属性填充,依赖注入(标有Autowired的Bean会在此时完成依赖注入,循环依赖也是在此刻发生的)

        - 初始化Bean,调用Aware接口,再调用初始化接口以及POSTConstruct方法。

循环依赖

Bean的循环依赖是由三级缓存解决的。每个Bean创建时都会先将ObjectFactory先存入三级缓存,如果该Bean被别人依赖了,则会调用ObjectFactory的方法创建出实例和AOP动态代理对象存入二级缓存。然后一级缓存是用来存储完全初始化完成的Bean对象。

只用二级缓存也能解决循环依赖,只用将每个Bean创建时都将实例一级AOP动态代理对象直接存入二级缓存,并暴露给其他Bean引用。但是这个与我们一般Bean的生命周期相违背,我们还是希望动态代理在初始化时再创建,而不是实例化的时候创建。

事务

- Spring中一般我们采用@Transaction注解来实现事务的控制。

- 此注解只能用来修饰public的方法,或者类中(只对类中的所有public方法生效)

- 可以通过Propogation来设置事务的传播行为,常见的有:

        - Required:如果有事务则继承该事务,如果没有事务则创建新事务

        - Required_New: 不管当前有无事务,强制新建一个独立事务

        - Nested: 如果当前存在事务,则创建一个依赖于父事务的子事务,随父事务提交一起提交。但是不同的是可以独立回滚。

失效场景:

- 还需要注意的是Spring的事务注解中,默认只会回滚运行时异常与Error。像一些检查型异常,例如IOException,SqlException等等则不会回滚,如果希望这些异常也会滚,可以在注解中添加rollbackFor字段,或者在try-catch中抛出运行时异常。

- 在同一个类中两个方法调用会导致事务失效,因为事务的机制是通过AOP动态代理来实现的,如果直接调用同类中的另外一个方法不会走动态代理。只有通过自我注入或者拿到当前类的代理对象再调用方法时事务才会生效。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值