范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring面试中常见问题总结

  1. IOC和AOP
  首先英文缩写记清楚,不要念错(1). IOC
  IOC(Inversion of Control),从字面上理解就是==控制反转==,将对在自身对象中的一个内置对象的控制权反转。所谓的反转,即==把内置对象的控制权反转给一个容器==,而应用程序只需要提供对象的类型即可。IOC是面向对象编程的一种设计原则.可以用来==降低代码之间的耦合==.大致含义就是在代码中需要使用一个对象时,并不是立即new一个对象出来,而是从一个调控系统内所有对象的外界实体,也就是容器中将这个对象的一个实体传递到调用处接收的位置.对象的实体在容器加载时就已经被创建.而且对象的创建与当前代码的运行解耦合了.
  ==依赖注入==(Dependency Injection,即DI),容器中的对象所需要的依赖来自于配置文件(xml)中的配置,也就是由容器去完成依赖项的添加.就是==在xml文件中配置好类的属性==.Spring中需要依赖项属性的set和get方法.Spring的IOC有三种注入方式 :构造器注入、setter方法注入、根据注解注入。
  ==依赖查找==(Dependency Lookup,即DL),是指在容器中对象的类中,手动将依赖项从容器中取出,设置依赖项.实际项目中使用容器对象(@Autowired不是依赖查找,而是通过扫描注解,在容器内部进行依赖的注入,没有手动配置罢了)进行依赖项的查找.(2). AOP
  AOP(Aspect Oriented Programming),意为==面向切面编程==.是通过预编译和运行时动态代理的方式==实现程序功能的统一维护==的技术(何为维护参考事务).中文的这种翻译带有略微的一些误导性,切面主要是指将程序维护代码中先行执行部分和后续执行部分之间插入用户代码的位置,就像在一个方法中切入一个过程一样.
  AOP可以在不修改源代码的情况下,通过预编译和运行期动态代理实现给程序统一添加功能.
  利用AOP还可以对业务逻辑的各个部分(将日志,性能统计,事务处理等等功能提取出来)进行隔离,降低耦合度.
  ==Spring的AOP通过动态代理实现==,底层实现使用JDK代理(只提供接口的代理,不支持类的代理)或者Cglib(生成指定类的一个子类对象)实现.主要思想就是通过==获取实例对象的动态代理对象==(代理是指代理对象内部有实例对象作为成员变量,代理对象可以调用实例变量的方法),==在代理对象中对实例对象的方法再次进行封装==,但封装的内部会==在调用前后进行一些逻辑上的处理==,如开启关闭事务,打印日志等等.
  Spring的AOP通过动态代理实现,底层实现使用JDK代理(只提供接口的代理,不支持类的代理)或者Cglib(生成指定类的一个子类对象)实现( JDK 本身只提供接口的代理,而不支持类的代理;而 CGLib 很好的弥补了这点,它通过创建子类,在子类中拦截父类的方法并织入横切逻辑,实现对类的代理,但是其不能对目标类中的 final 或 private 方法进行代理,因为被 final 或 private 修饰的方法不能被继承。
  实际上我们调用的是代理对象的方法.在其内部做了处理后又调用了原来实例对象的方法.1). 概念解释切面(Aspect):就是被抽取出来的公共逻辑连接点(JoinPoint):指通知方法执行的位置通知(Advice):就是在某个连接点上添加的统一功能.前置通知、返回通知、后置通知、异常通知、环绕通知切入点(PointCut):要拦截进行切入的方法,使用切入点表达式或者注解标记声明目标对象(TargetObject):被代理的对象织入(Weaving):在代理对象中给目标对象的方法中的连接点处添加增强,创建该代理对象(spring在运行是完成织入,也就是动态代理,在使用对象时在内存中"临时"生成AOP动态代理类)2). JDK 代理代码实现/**      * 生成代理类对象      */ public static Service createService(){     // 目标类     Service service = new ServiceImpl();     //切面类     MyAspect myAspect = new MyAspect();          /* 代理类          * Proxy.newProxyInstance          *      参数1:loader ,类加载器,动态代理类 运行时创建,任何类都需要类加载器将其加载到内存。          *          一般情况:当前类.class.getClassLoader();          *              目标类实例.getClass().get...          *      参数2:Class[] interfaces 代理类需要实现的所有接口          *              方式1:目标类实例.getClass().getInterfaces()  ;          *                          注意:只能获得自己接口,不能获得父元素接口          *              方式2:new Class[]{UserService.class}          *              例如:jdbc 驱动  --> DriverManager  获得接口 Connection          *      参数3:InvocationHandler  处理类,接口,必须进行实现类,一般采用匿名内部          *          提供 invoke 方法,代理类的每一个方法执行时,都将调用一次invoke          *              参数31:Object proxy :代理对象          *              参数32:Method method : 代理对象当前执行的方法的描述对象(反射)          *                  执行方法名:method.getName()          *                  执行方法:method.invoke(对象,实际参数)          *              参数33:Object[] args :方法实际参数          */     Service proxy = (Service) Proxy.newProxyInstance(         MyBeanFactory.class.getClassLoader(),// 本类的类加载器         service.getClass().getInterfaces(),// 本类的接口数组         new InvocationHandler() {// 处理类:一个InvocationHandler接口对象,内部实现切入点等等细节             @Override             // proxy代理对象,没用到             // method执行的方法,在内部通过反射执行             // args方法参数             public Object invoke(Object proxy, Method method, Object[] args)                  throws Throwable {                 //前执行                 myAspect.before();                  //执行目标方法,需要传入目标类                 Object obj = method.invoke(service, args);                  //后执行                 myAspect.after();                  return obj;             }         });      return proxy; }  2. BeanFactory和ApplicationContext
  都可以做Spring的容器,其中ApplicationContext是BeanFactory的子接口.
  BeanFactory实现的功能:读取bean配置文档管理bean的加载,实例化,控制bean的生命周期维护bean之间的依赖关系
  ApplicationContext在BeanFactory的基础上还提供了更完整的框架功能:支持国际化统一的资源文件访问格式监听器同时加载多个配置文件,分层
  ==BeanFactroy采用的是延迟加载形式来注入Bean的==,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。
  ==ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。==3. Spring Bean的生命周期(1). ==实例化Bean==
  对于BeanFactory,当客户端请求一个未被初始化的bean时,容器获取对象中的信息,进行实例化
  对于ApplicationContext,容器一启动,就获取所有对象的信息,进行初始化(2). 设置对象属性(==依赖注入==)
  实例化完成后的对象被封装在BeanWrapper(BeanWrapperImpl在内部使用Spring的BeanUtils工具类对Bean进行反射操作,设置属性。)中,根据配置的信息,进行依赖的填充.(3). ==处理Aware接口==
  Spring检查该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,此处传递的就是Spring配置文件中Bean的id值;如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;
  所以BeanNameAware接口是为了让自身Bean能够感知到,获取到自身在Spring容器中的id属性。
  同理,其他的==Aware接口也是为了能够感知到自身的一些属性==。
  比如实现了ApplicationContextAware接口的类,能够获取到ApplicationContext,实现了BeanFactoryAware接口的类,能够获取到BeanFactory对象。(4). BeanPostProcessor接口的before处理
  调用BeanPostProcessor接口实现的postProcess==Before==Initialization(Object bean, String beanName)方法,进行一些==初始化前的前置处理==.
  这个方法传入bean对象和其名字.并将返回的对象设置为bean.
  可以用于进行原对象和代理对象的替换,修改bean的属性等功能的实现.(5). InitializingBean
  ==初始化时会附加进行的操作==
  如果bean实现了 InitializingBean 接口,会调用 void afterPropertiesSet() 方法进行初始化(6). init-method
  bean在Spring配置文件中配置了init-method属性,则会自动调用其配置的初始化方法
  如果同时实现了,那么先进行接口方法的调用,在进行配置文件中指定方法的调用(6). BeanPostProcessor接口
  调用BeanPostProcessor接口实现的postProcess==After==Initialization(Object bean, String beanName)方法,进行一些初始化前的==后置处理==.
  与(4)对应.
  到这里bean就已经被正确的创建了.(7). DisposableBean
  ==清理bean时会附加进行的操作.==
  当bean不再被需要的时候,会经历清理阶段.
  如果bean实现了DisposableBean这个接口,会调用其实现的void destroy()方法(8). destroy-method
  同样,在对象销毁有一个参数配置destroy-method,和init-method相同,在调用销毁的时候,先执行 DisposableBean的destroy方法,后执行 destroy-method声明的方法。4. spring支持的bean的作用域(1). singleton
  默认,单例模式
  一般的开发中,并不会在bean中加入可变的成员变量,所以即使单例模式下没有进行任何的多线程同步处理,也是线程安全的,但要明白原因.(2). prototype
  多例模式,只要请求bean,就生成一个实例(3). request
  为每个请求生成不同的实例(4). session
  为每个会话生成不同的实例(5). global-session
  global session作用域类似于标准的HTTP Session作用域,不过它仅仅==在基于portlet的web应用中才有意义==。Portlet规范定义了全局Session的概念,它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。
  portlet类似servlet,是另一套解决方案5. spring如何处理线程并发问题
  在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。
  Spring 中的 一些bean, 如 RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder 等非线程安全的"状态性对象"采用ThreadLocal进行封装,让他们也称为线程安全的"状态性对象",因此有状态的bean就能够以singleton的方式在多线程环境中正常工作。
  Spring中DAO和Service都是以单实例的bean形式存在,Spring通过ThreadLocal类将有状态的变量(例如数据库连接Connection)本地线程化,从而做到多线程状况下的安全。6. spring注入bean的几种方式(1). 基于xml文件set方法注入(property标签,name属性是字段名,ref是依赖项在容器中的name)     构造器注入(1.通过index设置参数位置,2.通过type设置类型)     静态工厂注入工厂方法是静态的 实例工厂工厂类需要将工厂控制反转给容器,并且容器中的方法不是静态的  (2). 自动装配1). spring的自动装配no:不进行自动装配,使用ref进行装配beanbyName:使用bean的名称进行自动装配(一个bean的property与其他bean的name进行匹配)byType:通过参数的数据类型记性匹配constructor:利用构造函数进行装配,其中构造函数使用byType进行装配autodetect:自动探测,先判断有无构造函数,否则使用byType进行装配2). 基于注解
  使用@AutoWire配置自动装载模式.
  容器会自动装载一个后置处理器,当扫描到@AutoWire,@Resource或者@Inject时,就会在IoC容器查询需要的bean.
  首先根据类型进行查找,如果匹配到多个对象,使用名称进行查找.如果没有匹配到对象,会抛异常.解决方法:设置属性required=false(允许不被装配)。@Autowired可用于:构造函数、成员变量、Setter方法
  注:@Autowired和@Resource之间的区别
  (1) @Autowired默认是按照==类型==装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)。
  (2) @Resource默认是按照==名称==来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。7. spring使用的设计模式工厂模式:BeanFactory创建类的实例单例模式:默认情况下,bean都是单例的代理模式:AOP的实现使用了JDK的动态代理和CGLIB字节码生成技术模板方法:事务,AOP等等观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现--ApplicationListener。8. spring事务实现方式和原理
  spring事务的本质就是数据库事务,就是调用连接对象的相关方法进行回滚和读取保存点.
  spring根据注解扫描和xml文件中的配置,为指定的方法生成代理类,使用AOP进行事务开启,回滚和提交等操作的统一进行.
  实际上是调用数据库本身的事务功能.(1). sprint事务种类1). 编程式事务
  配置TransactionTemplate, 需要注入TransactionManager                            
  将TransactionTemplate注入到业务层方法中,并使用public class ProTransExample {     @Resource(name = "transactionTemplate")     private TransactionTemplate transactionTemplate;      @Resource(name = "jdbcTemplate")     private JdbcTemplate jdbcTemplate;      @Test     public void save() {         /**          * 说明:          *  如果你的方法需要返回值请使用这个类          *      new TransactionCallback()          *          *  如果你的方法不需要返回值那么使用下面这个例子就可以了          *      new TransactionCallbackWithoutResult()          */         transactionTemplate.execute(new TransactionCallbackWithoutResult(){           @Override           protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {                 String sql = "insert into books(isbn,name,price,pubdate) values(?,?,?,?)";                 jdbcTemplate.update(sql,"20-166-890-China","阿甘正传",99.00,new Date());           }         });     } }2). 声明式事务
  两种方法:在xml文件中配置切入点表达式(按照报名,类名,方法名,参数筛选出方法集合)和通知使用@Transactional注解进行(2). spring事务传播行为PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,==如果当前存在事务,就加入该事务==,该设置是最常用的设置。PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,==如果当前不存在事务,就以非事务执行==。PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,==如果当前不存在事务,就抛出异常==。PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都==创建新事务==。PROPAGATION_NOT_SUPPORTED:==以非事务方式执行操作==,如果当前存在事务,就把==当前事务挂起==。PROPAGATION_NEVER:以非事务方式执行,==如果当前存在事务,则抛出异常==。PROPAGATION_NESTED:如果当前存在事务,则在==嵌套事务==内执行。如果当前没有事务,则按REQUIRED属性执行。(3). spring中的事务隔离级别ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,==使用数据库默认的事务隔离级别==。ISOLATION_READ_UNCOMMITTED:==读未提交==,允许另外一个事务可以看到这个事务未提交的数据。ISOLATION_READ_COMMITTED:==读已提交==,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。ISOLATION_REPEATABLE_READ:==可重复读==,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。ISOLATION_SERIALIZABLE:==串行化==,一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。9. spring事件在谈Spring的事件监听之前,让我们先了解一下Spring容器,什么是ApplicationContext ?
  它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些。
  ApplicationContext则是应用的容器。
  Spring把Bean(object)放在容器中,需要用就通过get方法取出来。
  此接口提供给Spring应用配置的能力,当应用启动时,此接口的实现是只读的,但是如果该实现支持,其内容也是可以重新载入的。
  学习更多JAVA知识与技巧,关注与私信博主(学习)
