通过实例了解java spring使用构造器注入的原因
2020-03-11 17:52
477 查看
这篇文章主要介绍了通过实例了解spring使用构造器注入的原因,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
一、前言
Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由Spring的IOC容器管理,将对象的依赖关系由Spring控制,避免硬编码所造成的过度程序耦合。
二、常见的三种注入方式
2.1 field注入
@Controller public class FooController { @Autowired //@Inject private FooService fooService; //简单的使用例子,下同 public List<Foo> listFoo() { return fooService.list(); } }
这种注入方式应该是笔者目前为止开发中见到的最常见的注入方式。原因很简单:
注入方式非常简单:加入要注入的字段,附上@Autowired,即可完成。
使得整体代码简洁明了,看起来美观大方。
2.2 构造器注入
@Controller public class FooController { private final FooService fooService; @Autowired public FooController(FooService fooService) { this.fooService = fooService; } //使用方式上同,略 }
在Spring4.x版本中推荐的注入方式就是这种,相较于上面的field注入方式而言,就显得有点难看,特别是当注入的依赖很多(5个以上)的时候,就会明显的发现代码显得很臃肿
2.3 setter注入
@Controller public class FooController { private FooService fooService; //使用方式上同,略 @Autowired public void setFooService(FooService fooService) { this.fooService = fooService; } }
在Spring3.x刚推出的时候,推荐使用注入的就是这种,但是构造器注入参数太多了,显得很笨重,另外setter的方式能用让类在之后重新配置或者重新注入。
三、构造器注入的好处
这个构造器注入的方式,能够保证注入的组件不可变,并且确保需要的依赖不为空。此外,构造器注入的依赖总是能够在返回客户端(组件)代码的时候保证完全初始化的状态
- 依赖不可变:其实说的就是final关键字,这里不再多解释了。不明白的园友可以回去看看Java语法。
- 依赖不为空(省去了我们对其检查):当要实例化FooController的时候,由于自己实现了有参数的构造函数,所以不会调用默认构造函数,那么就需要Spring容器传入所需要的参数,所以就两种情况:1、有该类型的参数->传入,OK 。2:无该类型的参数->报错。所以保证不会为空,Spring总不至于传一个null进去吧 。
- 完全初始化的状态:这个可以跟上面的依赖不为空结合起来,向构造器传参之前,要确保注入的内容不为空,那么肯定要调用依赖组件的构造方法完成实例化。而在Java类加载实例化的过程中,构造方法是最后一步(之前如果有父类先初始化父类,然后自己的成员变量,最后才是构造方法,这里不详细展开)。所以返回来的都是初始化之后的状态。
四、总结
使用构造器注入的好处:
- 保证依赖不可变(final关键字)
- 保证依赖不为空(省去了我们对其检查)
- 保证返回客户端(调用)的代码的时候是完全初始化的状态
- 避免了循环依赖
- 提升了代码的可复用性
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
相关文章推荐
- Spring 使用注解注入,调用类实例出现 java.lang.NullPointException 问题的解决方法
- spring MethodInvokingFactoryBean 的使用和了解,Spring 通过通过方法创建Bean的实例
- 从头认识Spring-2.4 基于java的标准注解装配-@Inject(3)-通过构造器方法注入
- 使用dom4j:读取spring配置文件,实例化bean对象并注入依赖对象
- [java][spring]取得通过配置文件和注解注入的bean、取得当前数据库连接、取得ApplicationContext的方法
- 创建Bean的三种方式 在大多数情况下,Spring容器直接通过new关键字调用构造器来创建Bean实例,而class属性指定Bean实例的实现类,但这不是实例化Bean的唯一方法。实际上,Sprin
- java-Spring通过实例讲解信息与事件
- 从头认识Spring-2.4 基于java的标准注解装配-@Inject(1)-通过属性域注入
- java 使用memcached以及spring 配置memcached完整实例代码
- Spring的(简单配置和讲解IOC和DI)使用xml、注解、java.创建对象实例。
- 使用反射创建Bean、Spring中是如何根据类名配置创建Bean实例、Java提供了Class类获取类别的字段和方法,包括构造方法
- filter里使用spring 注入实例失败
- spring创建bean的三种方式-通过构造器,通过静态工厂方法,通过实例工厂方法
- Spring不能通过注解向Servlet中注入实例的原理和解决办法
- 关于Java Web 使用Spring中使用Quartz(定时调用、实现固定时间执行), 触发定时器(执行某些任务)的实例
- Spring代码实例系列-09:通过Spring PropertyPlaceholderConfigurer将properties配置的属性注入到xml配置文件中
- 通过实例了解java checked和unchecked异常
- spring 使用构造器方式依赖注入
- Quartz入门实例14-让Quartz的Job使用Spring注入的Bean
- Spring3.x--通过构造器注入