依赖注入

我们在 Spring — 循环依赖 中谈到 Spring 的两种依赖注入方式

  • 构造器注入
  • 属性注入(setter注入也归属于此)
@Service
public class HelloService {/*** 属性注入*/@Autowiredprivate BeanFactory beanFactory;/*** 构造器注入*/public HelloService(ApplicationContext applicationContext) {}/*** 属性注入* */@Autowiredpublic void setEnvironment(Environment environment) {System.out.println("");}
}

关于构造函数实例化策略的文章已经在 Spring 源码–Bean 实例化 和 Spring 实例化–谁是我的候选人 已经谈及过

那么 @Autowired 放在属性上和放在 setter 方法上有什么不一样呢 ? 其实对于 Spring 来说都是一样的、都是一个注入元素。

AutowiredAnnotationBeanPostProcessor#postProcessProperties 该方法在 bean 实例化之后被调用

那么构造函数注入和属性注入的差别和适用场景是啥?

  • 构造函数注入注入的时机是先于属性注入的、并且是强依赖的
  • 对于那些非必需的依赖、推荐使用属性注入

方法注入

Lookup

方法注入的本质实际上是 Spring 继承你当前类、通过CGLib 产生子类并且重写需要注入的方法。

可能这么说有的不明所以,看个例子

@Service
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class PrintService {private int printCount;public void print(String name) {System.out.println("hi! " + name + " " + printCount++);}
}
@Service
public class HelloService {@Autowiredprivate PrintService printService;public void sayHi(String name) {printService.print(name);}
}

PrintService 是一个 prototype 类型的 bean、HelloService 是一个 singleton 、我的本意是每次调用 sayHi 方法的时候都能使用一个新创建的 PrintService 对象,但是单纯靠属性注入或者构造函数注入都是不能够实现的。

或许你可能会想到使用 ApplicationContext / BeanFactory 每次使用 PrintService 的时候去 Spring 中获取,这样子就能每次获取到一个新创建的实例。这样当然可以、但是既然逻辑都是这样、框架能不能帮我们做呢 ? 当然是可以的

@Service
public class HelloService {public void sayHi(String name) {getPrintService().print(name);}@Lookup("printService")protected PrintService getPrintService(){return null;}
}

@Lookup 修饰的方法必须是可被子类覆盖的、如果没有设置 beanName 给 @Lookup 注解、那么则根据方法返回类型从 Spring 中获取该 bean

public @interface Lookup {String value() default "";
}

这段代码其实我们在 Spring 源码–Bean 实例化 和 Spring 实例化–谁是我的候选人 曾经遇到过、只是没有点进来详细了解。

如果你用 @Lookup 修饰的方法的类是通过配置类去实例化的话、那么这个注解则会失效。只有通过构造函数实例化的 bean 才能被 Spring 处理、使用 CGLib 产生子类。

MethodReplacer

第二种则是 MethodReplacer

 <bean name="replacer" class="springroad.deomo.chap4.MethodReplace"> </bean> <bean name="testBean" class="springroad.deomo.chap4.LookupMethodBean"><replaced-method name="test" replacer="replacer"> </replaced-method> </bean>
 public class LookupMethodBean {public void test(){System.out.println("原始方法!");}}public class MethodReplace implements MethodReplacer {public Object reimplement(Object obj, Method method, Object[] args)throws Throwable {System.out.println("方法已经被替换!");return null;}
}

暂时没有找到 MethodReplacer 相关的注解、只能用原始的 xml 配置

原理跟 Lookup 也是一样的

是不是跟 AOP 很像、但是其实是不一样的、MethodReplacer 你是永远没有办法调回被覆盖的方法的、它是完全覆盖的、而不是像 AOP 那样可以前置后置拦截。所以实际业务上很少地方可以用到这个 MethodReplacer 、能用到它的 AOP 都能做到、甚至比它灵活太多

今天的文章就到这咯~~

本文由博客一文多发平台 OpenWrite 发布!

