java编程,spring里ioc和aop用什么原理实现的 spring ioc aop 的原理是什么啊,面试时我怎么回...

EJB\u548cspring\u7684AOP\u548cIOC\u5b9e\u73b0\u539f\u7406\u4e00\u6837\u4e48\uff1f\u529f\u80fd\u4e0a\u54ea\u4e2a\u6bd4\u8f83\u5f3a\u5927\uff0c\u662f\u4fb5\u5165\u5f0f\u7684EJB\u8fd8\u662f\u8f7b\u91cf\u7ea7\u7684Spring\uff1f

\u6ca1\u6709\u54ea\u4e2a\u662f\u6700\u597d\u7684\uff0c\u4f60\u5148\u5b66\u4f1a\u4e00\u4e2a\u5427\uff0c\u5176\u4ed6\u7684\u81ea\u7136\u5c31\u4f1a\u4e86\uff0c\u5176\u4e2d\u7684\u533a\u522b\u4f60\u5230\u65f6\u5019\u81ea\u7136\u5c31\u77e5\u9053\u4e86

IOC:\u63a7\u5236\u53cd\u8f6c\u4e5f\u53eb\u4f9d\u8d56\u6ce8\u5165\u3002\u5229\u7528\u4e86\u5de5\u5382\u6a21\u5f0f
\u5c06\u5bf9\u8c61\u4ea4\u7ed9\u5bb9\u5668\u7ba1\u7406\uff0c\u4f60\u53ea\u9700\u8981\u5728spring\u914d\u7f6e\u6587\u4ef6\u603b\u914d\u7f6e\u76f8\u5e94\u7684bean\uff0c\u4ee5\u53ca\u8bbe\u7f6e\u76f8\u5173\u7684\u5c5e\u6027\uff0c\u8ba9spring\u5bb9\u5668\u6765\u751f\u6210\u7c7b\u7684\u5b9e\u4f8b\u5bf9\u8c61\u4ee5\u53ca\u7ba1\u7406\u5bf9\u8c61\u3002\u5728spring\u5bb9\u5668\u542f\u52a8\u7684\u65f6\u5019\uff0cspring\u4f1a\u628a\u4f60\u5728\u914d\u7f6e\u6587\u4ef6\u4e2d\u914d\u7f6e\u7684bean\u90fd\u521d\u59cb\u5316\u597d\uff0c\u7136\u540e\u5728\u4f60\u9700\u8981\u8c03\u7528\u7684\u65f6\u5019\uff0c\u5c31\u628a\u5b83\u5df2\u7ecf\u521d\u59cb\u5316\u597d\u7684\u90a3\u4e9bbean\u5206\u914d\u7ed9\u4f60\u9700\u8981\u8c03\u7528\u8fd9\u4e9bbean\u7684\u7c7b\uff08\u5047\u8bbe\u8fd9\u4e2a\u7c7b\u540d\u662fA\uff09\uff0c\u5206\u914d\u7684\u65b9\u6cd5\u5c31\u662f\u8c03\u7528A\u7684setter\u65b9\u6cd5\u6765\u6ce8\u5165\uff0c\u800c\u4e0d\u9700\u8981\u4f60\u5728A\u91cc\u9762new\u8fd9\u4e9bbean\u4e86\u3002
\u6ce8\u610f\uff1a\u9762\u8bd5\u7684\u65f6\u5019\uff0c\u5982\u679c\u6709\u6761\u4ef6\uff0c\u753b\u56fe\uff0c\u8fd9\u6837\u66f4\u52a0\u663e\u5f97\u4f60\u61c2\u4e86
AOP:\u9762\u5411\u5207\u9762\u7f16\u7a0b\u3002\uff08Aspect-Oriented
Programming
\uff09
AOP\u53ef\u4ee5\u8bf4\u662f\u5bf9OOP\u7684\u8865\u5145\u548c\u5b8c\u5584\u3002OOP\u5f15\u5165\u5c01\u88c5\u3001\u7ee7\u627f\u548c\u591a\u6001\u6027\u7b49\u6982\u5ff5\u6765\u5efa\u7acb\u4e00\u79cd\u5bf9\u8c61\u5c42\u6b21\u7ed3\u6784\uff0c\u7528\u4ee5\u6a21\u62df\u516c\u5171\u884c\u4e3a\u7684\u4e00\u4e2a\u96c6\u5408\u3002\u5f53\u6211\u4eec\u9700\u8981\u4e3a\u5206\u6563\u7684\u5bf9\u8c61\u5f15\u5165\u516c\u5171\u884c\u4e3a\u7684\u65f6\u5019\uff0cOOP\u5219\u663e\u5f97\u65e0\u80fd\u4e3a\u529b\u3002\u4e5f\u5c31\u662f\u8bf4\uff0cOOP\u5141\u8bb8\u4f60\u5b9a\u4e49\u4ece\u4e0a\u5230\u4e0b\u7684\u5173\u7cfb\uff0c\u4f46\u5e76\u4e0d\u9002\u5408\u5b9a\u4e49\u4ece\u5de6\u5230\u53f3\u7684\u5173\u7cfb\u3002\u4f8b\u5982\u65e5\u5fd7\u529f\u80fd\u3002\u65e5\u5fd7\u4ee3\u7801\u5f80\u5f80\u6c34\u5e73\u5730\u6563\u5e03\u5728\u6240\u6709\u5bf9\u8c61\u5c42\u6b21\u4e2d\uff0c\u800c\u4e0e\u5b83\u6240\u6563\u5e03\u5230\u7684\u5bf9\u8c61\u7684\u6838\u5fc3\u529f\u80fd\u6beb\u65e0\u5173\u7cfb\u3002\u5728OOP\u8bbe\u8ba1\u4e2d\uff0c\u5b83\u5bfc\u81f4\u4e86\u5927\u91cf\u4ee3\u7801\u7684\u91cd\u590d\uff0c\u800c\u4e0d\u5229\u4e8e\u5404\u4e2a\u6a21\u5757\u7684\u91cd\u7528\u3002
\u5c06\u7a0b\u5e8f\u4e2d\u7684\u4ea4\u53c9\u4e1a\u52a1\u903b\u8f91\uff08\u6bd4\u5982\u5b89\u5168\uff0c\u65e5\u5fd7\uff0c\u4e8b\u52a1\u7b49\uff09\uff0c\u5c01\u88c5\u6210\u4e00\u4e2a\u5207\u9762\uff0c\u7136\u540e\u6ce8\u5165\u5230\u76ee\u6807\u5bf9\u8c61\uff08\u5177\u4f53\u4e1a\u52a1\u903b\u8f91\uff09\u4e2d\u53bb\u3002
\u5b9e\u73b0AOP\u7684\u6280\u672f\uff0c\u4e3b\u8981\u5206\u4e3a\u4e24\u5927\u7c7b\uff1a\u4e00\u662f\u91c7\u7528\u52a8\u6001\u4ee3\u7406\u6280\u672f\uff0c\u5229\u7528\u622a\u53d6\u6d88\u606f\u7684\u65b9\u5f0f\uff0c\u5bf9\u8be5\u6d88\u606f\u8fdb\u884c\u88c5\u9970\uff0c\u4ee5\u53d6\u4ee3\u539f\u6709\u5bf9\u8c61\u884c\u4e3a\u7684\u6267\u884c\uff1b\u4e8c\u662f\u91c7\u7528\u9759\u6001\u7ec7\u5165\u7684\u65b9\u5f0f\uff0c\u5f15\u5165\u7279\u5b9a\u7684\u8bed\u6cd5\u521b\u5efa\u201c\u65b9\u9762\u201d\uff0c\u4ece\u800c\u4f7f\u5f97\u7f16\u8bd1\u5668\u53ef\u4ee5\u5728\u7f16\u8bd1\u671f\u95f4\u7ec7\u5165\u6709\u5173\u201c\u65b9\u9762\u201d\u7684\u4ee3\u7801
\u7b80\u5355\u70b9\u89e3\u91ca\uff0c\u6bd4\u65b9\u8bf4\u4f60\u60f3\u5728\u4f60\u7684biz\u5c42\u6240\u6709\u7c7b\u4e2d\u90fd\u52a0\u4e0a\u4e00\u4e2a\u6253\u5370\u2018\u4f60\u597d\u2019\u7684\u529f\u80fd\u8fd9\u4f60\u7ecf\u53ef\u4ee5\u7528aop\u601d\u60f3\u6765\u505a\uff0c\u4f60\u5148\u5199\u4e2a\u7c7b\u5199\u4e2a\u65b9\u6cd5\uff0c\u65b9\u6cd5\u7ecf\u5b9e\u73b0\u6253\u5370\u2018\u4f60\u597d\u2019\u8ba9\u540e\u4f60Ioc\u8fd9\u4e2a\u7c7b
ref\uff1d\u201cbiz.*\u201d\u8ba9\u6bcf\u4e2a\u7c7b\u90fd\u6ce8\u5165\u3002

