Spring 相关
Autowired 和Resource 的区别Autowired只适用于spring框架而Resource 是java官方注解其他框架也能用自动匹配顺序不同Autowired先按类型找且必须加Qualifier而Resource先按名称找名称匹配不到再按类型匹配且无需额外属性那为什么官方更推荐构造器注入呢构造器的优点强制不可变杜绝空指针/便于单元测试/遵循单一职责/提前暴露循环依赖实际用的少的原因CRUD业务无感知写法繁琐开发便捷性差Spring AOP面向切面编程用于将与业务无关的横切关注点如日志事务安全权限等抽取出来封装成切面。通过在不修改原有代码的情况下将通用功能动态织入多个方法执行的特定位置实现代码解耦和复用AOP是怎么实现的动态代理和静态代理有何区别AOP主要是通过代理机制实现的。动态代理是指运行时由JVM生成代理类如JDK动态代理或GGLIB(默认使用)适用于Spring AOP;静态代理则在编译时或类加载期由工具修改字节码完成织入AOP有哪些主要组成部分AOP的主要组成部分包括切面Aspect、连接点Join Point、通知Advice、切入点Pointcut和织入Weaving。切面封装横切逻辑连接点是程序执行的特定位置通知是切面在连接点执行的动作切入点定义匹配哪些连接点织入是将切面应用到目标对象的过程。Spring AOP和AspectJ有什么区别Spring AOP是基于动态代理的轻量级实现仅支持方法级别的织入使用简单集成方便AspectJ是功能更强大的AOP框架支持字段、构造器、初始化等多粒度织入可在编译期织入性能更好但配置复杂需要专用编译器或织入器Spring事务Spring支持事务的方式主要有两种编程式事务和声明式事务前者很少使用后者实际上是通过AOP实现的基于Transactional的全注解使用最多Spring事务会在什么情况下失效spring的事务主要靠AOP代理的凡是绕过代理或代理机制本身搞不定的情况事务就会失效多线程环境因为Transactional是基于ThreadLocal存储上下文的在多线程情况下每个线程都有自己的上下文所以无法保持事务同步try catch捕获异常了但没有抛出因此事务以为没报错正常提交不会回滚同一个类里面方法调用因为事务是基于动态调用实现的同类的方法调用不会走代理Transactional应用在final和static方法上Transactional应用在非public修饰的方法上propagation 传播机制配置错误可能是新起事务了rollbackFor没设置Spring事务默认只回滚运行时异常(RuntimeException)和系统异常Error而抛出受检异常比如IOException它不回滚必须手动rollbackForException.class才会全部回滚为什么Spring循环依赖需要三级缓存二级不够吗二级缓存能够解决循环依赖问题三级则是通过存储一个工厂实现延迟加载只有真正发生循环依赖的时候才触发代理创建没有循环依赖则这个工厂不会被调用相当于是提前暴露提前判断延迟加载所以引入了三级不是为了解决循环依赖而是在解决的同时兼容AOP代理三级缓存中存放的是什么它的作用是什么一个能够创建早期Bean引用的工厂对象。当Bean实例化完成之后先把这个工厂放到三级缓存而不立即产生代理是根据后续是否出现循环依赖来触发工厂这时候工厂才会把这个Bean代理的对象给别的用如果只用二级缓存解决循环依赖会有什么问题如果仅使用二级那么会导致所有涉及AOP的Bean都在生命周期早期就被代理打破了Spring规定的必须在初始后创建的流程SpringBean的生命周期生命周期大致分为实例化-属性赋值-初始化-就绪-销毁。扩展点在Aware接口回调(在属性赋值后)以及在初始化前后的BeanPostProcessor实现Aware接口Bean就能在生命周期早期获取名字工厂容器上下文BeanPostProcessor前置处理可修改Bean而后置处理使得AOP代理在此生成替换了原BeanBean的初始化方法有哪些可以 使用PostConstruct注解或者通过initialzingBean接口重写afterProspretisSest()方法也可以在Bean注解中指定initMethod属性来定义初始方法三者可以同时存在按此顺序依次执行