Spring--依赖注入 or 方法注入 ?相关推荐

  1. Spring官网阅读(二)(依赖注入及方法注入)

    上篇文章我们学习了官网中的1.2,1.3两小节,主要是涉及了容器,以及Spring实例化对象的一些知识.这篇文章我们继续学习Spring官网,主要是针对1.4小节,主要涉及到Spring的依赖注入.虽 ...

  2. Spring(2)bean注入--Set方法注入

    Spring(2)bean注入–Set方法注入 Set 方法注入 新建一个空的 maven项目. 导入依赖 <properties><project.build.sourceEnco ...

  3. 依赖注入_set方法注入_构造器注入

    属性注入 属性注入即通过 setter 方法注入Bean 的属性值或依赖的对象 属性注入使用 <property> 元素, 使用 name 属性指定 Bean 的属性名称,value 属性 ...

  4. Spring4.x(11)依赖注入-setter方法注入

    依赖注入-setter方法注入 通过无参构造函数+setter方法注入. 一.编写CustomerDao接口 package com.yiidian.dao; /*** * @author http: ...

  5. java的lookup方法_深入理解Spring中的Lookup(方法注入)

    前言 本文主要给大家介绍了关于Spring中Lookup(方法注入)的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍: 在使用Spring时,可能会遇到这种情况:一个单例的Be ...

  6. 2.1、spring属性注入-Set方法注入

    代码地址:spring2.1.zip - 蓝奏云文件大小:15.1 K|https://www.lanzouw.com/imlEwvptwre Set方法注入的原理是spring先通过指定id的类的无 ...

  7. 最全的 Spring 依赖注入方式,你都会了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 前言 Spring 正如其名字,给开发者带来了春天,Spring 是为解决企业级应用开发的复杂性而设计的一款框架,其设计理念就是:简 ...

  8. spring依赖注入底层原理与源码分析

    Spring中有几种依赖注入方式? 1.手动注入-set方法注入和构造器注入 2.自动注入-@Autowired注解和xml注入 autowrire参数: no 默认不开启 byName 根据被注入属 ...

  9. spring 依赖注入总结

    一.问题引入 官方为什么推荐构造器注入? 构造器注入和属性注入的区别是啥? 你知道有几种注入方式吗? 二  注入方式 spring的注入方式就两种 配置注入,注解注入(自动装配) 而这两种方式都实现了 ...

最新文章

  1. 分布式服务框架 Zookeeper -- 管理分布式环境中的数据
  2. 是否finally块总是用Java执行?
  3. 转载 React.createClass 对决 extends React.Component
  4. jQuery 元素操作——遍历元素
  5. ASP.NET MVC 获取当前访问域名
  6. 修改手机屏幕刷新率_手机屏幕没有高刷新率算不上旗舰机?看看网友都是如何回答的...
  7. 动环监控系统接线图_机房动环监控系统报价
  8. Json简介与转换数据例子
  9. 嵌入式分享合集118
  10. Codeforces Gym 100339B Diversion 树形DP + LCA
  11. CF 106C Buns
  12. 洛谷-P1428-小鱼比可爱
  13. 阿里云虚拟机【yum】命令出现错误
  14. 微信小程序跳小程序short-link(#小程序://)
  15. 对话姚期智:中国人工智能界是怎么被我教出来的?
  16. jquery uploadify 用法详解
  17. 老婆小厂程序媛竟想在北京买房!
  18. sql语句-既包含又包含
  19. 再白也能学会的C-引子
  20. 苹果创始人乔布斯简介_iPhone SE 2,一款致敬乔布斯的经典,非全面屏时代的收官之作...

热门文章

  1. 医疗图像这6个数据集,赶紧收藏备用!
  2. 实践--问题定位:FeignException$UnsupportedMediaType: [415 ]
  3. 详解Instagram价值7.5亿美元的简洁技术(PPT)
  4. 数据库连接失败的问题
  5. 可以坚持实践为先的课外学习
  6. 常用数据特征提取,时域特征、频域特征、小波特征提取汇总;特征提取;有效matlab代码
  7. 互联网经济的发展基石
  8. IKAnalyzer实现中文分词
  9. 机器学习之KNN算法,朴素贝叶斯,决策树,SVM算法比较
  10. unity 计时器_如何用unity 物理系统 实现Stickfight中火柴人的布娃娃效果(二)