控制反转(IOC)

(理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”)
1、Ioc—Inversion of Control:即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
2、谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象即由Ioc容器来控制对象的创建。
谁控制谁?当然是IoC 容器控制了对象。
控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
3、为何是反转,哪些方面反转了: 有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象。
为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转。
哪些方面反转了?依赖对象的获取被反转了。
还是不明白没事,下面搞个简单案例来说就懂啦 !!!
例子:当我们在任何一个有实际开发意义的程序项目中,我们会使用很多类来描述他们特有的功能,并且通过类与类之间的相互协作来完成特定的业务逻辑。这个时候,每个类都需要负责管理与自己有交互的类的引用和依赖,代码将会变的异常难以维护和极高的高耦合。而IOC的出现正是用来解决这个问题,我们通过IOC将这些依赖对象的创建、协调工作交给spring容器去处理,每个对象值需要关注其自身的业务逻辑关系就可以了。在这样的角度上来看,获得依赖的对象的方式,进行了反转,变成了由spring容器控制对象如何获取外部资源(包括其他对象和文件资料等)。
总的来说:IOC就是通过在Xml配置文件里依赖注入来解决代码问题。

IOC的注入类型有几种?主要可以划分为三种:构造函数注入、属性注入和接口注入。Spring支持构造函数注入和属性注入

