spring面经

Spring AOP

aop代理模式分两种

  • 静态代理
    以Aspect aop为代表,其原理是在编译时期,将aspect切面加入到程序字节码文件中,直接修改字节码的内容
  • 动态代理,不直接修改字节码的内容,而是生成一个代理对象,此对象包含目标的所有方法,通过代理对象调用目标方法时,就会走代理对象内的方法,完成切面,动态代理又分两种
    1. jdk动态代理
      只能代理接口,代理类需要通过实现InvocationHandler接口,重写其中的invoke方法实现

    2. cglib代理
      若代理类没能实现InvocationHandler 接口,spring就使用cglib代理,该代理类通过继承目标类实现,若目标类修饰为final,则无法使用cglib代理

//1. jdk动态代理
//吃的接口类
public interface Eat {
     void eat();
}
//吃的实现类
public class EatImpl implements Eat {
    @Override
    public void eat() {
        System.out.println("吃饭啦");
    }

    public static void main(String[] args) {

    }
}
//吃的代理类
public class EatProxy implements InvocationHandler {
   public Object eatimpl;
   
    public EatProxy(Object eatimpl) {
        this.eatimpl = eatimpl;
    }
    
    public EatProxy() {
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("准备吃饭");
        Object invoke = method.invoke(eatimpl, args);
        System.out.println("我吃完啦");
        return invoke;
    }

    public static void main(String[] args) {
        //创建吃的实现类
        Eat eat = new EatImpl();
        //交给代理类来执行,吃接口类的吃方法
        EatProxy eatProxy = new EatProxy(eat);
        //通过  生成eat的代理类
        Eat instance =(Eat)Proxy.newProxyInstance(Eat.class.getClassLoader(), eat.getClass().getInterfaces(), eatProxy);
        instance.eat();
    }
}

//打印结果
准备吃饭
吃饭啦
我吃完啦

Spring IOC

IOC概念 : 控制反转,控制指对象的控制权,反转指我们不再负责对象的控制,而是将对象的控制权交给spring容器去处理

  • 优点 :

    1. 不用自己管理对象,降低耦合性,省掉很多麻烦
    2. 最直观的能降低代码量
  • 实现原理 : 利用工厂模式beanFactory及反射,最简单的反射例子

 EatImpl o = (EatImpl)Class.forName("poyimima.algorithm.EatImpl").newInstance();
    o.eat();

依赖注入概念 :

它是控制反转的实现方式,因为应用程序不负责对象的创建及维护,当需要对象时,就向spring容器请求,由spring通过以下n种方式将实例对象注入到应用程序中(注意 依赖注入和装配的关系要搞明白,依赖注入的本质就是装配,装配就是依赖注入的行为,这两者原来总搞混)

  • 注入的几种方式
    1. Setter方式注入 bean之间的依赖关系要确定好,这样容器可以根据bean标签中的property标签将实例bean注入到类的成员变量中去
    2. 构造器方法注入 跟setter方法类似,构造器,就是给成员变量赋值的,容器可以通过bean标签中的constructer将实例bean注入到类的成员变量中去

spring beans概念 :

由spring托管的对象
bean的生命周期

spring启动后先实例化bean->填充属性,装配->

  • 若bean实现啦BeanNameAware接口,spring会将配置的id通过setBeanName()赋值给bean的BeanName属性
  • 若bean实现啦BeanFactoryAware接口,spring会将容器的工厂类通过setBeanFactory()赋值给bean的BeanFactory属性
  • 如果bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()方法,将bean所在的应用上下文(也是个工厂类,比BeanFactory更加强大)的引用传入进来
  • 若bean实现啦很多接口,spring会自动调用这些接口里重写的方法 生命周期
bean的作用域
  • singleton 单例模式
  • prototype 在容器里可以有多个实例
  • request 每次http请求都会生成一个bean
  • session
  • global session
bean的自动装配

什么叫做装配?
当我们向spring容器请求返回某个对象时,容器需要本身有这个bean,这个bean怎么来?就是要通过装配,1个bean类可能有n多个bean,可以手动指定,也可以自动装配

自动装配概念 由spring通过bean间配置的依赖关系,自动完成bean间的组装,生成实例bean对象

  • xml装配方式
    1. 不使用自动装配,手动装配,由ref标签指定
    2. byName spring会先去查找该bean类内所需的成员变量,之后再根据成员变量的名字,在srping容器内查找注册的bean(成员变量的名字==容器的id),然后将其装配进该bean中
    3. byType spring会先去查找该bean类内所需的成员变量,之后再根据成员变量的类型在srping容器内查找注册的bean,然后将其装配进该bean中
    4. 构造器装配
  • 注解装配
    使用@autowired标注(成员变量,构造方法)默认使用byType的形式,spring容器会根据标注变量的名字自动去查找对应的bean实例,若没找到,就会报错
    使用@Resource标注,默认使用byName的形式,spring容器会会根据标注变量的类型自动去查找对应的bean实例,若没找到,就会报错

spring事务隔离级别

  • 共5种,第一种默认与数据库设置的隔离级别一致,其他的读未提交,读已提交等隔离级别跟数据库隔离级别一样 数据库隔离级别传送门

spring事务传播行为

泛指两个事务朝上,一个事务调用另一个事务发生

  • propagation_REQUIRED 若当前没有事务,创建新事务,若当前有事务,则加入到当前事务
  • propagation_new_REQUIRED 若不管当前是否有事务,都新创建新事务
  • propagation_supports 支持当前事务,若当前有事务,加入该事务,否则按照非事务执行
  • propagation_mandatory(托管) 支持当前事务,若当前有事务,加入当前事务,否则就抛异常
  • propagation_not_supports 以非事务执行,当前有事务的话,就挂起
  • propagation_never 不支持事务,若当前有事务就报错
  • PROPAGATION_NESTED 若当前有事务,嵌套进该事务执行,否则就按照REQUIRED执行

spring五大通知类型

标注在切面类的方法上 使用方法

  1. 前置通知@Before 目标方法执行前执行该注解
  2. 后置通知@After 目标方法执行后执行该,无论方法是否抛异常
  3. 返回通知@After-returning 目标方法正常执行后执行该通知方法
  4. 异常通知@After-throwing 目标方法异常执行后执行该通知方法
  5. 环绕通知@Around 更加强劲的通知
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值