城市直播房产教育博客汽车
投稿投诉
汽车报价
买车新车
博客专栏
专题精品
教育留学
高考读书
房产家居
彩票视频
直播黑猫
投资微博
城市上海
政务旅游

Spring面试中常见问题总结

11月11日 飞凤谷投稿
  1。IOC和AOP
  首先英文缩写记清楚,不要念错(1)。IOC
  IOC(InversionofControl),从字面上理解就是控制反转,将对在自身对象中的一个内置对象的控制权反转。所谓的反转,即把内置对象的控制权反转给一个容器,而应用程序只需要提供对象的类型即可。IOC是面向对象编程的一种设计原则。可以用来降低代码之间的耦合。大致含义就是在代码中需要使用一个对象时,并不是立即new一个对象出来,而是从一个调控系统内所有对象的外界实体,也就是容器中将这个对象的一个实体传递到调用处接收的位置。对象的实体在容器加载时就已经被创建。而且对象的创建与当前代码的运行解耦合了。
  依赖注入(DependencyInjection,即DI),容器中的对象所需要的依赖来自于配置文件(xml)中的配置,也就是由容器去完成依赖项的添加。就是在xml文件中配置好类的属性。Spring中需要依赖项属性的set和get方法。Spring的IOC有三种注入方式:构造器注入、setter方法注入、根据注解注入。
  依赖查找(DependencyLookup,即DL),是指在容器中对象的类中,手动将依赖项从容器中取出,设置依赖项。实际项目中使用容器对象(Autowired不是依赖查找,而是通过扫描注解,在容器内部进行依赖的注入,没有手动配置罢了)进行依赖项的查找。(2)。AOP
  AOP(AspectOrientedProgramming),意为面向切面编程。是通过预编译和运行时动态代理的方式实现程序功能的统一维护的技术(何为维护参考事务)。中文的这种翻译带有略微的一些误导性,切面主要是指将程序维护代码中先行执行部分和后续执行部分之间插入用户代码的位置,就像在一个方法中切入一个过程一样。
  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代理代码实现生成代理类对象publicstaticServicecreateService(){目标类ServiceservicenewServiceImpl();切面类MyAspectmyAspectnewMyAspect();代理类Proxy。newProxyInstance参数1:loader,类加载器,动态代理类运行时创建,任何类都需要类加载器将其加载到内存。一般情况:当前类。class。getClassLoader();目标类实例。getClass()。get。。。参数2:Class〔〕interfaces代理类需要实现的所有接口方式1:目标类实例。getClass()。getInterfaces();注意:只能获得自己接口,不能获得父元素接口方式2:newClass〔〕{UserService。class}例如:jdbc驱动DriverManager获得接口Connection参数3:InvocationHandler处理类,接口,必须进行实现类,一般采用匿名内部提供invoke方法,代理类的每一个方法执行时,都将调用一次invoke参数31:Objectproxy:代理对象参数32:Methodmethod:代理对象当前执行的方法的描述对象(反射)执行方法名:method。getName()执行方法:method。invoke(对象,实际参数)参数33:Object〔〕args:方法实际参数Serviceproxy(Service)Proxy。newProxyInstance(MyBeanFactory。class。getClassLoader(),本类的类加载器service。getClass()。getInterfaces(),本类的接口数组newInvocationHandler(){处理类:一个InvocationHandler接口对象,内部实现切入点等等细节Overrideproxy代理对象,没用到method执行的方法,在内部通过反射执行args方法参数publicObjectinvoke(Objectproxy,Methodmethod,Object〔〕args)throwsThrowable{前执行myAspect。before();执行目标方法,需要传入目标类Objectobjmethod。invoke(service,args);后执行myAspect。after();}});}2。BeanFactory和ApplicationContext
  都可以做Spring的容器,其中ApplicationContext是BeanFactory的子接口。
  BeanFactory实现的功能:读取bean配置文档管理bean的加载,实例化,控制bean的生命周期维护bean之间的依赖关系
  ApplicationContext在BeanFactory的基础上还提供了更完整的框架功能:支持国际化统一的资源文件访问格式监听器同时加载多个配置文件,分层
  BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化。
  ApplicationContext,它是在容器启动时,一次性创建了所有的Bean。3。SpringBean的生命周期(1)。实例化Bean
  对于BeanFactory,当客户端请求一个未被初始化的bean时,容器获取对象中的信息,进行实例化
  对于ApplicationContext,容器一启动,就获取所有对象的信息,进行初始化(2)。设置对象属性(依赖注入)
  实例化完成后的对象被封装在BeanWrapper(BeanWrapperImpl在内部使用Spring的BeanUtils工具类对Bean进行反射操作,设置属性。)中,根据配置的信息,进行依赖的填充。(3)。处理Aware接口
  Spring检查该对象是否实现了xxxAware接口,并将相关的xxxAware实例注入给Bean:如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(StringbeanId)方法,此处传递的就是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接口实现的postProcessBeforeInitialization(Objectbean,StringbeanName)方法,进行一些初始化前的前置处理。
  这个方法传入bean对象和其名字。并将返回的对象设置为bean。
  可以用于进行原对象和代理对象的替换,修改bean的属性等功能的实现。(5)。InitializingBean
  初始化时会附加进行的操作
  如果bean实现了InitializingBean接口,会调用voidafterPropertiesSet()方法进行初始化(6)。initmethod
  bean在Spring配置文件中配置了initmethod属性,则会自动调用其配置的初始化方法
  如果同时实现了,那么先进行接口方法的调用,在进行配置文件中指定方法的调用(6)。BeanPostProcessor接口
  调用BeanPostProcessor接口实现的postProcessAfterInitialization(Objectbean,StringbeanName)方法,进行一些初始化前的后置处理。
  与(4)对应。
  到这里bean就已经被正确的创建了。(7)。DisposableBean
  清理bean时会附加进行的操作。
  当bean不再被需要的时候,会经历清理阶段。
  如果bean实现了DisposableBean这个接口,会调用其实现的voiddestroy()方法(8)。destroymethod
  同样,在对象销毁有一个参数配置destroymethod,和initmethod相同,在调用销毁的时候,先执行DisposableBean的destroy方法,后执行destroymethod声明的方法。4。spring支持的bean的作用域(1)。singleton
  默认,单例模式
  一般的开发中,并不会在bean中加入可变的成员变量,所以即使单例模式下没有进行任何的多线程同步处理,也是线程安全的,但要明白原因。(2)。prototype
  多例模式,只要请求bean,就生成一个实例(3)。request
  为每个请求生成不同的实例(4)。session
  为每个会话生成不同的实例(5)。globalsession
  globalsession作用域类似于标准的HTTPSession作用域,不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个portletweb应用的各种不同的portlet所共享。在globalsession作用域中定义的bean被限定于全局portletSession的生命周期范围内。
  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。
  首先根据类型进行查找,如果匹配到多个对象,使用名称进行查找。如果没有匹配到对象,会抛异常。解决方法:设置属性requiredfalse(允许不被装配)。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,需要注入TransactionManagerbeanidtransactionManagerclassorg。springframework。jdbc。datasource。DataSourceTransactionManagerpropertynamedataSourcerefdataSourcebeanbeanidtransactionTemplateclassorg。springframework。transaction。support。TransactionTemplatepropertynametransactionManagerrefbeantransactionManagerpropertybean
  将TransactionTemplate注入到业务层方法中,并使用publicclassProTransExample{Resource(nametransactionTemplate)privateTransactionTemplatetransactionTResource(namejdbcTemplate)privateJdbcTemplatejdbcTTestpublicvoidsave(){说明:如果你的方法需要返回值请使用这个类newTransactionCallbackObject()如果你的方法不需要返回值那么使用下面这个例子就可以了newTransactionCallbackWithoutResult()transactionTemplate。execute(newTransactionCallbackWithoutResult(){OverrideprotectedvoiddoInTransactionWithoutResult(TransactionStatustransactionStatus){Stringsqlinsertintobooks(isbn,name,price,pubdate)values(?,?,?,?);jdbcTemplate。update(sql,20166890China,阿甘正传,99。00,newDate());}});}}2)。声明式事务
  两种方法:在xml文件中配置切入点表达式(按照报名,类名,方法名,参数筛选出方法集合)和通知使用Transactional注解进行(2)。spring事务传播行为PROPAGATIONREQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。PROPAGATIONSUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。PROPAGATIONMANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。PROPAGATIONREQUIRESNEW:创建新事务,无论当前存不存在事务,都创建新事务。PROPAGATIONNOTSUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。PROPAGATIONNEVER:以非事务方式执行,如果当前存在事务,则抛出异常。PROPAGATIONNESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。(3)。spring中的事务隔离级别ISOLATIONDEFAULT:这是个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别。ISOLATIONREADUNCOMMITTED:读未提交,允许另外一个事务可以看到这个事务未提交的数据。ISOLATIONREADCOMMITTED:读已提交,保证一个事务修改的数据提交后才能被另一事务读取,而且能看到该事务对已有记录的更新。ISOLATIONREPEATABLEREAD:可重复读,保证一个事务修改的数据提交后才能被另一事务读取,但是不能看到该事务对已有记录的更新。ISOLATIONSERIALIZABLE:串行化,一个事务在执行的过程中完全看不到其他事务对数据库所做的更新。9。spring事件在谈Spring的事件监听之前,让我们先了解一下Spring容器,什么是ApplicationContext?
  它是Spring的核心,Context我们通常解释为上下文环境,但是理解成容器会更好些。
  ApplicationContext则是应用的容器。
  Spring把Bean(object)放在容器中,需要用就通过get方法取出来。
  此接口提供给Spring应用配置的能力,当应用启动时,此接口的实现是只读的,但是如果该实现支持,其内容也是可以重新载入的。
  学习更多JAVA知识与技巧,关注与私信博主(学习)