面向切面(AOP)

(面向切面编程,AOP其实只是OOP的补充而已,AOP基本上是通过代理机制实现的。)
我们管切入到指定类指定方法的代码片段称为切面,而切入到哪些类、哪些方法则叫切入点。有了AOP,我们就可以把几个类共有的代码,抽取到一个切片中,等到需要时再切入对象中去,从而改变其原有的行为。
我们都知道 Java 是 OOP-面向对象编程的,它有自己的优势,也有自己的不足。比如说:在我们开发中,都会有一条业务主线(即客户的需求)。而我们要做的就是实现这个主线上的需求。我们在实现这些功能的时候,经常要干一些额外的不可避免的事情,比如事务的管理,日志的记录等,就很繁杂且代码量增多,所以 Spring 提供了另一种角度来思考程序结构,也就是把这一些事情剥离出来,然后适时适地的把它们加入到我们的代码中,比如说 声明式事务管理的时候,我们在 service 层检测到save*、update*这些方法要被调用的时候,我们先进行开启事务什么的,这就是AOP,面向编程的思想。

AOP的术语:
1、通知(Advice):就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下
2、连接点(JoinPoint):这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。
3、切入点(Pointcut):上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
4、切面(Aspect):切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
5、引入(introduction):允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
6、目标(target):引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
7、代理(proxy):怎么实现整套aop机制的,都是通过代理,这个一会给细说。
8、织入(weaving):把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。

spring中ioc使用的是“生产工厂”,aop使用的是“动态代理”想知道更多建议去看一下 马士兵 的系列视频教程。

主要应用了java的反射技术,很酷;

可以根据给定的参数(主要是字符串)
创建相应的bean,访问相应的方法或构造器以及成员变量;

