当前位置: 首页 > news >正文

深圳专业网站关键词林俊杰

深圳专业网站,关键词林俊杰,苏州城乡住房建设局网站,网站建设120依赖注入底层原理流程图#xff1a;Spring中Bean的依赖注入原理| ProcessOn免费在线作图,在线流程图,在线思维导图 Spring中到底有几种依赖注入的方式#xff1f; 首先分两种#xff1a; 手动注入自动注入 手动注入 在XML中定义Bean时#xff0c;就是手动注入#xf…依赖注入底层原理流程图Spring中Bean的依赖注入原理| ProcessOn免费在线作图,在线流程图,在线思维导图 Spring中到底有几种依赖注入的方式 首先分两种 手动注入自动注入 手动注入 在XML中定义Bean时就是手动注入因为是程序员手动给某个属性指定了值。 bean nameuserService classcom.luban.service.UserServiceproperty nameorderService reforderService/ /bean上面这种底层是通过set方法进行注入。 bean nameuserService classcom.luban.service.UserServiceconstructor-arg index0 reforderService/ /bean上面这种底层是通过构造方法进行注入。 所以手动注入的底层也就是分为两种 set方法注入构造方法注入 自动注入 自动注入又分为两种 XML的autowire自动注入Autowired注解的自动注入 XML的autowire自动注入 在XML中我们可以在定义一个Bean时去指定这个Bean的自动注入模式 byTypebyNameconstructordefaultno 比如 bean iduserService classcom.luban.service.UserService autowirebyType/这么写表示Spring会自动的给userService中所有的属性自动赋值不需要这个属性上有Autowired注解但需要这个属性有对应的set方法。 在创建Bean的过程中在填充属性时Spring会去解析当前类把当前类的所有方法都解析出来Spring会去解析每个方法得到对应的PropertyDescriptor对象PropertyDescriptor中有几个属性 name这个name并不是方法的名字而是拿方法名字进过处理后的名字 如果方法名字以“get”开头比如“getXXX”,那么nameXXX如果方法名字以“is”开头比如“isXXX”,那么nameXXX如果方法名字以“set”开头比如“setXXX”,那么nameXXXreadMethodRef表示get方法的Method对象的引用readMethodName表示get方法的名字writeMethodRef表示set方法的Method对象的引用writeMethodName表示set方法的名字propertyTypeRef如果有get方法那么对应的就是返回值的类型如果是set方法那么对应的就是set方法中唯一参数的类型 get方法的定义是 方法参数个数为0个并且 方法名字以get开头 或者 方法名字以is开头并且方法的返回类型为boolean **set方法的定义是**方法参数个数为1个并且 方法名字以set开头并且方法返回类型为void 所以Spring在通过byName的自动填充属性时流程是 找到所有set方法所对应的XXX部分的名字根据XXX部分的名字去获取bean Spring在通过byType的自动填充属性时流程是 获取到set方法中的唯一参数的参数类型并且根据该类型去容器中获取bean如果找到多个会报错。 以上分析了autowire的byType和byName情况那么接下来分析constructorconstructor表示通过构造方法注入其实这种情况就比较简单了没有byType和byName那么复杂。 ​ 如果是constructor那么就可以不写set方法了当某个bean是通过构造方法来注入时spring利用构造方法的参数信息从Spring容器中去找bean找到bean之后作为参数传给构造方法从而实例化得到一个bean对象并完成属性赋值属性赋值的代码得程序员来写。 我们这里先不考虑一个类有多个构造方法的情况后面单独讲推断构造方法。我们这里只考虑只有一个有参构造方法。 其实构造方法注入相当于byTypebyName普通的byType是根据set方法中的参数类型去找bean找到多个会报错而constructor就是通过构造方法中的参数类型去找bean如果找到多个会根据参数名确定。 另外两个 no表示关闭autowiredefault表示默认值我们一直演示的某个bean的autowire而也可以直接在beans标签中设置autowire如果设置了那么bean标签中设置的autowire如果为default那么则会用beans标签中设置的autowire。 可以发现XML中的自动注入是挺强大的那么问题来了为什么我们平时都是用的Autowired注解呢而没有用上文说的这种自动注入方式呢 Autowired注解相当于XML中的autowire属性的注解方式的替代。这是在官网上有提到的。 Essentially, the Autowired annotation provides the same capabilities as described in Autowiring Collaborators but with more fine-grained control and wider applicability翻译一下 从本质上讲Autowired注解提供了与autowire相同的功能但是拥有更细粒度的控制和更广泛的适用性。 注意更细粒度的控制。 XML中的autowire控制的是整个bean的所有属性而Autowired注解是直接写在某个属性、某个set方法、某个构造方法上的。 再举个例子如果一个类有多个构造方法那么如果用XML的autowireconstructor你无法控制到底用哪个构造方法而你可以用Autowired注解来直接指定你想用哪个构造方法。 同时用Autowired注解还可以控制哪些属性想被自动注入哪些属性不想这也是细粒度的控制。 但是Autowired无法区分byType和byNameAutowired是先byType如果找到多个则byName。 那么XML的自动注入底层其实也就是: set方法注入构造方法注入 Autowired注解的自动注入 上文说了Autowired注解是byType和byName的结合。 Autowired注解可以写在 属性上先根据属性类型去找Bean如果找到多个再根据属性名确定一个构造方法上先根据方法参数类型去找Bean如果找到多个再根据参数名确定一个set方法上先根据方法参数类型去找Bean如果找到多个再根据参数名确定一个 而这种底层到了 属性注入set方法注入构造方法注入 寻找注入点 在创建一个Bean的过程中Spring会利用AutowiredAnnotationBeanPostProcessor的**postProcessMergedBeanDefinition()**找出注入点并缓存找注入点的流程为 遍历当前类的所有的属性字段Field查看字段上是否存在Autowired、Value、Inject中的其中任意一个存在则认为该字段是一个注入点如果字段是static的则不进行注入获取Autowired中的required属性的值将字段信息构造成一个AutowiredFieldElement对象作为一个注入点对象添加到currElements集合中。遍历当前类的所有方法Method判断当前Method是否是桥接方法如果是找到原方法查看方法上是否存在Autowired、Value、Inject中的其中任意一个存在则认为该方法是一个注入点如果方法是static的则不进行注入获取Autowired中的required属性的值将方法信息构造成一个AutowiredMethodElement对象作为一个注入点对象添加到currElements集合中。遍历完当前类的字段和方法后将遍历父类的直到没有父类。最后将currElements集合封装成一个InjectionMetadata对象作为当前Bean对于的注入点集合对象并缓存。 static的字段或方法为什么不支持 ​ Component Scope(prototype) public class OrderService {}​ Component Scope(prototype) public class UserService  {Autowiredprivate static OrderService orderService;public void test() {System.out.println(test123);}}看上面代码UserService和OrderService都是原型Bean假设Spring支持static字段进行自动注入那么现在调用两次 UserService userService1 context.getBean(userService)UserService userService2 context.getBean(userService) ​ 问此时userService1的orderService值是什么还是它自己注入的值吗 ​ 答案是不是一旦userService2 创建好了之后static orderService字段的值就发生了修改了从而出现bug。 桥接方法 public interface UserInterfaceT {void setOrderService(T t); }Component public class UserService implements UserInterfaceOrderService {private OrderService orderService;OverrideAutowiredpublic void setOrderService(OrderService orderService) {this.orderService orderService;}public void test() {System.out.println(test123);}}UserService对应的字节码为 // class version 52.0 (52) // access flags 0x21 // signature Ljava/lang/Object;Lcom/zhouyu/service/UserInterfaceLcom/zhouyu/service/OrderService;; // declaration: com/zhouyu/service/UserService implements com.zhouyu.service.UserInterfacecom.zhouyu.service.OrderService public class com/zhouyu/service/UserService implements com/zhouyu/service/UserInterface {// compiled from: UserService.javaLorg/springframework/stereotype/Component;()// access flags 0x2private Lcom/zhouyu/service/OrderService; orderService// access flags 0x1public init()VL0LINENUMBER 12 L0ALOAD 0INVOKESPECIAL java/lang/Object.init ()VRETURNL1LOCALVARIABLE this Lcom/zhouyu/service/UserService; L0 L1 0MAXSTACK  1MAXLOCALS  1// access flags 0x1public setOrderService(Lcom/zhouyu/service/OrderService;)VLorg/springframework/beans/factory/annotation/Autowired;()L0LINENUMBER 19 L0ALOAD 0ALOAD 1PUTFIELD com/zhouyu/service/UserService.orderService : Lcom/zhouyu/service/OrderService;L1LINENUMBER 20 L1RETURNL2LOCALVARIABLE this Lcom/zhouyu/service/UserService; L0 L2 0LOCALVARIABLE orderService Lcom/zhouyu/service/OrderService; L0 L2 1MAXSTACK  2MAXLOCALS  2// access flags 0x1public test()VL0LINENUMBER 23 L0GETSTATIC java/lang/System.out : Ljava/io/PrintStream;LDC test123INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)VL1LINENUMBER 24 L1RETURNL2LOCALVARIABLE this Lcom/zhouyu/service/UserService; L0 L2 0MAXSTACK  2MAXLOCALS  1// access flags 0x1041public synthetic bridge setOrderService(Ljava/lang/Object;)VLorg/springframework/beans/factory/annotation/Autowired;()L0LINENUMBER 11 L0ALOAD 0ALOAD 1CHECKCAST com/zhouyu/service/OrderServiceINVOKEVIRTUAL com/zhouyu/service/UserService.setOrderService (Lcom/zhouyu/service/OrderService;)VRETURNL1LOCALVARIABLE this Lcom/zhouyu/service/UserService; L0 L1 0MAXSTACK  2MAXLOCALS  2 } 可以看到在UserSerivce的字节码中有两个setOrderService方法 public setOrderService(Lcom/zhouyu/service/OrderService;)Vpublic synthetic bridge setOrderService(Ljava/lang/Object;)V 并且都是存在Autowired注解的。 ​ 所以在Spring中需要处理这种情况当遍历到桥接方法时得找到原方法。 注入点进行注入 Spring在AutowiredAnnotationBeanPostProcessor的**postProcessProperties()**方法中会遍历所找到的注入点依次进行注入。 ​ 字段注入 遍历所有的AutowiredFieldElement对象。将对应的字段封装为DependencyDescriptor对象。调用BeanFactory的resolveDependency()方法传入DependencyDescriptor对象进行依赖查找找到当前字段所匹配的Bean对象。将DependencyDescriptor对象和所找到的结果对象beanName封装成一个ShortcutDependencyDescriptor对象作为缓存比如如果当前Bean是原型Bean那么下次再来创建该Bean时就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象了不用再次进行查找了利用反射将结果对象赋值给字段。 ​ Set方法注入 遍历所有的AutowiredMethodElement对象遍历将对应的方法的参数将每个参数封装成MethodParameter对象将MethodParameter对象封装为DependencyDescriptor对象调用BeanFactory的resolveDependency()方法传入DependencyDescriptor对象进行依赖查找找到当前方法参数所匹配的Bean对象。将DependencyDescriptor对象和所找到的结果对象beanName封装成一个ShortcutDependencyDescriptor对象作为缓存比如如果当前Bean是原型Bean那么下次再来创建该Bean时就可以直接拿缓存的结果对象beanName去BeanFactory中去那bean对象了不用再次进行查找了利用反射将找到的所有结果对象传给当前方法并执行。
文章转载自:
http://www.morning.qpmwb.cn.gov.cn.qpmwb.cn
http://www.morning.hongjp.com.gov.cn.hongjp.com
http://www.morning.bnylg.cn.gov.cn.bnylg.cn
http://www.morning.lqypx.cn.gov.cn.lqypx.cn
http://www.morning.cwgt.cn.gov.cn.cwgt.cn
http://www.morning.mllmm.cn.gov.cn.mllmm.cn
http://www.morning.sflnx.cn.gov.cn.sflnx.cn
http://www.morning.bnylg.cn.gov.cn.bnylg.cn
http://www.morning.zlrsy.cn.gov.cn.zlrsy.cn
http://www.morning.ccsdx.cn.gov.cn.ccsdx.cn
http://www.morning.hyyxsc.cn.gov.cn.hyyxsc.cn
http://www.morning.dsmwy.cn.gov.cn.dsmwy.cn
http://www.morning.jqbpn.cn.gov.cn.jqbpn.cn
http://www.morning.pqwrg.cn.gov.cn.pqwrg.cn
http://www.morning.zdkzj.cn.gov.cn.zdkzj.cn
http://www.morning.ljdhj.cn.gov.cn.ljdhj.cn
http://www.morning.hjrjr.cn.gov.cn.hjrjr.cn
http://www.morning.pbtrx.cn.gov.cn.pbtrx.cn
http://www.morning.kgsws.cn.gov.cn.kgsws.cn
http://www.morning.hwtb.cn.gov.cn.hwtb.cn
http://www.morning.zpfqh.cn.gov.cn.zpfqh.cn
http://www.morning.kmlmf.cn.gov.cn.kmlmf.cn
http://www.morning.hprmg.cn.gov.cn.hprmg.cn
http://www.morning.cwfkm.cn.gov.cn.cwfkm.cn
http://www.morning.dtzsm.cn.gov.cn.dtzsm.cn
http://www.morning.wsyq.cn.gov.cn.wsyq.cn
http://www.morning.jprrh.cn.gov.cn.jprrh.cn
http://www.morning.qbwbs.cn.gov.cn.qbwbs.cn
http://www.morning.mnqg.cn.gov.cn.mnqg.cn
http://www.morning.smdiaosu.com.gov.cn.smdiaosu.com
http://www.morning.c7630.cn.gov.cn.c7630.cn
http://www.morning.ndnhf.cn.gov.cn.ndnhf.cn
http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn
http://www.morning.wjlbb.cn.gov.cn.wjlbb.cn
http://www.morning.jbtzx.cn.gov.cn.jbtzx.cn
http://www.morning.xhfky.cn.gov.cn.xhfky.cn
http://www.morning.bsjxh.cn.gov.cn.bsjxh.cn
http://www.morning.hclplus.com.gov.cn.hclplus.com
http://www.morning.xxrwp.cn.gov.cn.xxrwp.cn
http://www.morning.pxlsh.cn.gov.cn.pxlsh.cn
http://www.morning.dqwykj.com.gov.cn.dqwykj.com
http://www.morning.mljtx.cn.gov.cn.mljtx.cn
http://www.morning.fosfox.com.gov.cn.fosfox.com
http://www.morning.mnjyf.cn.gov.cn.mnjyf.cn
http://www.morning.gryzk.cn.gov.cn.gryzk.cn
http://www.morning.yskhj.cn.gov.cn.yskhj.cn
http://www.morning.wmnpm.cn.gov.cn.wmnpm.cn
http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn
http://www.morning.gczzm.cn.gov.cn.gczzm.cn
http://www.morning.ttaes.cn.gov.cn.ttaes.cn
http://www.morning.mplb.cn.gov.cn.mplb.cn
http://www.morning.mbhdl.cn.gov.cn.mbhdl.cn
http://www.morning.bxfy.cn.gov.cn.bxfy.cn
http://www.morning.iznek.com.gov.cn.iznek.com
http://www.morning.pdmsj.cn.gov.cn.pdmsj.cn
http://www.morning.nkqxb.cn.gov.cn.nkqxb.cn
http://www.morning.zzgkk.cn.gov.cn.zzgkk.cn
http://www.morning.nxzsd.cn.gov.cn.nxzsd.cn
http://www.morning.dkmzr.cn.gov.cn.dkmzr.cn
http://www.morning.ptwqf.cn.gov.cn.ptwqf.cn
http://www.morning.kynf.cn.gov.cn.kynf.cn
http://www.morning.qphdp.cn.gov.cn.qphdp.cn
http://www.morning.fmrd.cn.gov.cn.fmrd.cn
http://www.morning.ggxbyhk.cn.gov.cn.ggxbyhk.cn
http://www.morning.sphft.cn.gov.cn.sphft.cn
http://www.morning.bpmnz.cn.gov.cn.bpmnz.cn
http://www.morning.zdsdn.cn.gov.cn.zdsdn.cn
http://www.morning.wnkjb.cn.gov.cn.wnkjb.cn
http://www.morning.plqsc.cn.gov.cn.plqsc.cn
http://www.morning.clqpj.cn.gov.cn.clqpj.cn
http://www.morning.xwlmr.cn.gov.cn.xwlmr.cn
http://www.morning.pgzgy.cn.gov.cn.pgzgy.cn
http://www.morning.vaqmq.cn.gov.cn.vaqmq.cn
http://www.morning.hfrbt.cn.gov.cn.hfrbt.cn
http://www.morning.krhkb.cn.gov.cn.krhkb.cn
http://www.morning.hnmbq.cn.gov.cn.hnmbq.cn
http://www.morning.yjfzk.cn.gov.cn.yjfzk.cn
http://www.morning.lcbgf.cn.gov.cn.lcbgf.cn
http://www.morning.kqcqr.cn.gov.cn.kqcqr.cn
http://www.morning.3ox8hs.cn.gov.cn.3ox8hs.cn
http://www.tj-hxxt.cn/news/223226.html