投诉 评论 转载

西红柿不能随便吃?提醒这3类人,平时尽量少吃,要听劝西红柿又叫番茄,为茄科植物西红柿的新鲜成熟果实,味干酸、性微寒,具有生津止渴、健胃消食的功效,用于口渴、食欲不振。医学专家认为每人每天吃两到三个番茄,就可以满足一天维生素……ZOL科技早餐华为手机官方降价,雷军发文庆祝Redmi生日8月1日晨,为您推送的科技消息01雷军发文庆祝Redmi生日,初代机型仅799元2013年7月31日,第一代红米手机诞生。雷军7月31日发文庆祝Redmi红米手机生……电脑共享文件打不开要如何解决在给电脑设置共享文件的时候,为什么会出现文件打不开的情况呢?很多用户遇到这个问题不太清楚如何解决,下面就和大家一起讲讲电脑共享文件打不开要如何解决吧。还有更详细的系统重装……最新研究塑料污染危及超过半数海洋鸟类,防治已刻不容缓图片来源视觉中国文丨学术头条,作者丨XT,编审丨王新凯2018年联合国环境署发布的一项报告显示,全球每年约有1300万吨塑料废弃物流入海洋。漂浮在海面上和搁浅在海滩……高胆固醇血症危害心脏健康,是什么导致高胆固醇?胆固醇有好有坏。在正常水平下,它是人体必需的物质。然而,如果血液中的浓度过高,就会成为一种无声的危险,使人们面临心脏病发作的风险。胆固醇存在于身体的每个细胞中,在消化食物……外媒俄罗斯球星久巴拒绝中国俱乐部200万欧年薪的报价据俄罗斯媒体最新消息,有中国球队给久巴报价200万欧元的年薪,但后者拒绝了该报价。此前,俄媒透露有中国俱乐部对俄罗斯球星久巴产生了兴趣,但他本人还没有作出最后的选择。除了……Spring面试中常见问题总结1。IOC和AOP首先英文缩写记清楚,不要念错(1)。IOCIOC(InversionofControl),从字面上理解就是控制反转,将对在自身对象中的一个内置对象……vivoY77新机重磅来袭,vivoT1低价任性,性价比登峰近日,vivo新手机Y77正式到货。据了解,这是一款主要面向线下市场的手机产品。7月7日,手机中国通知vivoY77已经正式开启预售,其12GB256G版本价格为1999元。同……时隔16年,刘天仙又杀回来了老天爷赏的饭,该吃还是得吃国产古偶好久没这么风光过了。《梦华录》开播后直接播放量爆表,热搜屠榜。天仙刘亦菲搭配帅哥陈晓,直接在天下苦古偶丑久矣的古偶市场,一骑绝尘。网友心理活动:……最大的恐龙为什么科学家不能就它是谁达成一致?如果你问哪种恐龙最大这个问题,那么很多人都会想到霸王龙。我们经常听说过它的巨大体积。然而,事实并非如此。因为捕食者总是不如最大的食草动物。然而,对他们来说,并不是一……传说皮肤今日上线,普攻附带雷电拖尾,回城特效秒杀典藏本文原创首发于公众号:电竞怪客hello大家好我是怪客君昨天刚给大家爆料后羿的新皮肤会在这周上线,结果话音刚落,当天晚上王者官方就官宣了后羿的皮肤特效。后羿无尽星芒……郭进拴悠悠蓝月谷郭进拴悠悠蓝月谷蓝月谷是云南著名的风景区,位于玉龙雪山东麓甘海子以北、云杉坪南侧的山谷之中。源自雪山冰川的万古冰雪消融之后,顺着峭壁流淌而下,不断汇集为山涧溪流,最终在蓝……
探访成都自然博物馆2046穿越香港往事12保塘古树茶1000亩古树茶园年产15吨黑蜂蜜氨基酸5。3快船领先11分,威少却遭侮辱!三分22中3,勇士打铁铺开张U20亚洲杯沙特点射10取开门红,U20国足下轮再输或提前出4连败!从西部榜首跌至第10,西部黑马轰然倒下,湖人坐收渔利通信历史连载297李自学李一消我凝望的何止月光我们给月亮拍了张高清照9万余人报名!2023年武汉马拉松公众报名截止股民疑问,钱从哪来?30亿市值珠宝公司,百亿跨界光伏,建超级旧少年谁也不服谁?山东泰山和上海上港提出相同目标!谁能捧得足协杯性孤高似柏,阿娇金屋。意思翻译、赏析温暖我的时光新能源二手车的热与冷浅谈侠义吓死了深耕行业十七载,天孚通信光引擎激光雷达打造成长第二极PK赛关于诚信的作文诚信来自心灵的契约朋友圈平安夜文案2013年如何开网店才能更赚钱?肾结石碎石有哪几种哪种肾结石最难治?初中母爱日记

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找