具体应用可以查看帮助文档 java.lang.reflect包下的Constructor,Method, Field/java.lang.Class

  • Spring妗嗘灦楂樼骇缂栫▼鐨鍐呭绠浠
    绛旓細閫氳繃涓涓畬鏁寸殑鏍锋湰搴旂敤绋嬪簭璐┛鍏ㄤ功锛屼妇渚嬭鏄Spring濡備綍鎻愪緵涓涓竻鏅扮殑銆佸垎灞傜殑浣撶郴缁撴瀯鐨勫熀纭锛涗互鍙婂浣曢傚綋鍦颁娇鐢⊿pring鏉ュ疄鐜板ソ鐨凮O璁捐鍜屼綋绯荤粨鏋勮璁★紝浠ュ強濡備綍搴旂敤鏈浣冲疄璺点傛湰涔﹂潰鍚戞娣变汉瀛︿範Spring妗嗘灦鐨凧ava/J2EE浣撶郴缁撴瀯璁捐浜哄憳鍜屽紑鍙戜汉鍛橈紝浣夸粬浠兘澶熸妸spring妗嗘灦鏈夋晥鍦扮敤浜庝粠绠鍗曠殑Web搴旂敤鍒板鏉傜殑...
  • 浠涔堟槸Spring?
    绛旓細銆愮瓟妗堛戯細Spring鏄竴涓紑婧愮殑Java EE寮鍙戞鏋躲係pring妗嗘灦鐨勬牳蹇冨姛鑳藉彲浠ュ簲鐢ㄥ湪浠讳綍Java搴旂敤绋嬪簭涓紝浣嗗Java EE骞冲彴涓婄殑Web搴旂敤绋嬪簭鏈夋洿濂界殑鎵╁睍鎬с係pring妗嗘灦鐨勭洰鏍囨槸浣垮緱Java EE搴旂敤绋嬪簭鐨勫紑鍙戞洿鍔犵畝鎹凤紝閫氳繃浣跨敤POJO涓哄熀纭鐨缂栫▼妯″瀷淇冭繘鑹ソ鐨勭紪绋嬮鏍笺
  • java瀛︿範鐨勪富瑕佸唴瀹规槸浠涔?
    绛旓細Java璇█鐨勫彂灞曚即闅忕潃璁稿涓绘祦妗嗘灦鐨勫嚭鐜帮紝杩欎簺妗嗘灦鐨勫嚭鐜板ぇ澶ф彁鍗囦簡Java鐨寮鍙戞晥鐜囥備笅闈㈡垜灏嗕粙缁嶄竴浜涗富娴佺殑Java妗嗘灦锛屽苟绠鍗曟弿杩板畠浠殑鐗圭偣鍜岀敤閫斻係pring妗嗘灦锛歋pring鏄渶涓烘祦琛岀殑Java寮鍙戞鏋朵箣涓锛屽畠鏄竴涓紑婧愮殑Java骞冲彴锛屾彁渚涗簡涓绉嶅叏闈㈢殑缂栫▼鍜岄厤缃ā鍨嬶紝鐢ㄤ簬鏋勫缓浼佷笟绾у簲鐢ㄣSpring鐨鏍稿績鏄疘nversion of...
  • 涓轰粈涔堝涔Java缂栫▼?Java缂栫▼濂藉悧?
    绛旓細Java鏍稿績鎬濇兂锛氶潰鍚戝璞缂栫▼锛缁ф壙锛岄珮鍏煎(浠g爜绉绘鎬у己)锛屽紑婧愶紝閬垮厤閲嶅閫犺疆瀛(浣跨敤Mybatis锛孲pring锛孯edis绛夋妧鏈彧闇瑕佸皢jar鍖呬緷璧栨坊鍔犲埌椤圭洰涓嵆鍙紝jar鍖呭唴灏辨槸鎶鏈牳蹇冧唬鐮侊紝鑰岃繖浜涙鏋堕兘鏄笓涓氭妧鏈洟闃熷紑鍙戝嚭鏉ョ殑锛岃繖涓哄ぇ澶氭暟椤圭洰寮鍙戠渷鍘诲緢澶氱簿鍔涳紝鎷挎潵鍗崇敤)銆傜幇鍦ㄨ繖涓椂浠d笉浠呮槸琛屼笟鐨勫法澶ф満浼氾紝...
  • java鐨涓夊ぇ妗嗘灦鏄粈涔,鍔熻兘鍚勬槸浠涔
    绛旓細甯歌鐨勪笁澶ф鏋舵寚锛歋SH锛屽嵆锛Spring銆丼truts銆丠ibernate銆係pring锛氬姛鑳藉己澶х殑缁勪欢绮樺悎娴庯紝鑳藉灏嗕綘鐨勬墍鏈鐨刯ava鍔熻兘妯″潡鐢ㄩ厤缃枃浠剁殑鏂瑰紡缁勫悎璧锋潵鎴愪负涓涓畬鎴愮殑搴旂敤銆係pring鏄竴涓В鍐充簡璁稿鍦↗2EE寮鍙戜腑甯歌鐨勯棶棰樼殑寮哄ぇ妗嗘灦銆係pring鎻愪緵浜嗗敮涓鐨勬暟鎹闂娊璞★紝鍖呮嫭绠鍗曞拰鏈夋晥鐜囩殑JDBC妗嗘灦锛屾瀬澶х殑鏀硅繘浜嗘晥鐜...
  • java缂栫▼璇█涓,spring boot妗嗘灦鏄笉鏄瘮spring mvc妗嗘灦鏂,boot鏄渶鏂...
    绛旓細springmvc鍙槸spring鍏朵腑鐨勪竴閮ㄥ垎銆俿pring鍙互鏀寔hibernate锛宨batis锛孞MS锛孞DBC鏀寔浜嬪姟绠$悊锛屾敞瑙e姛鑳斤紝琛ㄨ揪寮忚瑷锛屾祴璇晄pringmvc灏辨槸涓涓畝鍗曠殑web妗嗘灦锛屼笂鎵嬪緢蹇紝鍙互浠f浛SSH妗嗘灦銆俿pringmvc姣攕truts2鎬ц兘浼樹竴浜涖
  • java璇█鏍稿績鎶鏈槸浠涔?
    绛旓細浠庣畝鍗曟с佸彲娴嬭瘯鎬у拰鏉捐﹀悎鐨勮搴﹁岃█锛屼换浣Java搴旂敤閮藉彲浠ヤ粠Spring涓鍙楃泭銆傜畝鍗曟潵璇锛孲pring灏辨槸涓涓交閲忕骇鐨勬帶鍒跺弽杞紙IoC锛夊拰闈㈠悜鍒囬潰锛圓OP锛夌殑瀹瑰櫒妗嗘灦銆備笅闈粠鏁翠綋涓婅璇嗕竴涓Spring鐨涓昏鐗瑰緛锛氳交閲忥細浠庡ぇ灏忎笌寮閿涓ゆ柟闈㈣岃█Spring閮芥槸杞婚噺鐨勩傛澶栵紝Spring鏄潪渚靛叆寮忕殑锛氫娇鐢⊿pring,鎴戜滑鐨勭被杩樻槸pojo...
  • 璋佽兘浠嬬粛涓涓JAVA涓夊ぇ妗嗘灦鐨勫悇鑷綔鐢?
    绛旓細Spring鐨鏁版嵁璁块棶鏋舵瀯杩橀泦鎴愪簡Hibernate鍜屽叾浠朞/R mapping瑙e喅鏂规銆係pring杩樻彁渚涗簡鍞竴鐨勪簨鍔$鐞嗘娊璞★紝瀹冭兘澶熷湪鍚勭搴曞眰浜嬪姟绠$悊鎶鏈紝渚嬪JTA鎴栬匤DBC浜嬪姟鎻愪緵涓涓竴鑷寸殑缂栫▼妯″瀷銆係pring鎻愪緵浜嗕竴涓敤鏍囧噯Java璇█缂栧啓鐨凙OP妗嗘灦锛屽畠缁橮OJOs鎻愪緵浜嗗0鏄庡紡鐨勪簨鍔$鐞嗗拰鍏朵粬浼佷笟浜嬪姟--濡傛灉浣犻渶瑕--杩樿兘瀹炵幇浣犺嚜宸...
  • spring涓昏鐨勪綔鐢?
    绛旓細Spring妗嗘灦鏄负浜嗚В鍐充紒涓氬簲鐢ㄥ紑鍙戠殑澶嶆潅鎬ц屽垱寤虹殑銆Spring鐨鐢ㄩ斾笉浠呬粎闄愪簬鏈嶅姟鍣ㄧ鐨勫紑鍙戙備粠绠鍗曟с佸彲娴嬭瘯鎬у拰鏉捐﹀悎鎬ц搴﹁岃█锛岀粷澶ч儴鍒Java搴旂敤閮藉彲浠ヤ粠Spring涓鍙楃泭銆備娇鐢ㄥ熀鏈殑JavaBean浠f浛EJB锛屽苟鎻愪緵浜嗘洿澶氱殑浼佷笟搴旂敤鍔熻兘銆
  • java涓殑涓夊ぇ妗嗘灦鏄粈涔堝憖銆佹湁鍝簺鍔熻兘
    绛旓細Spring鐨鏁版嵁璁块棶鏋舵瀯杩橀泦鎴愪簡Hibernate鍜屽叾浠朞/R mapping瑙e喅鏂规銆係pring杩樻彁渚涗簡鍞竴鐨勪簨鍔$鐞嗘娊璞★紝瀹冭兘澶熷湪鍚勭搴曞眰浜嬪姟绠$悊鎶鏈紝渚嬪JTA鎴栬匤DBC浜嬪姟鎻愪緵涓涓竴鑷寸殑缂栫▼妯″瀷銆係pring鎻愪緵浜嗕竴涓敤鏍囧噯Java璇█缂栧啓鐨凙OP妗嗘灦锛屽畠缁橮OJOs鎻愪緵浜嗗0鏄庡紡鐨勪簨鍔$鐞嗗拰鍏朵粬浼佷笟浜嬪姟--濡傛灉浣犻渶瑕--杩樿兘瀹炵幇浣犺嚜宸...
  • 扩展阅读:javascript substring ... java ajax ... javascript jquery ... java webservice ... javascript confirm ... javascript void ... java spring boot ... javaee spring ... java框架spring ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网