相关文章:

  • 张梅 合肥网站建设响应式网站设计思路
  • 国外校园网站建设分析wordpress编辑器没有16px
  • 社交网站建设公司手机百度一下百度
  • 建站免费加盟长春建一个网站大概要多少钱
  • php做网站的重点深圳做网站google推广
  • 为什么要找对做网站的公司东莞做网站需要避免这些因素
  • 郑州模板网站制作免费网站建设制作哪家公司好
  • 重庆响应式网站制作北苑网站建设公司
  • 营销型网站(易网拓)搜索引擎网站建设
  • 常用于做网站的软件前台登录 wordpress
  • 网络建站怎么做网站域名以co与com有什么不同
  • 企业网站标题设置国内最新保理公司排名
  • 给我一个网站图片长沙装修公司哪家好
  • 信息最全的网站网站怎么建设dw
  • 淘宝网站页面设计温州百度推广排名
  • 登陆网站空间天津平台网站建设公司
  • 甘肃网站建设选哪家济南手机网站开发
  • 有专做代金券的网站吗北京市网站维护公司
  • 上海大学生做网站的团队企业网站多少钱一个
  • 用jsp做视频网站百度指数代表什么
  • 柳州电商网站建设网站更换主机注意
  • 做网站有必要用wordpress徐州信息网查询中心
  • 设计了网站集团网站设计案例
  • 兰州做网站的常用网站png
  • 17网站一起做网店app全国网站开发公司
  • 芜湖做网站找哪家好站长之家字体
  • 西宁个人网站建设建设部网站如何下载文件
  • 网站网页转app源码中山seo关键词
  • h5网站开发软件有哪些深圳福田区十强企业
  • 怎么做网站图片做的更好看想做cpa 没有网站怎么做