抖音与摩登天空达成音乐版权合作,将联合孵化优质内容近日,抖音与原创音乐唱片公司摩登天空达成合作,双方将从音乐版权音乐内容联合孵化等多个维度展开探索。此次合作,双方将联动线上和线下,充分发挥各自的优势,共同推动中国原创音乐的发展。达苹果11到底哪里好,还在官网上挂着首先是苹果11采用A13仿生,6核中央处理器,具有2个性能核心和4个能效核心,4核图形处理器,8核神经网络引擎。这是一款公认吊打隔壁家的处理器,19年到现在还能战斗,毫不逊色隔壁家农业部为什么不建统一平台,让全国农民在网上直接销售土特产?怎么吃回扣!每个省建一个平台,把土特产,农副产品推出去国家级的交易平台实际流量堪忧啊不如现在的市场经济市场的东西还是要回归市场老实说,看你们回答问题就知道没种过土地,算了吧,你们看花3999元买三星GalaxyS21,朋友觉得我人傻钱多,事实却并非如此预算4000左右你会考虑买什么?小米11ProOPPOFindX3一加9Pro还是老iPhone?而我选择了三星GalaxyS21,当我身边朋友知道后觉得我人傻钱多,花3999元买西门子出售智能交通业务,海信拟10亿美金接盘?行业内卷之下集成商远走海外西门子打包出售智能交通业务的谣言终究变成了现实。早在去年11月,西门子就宣布将旗下的ITS(智能交通系统)部门拆分为独立的公司。今年2月,西门子新任首席执行官罗兰布希表示,拆分计划数实融合和绿色发展背景下,满帮(YMM。US)的长期价值将逐步释放从2009年首届天猫双11的5,200万交易额,到2021年的5,403亿交易额,今年天猫双11电商销售规模继续创造着历史新高。而在这电商交易额13年1万倍增长的背后,是中国庞大物联想辜负了我联想辜负了我联想之殇WithoutLENOVO,Whatwouldtheworldbelike?曾经,如此霸气的广告语,让我们中国人油然而生,大有类似当年天安门城楼上宣告从此站起来华为商城上架HelmetphoneBH51MNeo智能头盔,鸿蒙智联多使用场景HelmetphoneBH51MNeo智能头盔,正式上市价格1080元,目前众测价格799元,如果你感兴趣可以去华为商城参与众测,付款后2天内发货。必不可少的鸿蒙智联系统,手机打开号称年轻人的第一把键盘?小米生态链又来搞事情了前言号称年轻人的第一把客制化机械键盘!听到这个Slogan是不是觉得特别耳熟。最近米物就发布了他们的米物ART系列机械键盘,众筹时的价格仅需369元!68键佳达隆G黄Pro轴,可以腾讯无法无天,拿外交部做传奇广告热点观察局腾讯无法无天,拿外交部做传奇广告今天500,我打开电脑上网。首先我打开qq。弹出了腾讯网迷你首页,有一个外交部的图片,我以为是什么重大新闻。结果是一个传奇广告。于是我打开荣耀10x,荣耀50,华为nova7之间,该如何选?都可以,不过最新流行鸿蒙系统,流畅高速,功能强大,不卡顿不杀后台,并且纯国产,在这个角度上,不会考虑荣耀50。何以故?因为没有鸿蒙。未来主流趋势就是鸿蒙系统,何以故?鸿蒙系统乃民心
国产少林武僧鞋国外爆红,身价暴涨14倍,网友他们太天真在2005年,来自法国的Bastian受成龙系列电影影响,热爱上了中国功夫,来到上海学习武术。他在一次观武时,发现中国少林武僧穿的鞋子实在是太牛了,他很喜欢鞋子的轻巧和实用性。于是成都车展比亚迪元PLUS将正式亮相,定位纯电动轿跑SUV2021成都车展将于8月29日正式开幕,而作为中国新能源汽车的先行者以及领导者,比亚迪也将携多款重磅车型出席,其中比亚迪元PLUS将正式亮相。比亚迪元PLUS的广义定位是紧凑型SU全新起亚嘉华将亮相成都车展,它的对手会是谁?售价又会是多少?MPV是英文MultiPurposeVehicle的缩写,意为多用途汽车,是从旅行轿车演变而来,在中国则以商务车的叫法最为广泛,随着国内消费者对多人出行需求的增多,MPV车型也迎来小众,但不小气!捷豹XEL降7万,2。0T8AT后驱,操控性超宝马3系在BBA大行其道的年代,其他的豪华品牌都被统称为二线品牌,但如果我们回到几十年前,捷豹的影响力绝对不输BBA,而且它玩运动玩赛事的时间比宝马早很多,虽说现在捷豹品牌的存在感很低,是与沃尔沃XC90同平台,车长超5米,领克09或将在成都车展公布售价领克是沃尔沃与吉利联手打造的高端品牌,并由沃尔沃主导,所以领克旗下的车型自然会跟沃尔沃有更多的联系,在2021上海车展上,领克推出了旗下全新旗舰级SUV领克09,而在即将开幕的20光刻机发展史!日本曾经吊打美国,却输给了一个中国人光刻机有着人类最精密复杂的机器之称,是现代顶尖技术的集结体。在该领域,荷兰ASML作为唯一能生产出,业界顶尖的EUV光刻机的厂商,毫无疑问地成为光刻机行业霸主。光刻机的工作原理光刻成都车展实拍捷达VS7黑锋版Pro,全身黑化,改一下车标就更好了!在2021成都车展上,捷达没有带来全新车型,依旧是旗下的VA3VS5VS7三款在售车型,不过基于VS7黑锋版升级而来的VS7黑锋版Pro车型还是获得了一定的关注。VS7黑锋版Pro卖80万的国产车,成都车展实拍高合HiPhiX创始版4座从8月29日正式开幕,2021成都车展已进入下半程,热门车型的展台依旧门庭若市,虽说华人运通旗下的高合汽车只带来了高合HiPhiX一款车型,但创始版4座量产车型也算首次与公众见面,购车送五粮液酒!凯翼轩度开启预售,6。89万起,标配1。5T发动机日前,凯翼汽车旗下全新紧凑型轿车凯翼轩度正式开启预售,新车共推出6款车型,预售价格区间为6。899。49万,而凯翼汽车官方也推出了一系列购车政策,置换享8000元补贴,按揭享3年零起售价或低于2万,五菱推出ampampquot迷你版ampampquot宏光MINIEV,轴距仅1。6米在国内新能源汽车销量排行榜中,五菱宏光MINIEV已经连续做了13个月的销冠,也就是所谓的上市即巅峰,累计销量已经超过了37万台,近日,上汽通用五菱又推出了迷你版宏光MINIEV,小米有品众筹潮王冲锋衣!899元媲美北面,不像外卖小哥了冬天到了,直男衣柜里的冲锋衣又该拿出来穿了。每年都有关于冲锋衣的笑话,最多的莫过于总被吐槽穿冲锋衣又双叒被承认美团饿了么顺丰京东各大外卖快递的制服了。一开始,我对这些评价还嗤之以鼻