你可能使用了Spring最不推荐的注解方式

  前言
  
  使用Spring框架最核心的两个功能就是IOC和AOP。IOC也就是控制反转,我们将类的实例化、依赖关系等都交由Spring来处理,以达到解耦合、利用复用、利于测试、设计出更优良程序的目的。而对用户来说,操作最对的便是注解。在Spring中提供了三类注解方式,下面我们就逐一分析。最后,你会发现,你最常用、看起来最方便的形式确实最不推荐的一种形式。
  
  常见的注入方式
  
  Field注入
  
  @Controller
  
  public class FooController {
  
  @Autowired
  
  // @Resource
  
  private FooService fooService;
  
  此种注解方式,应用最广泛:
  
  注入简单,只需在字段上添加@Autowired或@Resource;
  
  减少大量冗余代码,美观;
  
  新增Field时不需要过多代码修改;
  
  构造函数注入
  
  @Controller
  
  public class FooController {
  
  private final FooService fooService;
  
  private final FooService1 www.michenggw.com fooService1;
  
  @Autowired
  
  public FooController(www.dasheng178.com FooService fooService,FooService1 fooService1) {
  
  this.fooService = fooService;
  
  this.fooService1 = fooService1;
  
  
  @Controller
  
  public class FooController {
  
  private final FooService fooService;
  
  // 当只有一个参数时可不写@Autowired
  
  public FooController(FooService www.ysyl157.com fooService) {
  
  this.fooService = fooService;
  
  Spring4.x推荐的注入方式。对比Field注入:
  
  代码臃肿
  
  新增Field修改麻烦
  
  当Field多余5个时不符合构造方法的基本规范,显得笨重、臃肿;
  
  setter注入
  
  @Controller
  
  public class FooController {
  
  private FooService fooService;
  
  @Autowired
  
  public void setFooService(FooService fooService) {
  
  this.fooService = fooService;
  
  
  Spring3.x推荐的注入方式,但并没有被广泛应用,当初推荐的理由:
  
  解决了构造器注入的笨重;
  
  可以让类在之后重新配置或者重新注入。
  
  为什么Spring4.x推荐构造函数注入
  
  在上面的分析看来,构造函数注入好像并没有显现出来它的优势,但问什么Spring4.x会推翻之前推荐的setter注入,采用构造函数注入呢?官方的理由汇总如下:
  
  依赖不可变:加入了final来约束修饰Field,这条是很显然的;
  
  依赖不可为空:在实例化的时候会检查构造函数参数是否为空,如果为空(未找到改类型的实例对象)则会抛出异常。
  
  单一职责:当使用构造函数注入时,如果参数过多,你会发现当前类的职责过大,需要进行拆分。而使用Field注入时,你并不会意识到此问题。
  
  更利于单元测试:按照其他两种方式注入,当单元测试时需要初始化整个spring的环境,而采用构造方法注入时,只需要初始化需要的类即可,即可以直接实例化需要的类。
  
  避免IOC容器以外环境调用时潜在的NPE(空指针异常)。
  
  避免循环依赖。
  
  保证返回客户端(调用)的代码的时候是完全初始化的状态。
  
  疑问
  
  如果有大量依赖需要注入,怎么办?
  
  如果有大量依赖需要注入说明该类的职责过于复杂,需要遵从单一性原则进行拆分;
  
  其他注入方式是否合理?
  
  存在即合理,根据具体情况可以采用最适合的方式。比如,可以同时使用@Qualifier来达到一些约束限定的目的。也可以使用setter注入和构造函数注入相结合的方式来进行注入。
 

原文地址:https://www.cnblogs.com/qwangxiao/p/10203779.html

时间: 2024-08-14 15:24:51

你可能使用了Spring最不推荐的注解方式的相关文章

Spring知识点总结(三)之注解方式实现IOC和DI

    1. 注解概念        所谓注解就是给程序看的提示信息,很多时候都用来作为轻量级配置的方式.        关于注解的知识点,参看java基础课程中java基础加强部分的内容.    2. Spring中的注解        Spring除了默认的使用xml配置文件的方式实现配置之外,也支持使用注解方式实现配置,这种方式效率更高,配置信息清晰,修改更方便,推荐使用.                引入context名称空间:            在MyEclipse中导入spri

spring 声明式事务管理注解方式实现

使用注解实现Spring的声明式事务管理,更加简单! 步骤: 1) 必须引入Aop相关的jar文件 2) bean.xml中指定注解方式实现声明式事务管理以及应用的事务管理器类 3)在需要添加事务控制的地方,写上: @Transactional @Transactional注解: 1)应用事务的注解 2)定义到方法上: 当前方法应用spring的声明式事务 3)定义到类上:   当前类的所有的方法都应用Spring声明式事务管理; 4)定义到父类上: 当执行父类的方法时候应用事务. 案例: 1.

Spring MVC 数据验证——validate注解方式

1.说明 学习注解方式之前,应该先学习一下编码方式的spring注入.这样便于理解验证框架的工作原理.在出错的时候,也能更好的解决问题.所以本次博客教程也是基于编码方式,只是在原来的基础加上注解方式. 2.配置信息 web.xml不需要改变的 hello-servlet.xml将原来的加载方式,改为自动加入有hibernate和Spring提供的validate的默认类,配置如下: <?xml version="1.0" encoding="UTF-8"?&g

【Spring】—AOP之AspectJ注解方式实现声明式事务管理

前言 这回来说下注解方式的声明式事务管理. 正文 Demo 1.引入相关的jar包这里写图片描述 2.引入AOP约束<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/con

spring实现读写分离aop注解方式

1.场景,实现数据库的读写分离. 2.思路,既然是读写分离,那就是需要切换不同的数据源,一种是静态切换,就是提前配置好两个静态数据库资源,还有一种就是动态的切换资源,这里用到spring,那就要知道spring如何动态的切换数据源. 3.spring提供了动态切换数据源接口AbstractRoutingDataSource,关于AbstractRoutingDataSource这个类我们可以看下它的源码 protected DataSource determineTargetDataSource

Spring学习事务管理--基于注解方式(三)

图书类接口 package com.spring.tx; public interface BookShopDao { /** * 根据书号查找加个 * @param isbn * @return */ public int findBookPriceByIsbn(String isbn); /** * 更新书的库存 * @param isbn */ public void updateBookStock(String isbn); /** * 更新账户 * @param username *

Spring 4 MVC HelloWorld 纯注解方式(带源码)【超赞】

[本系列其他教程正在陆续翻译中,点击分类:spring 4 mvc 进行查看] [翻译 by 明明如月 QQ 605283073] #项目下载地址:http://websystique.com/?smd_process_download=1&download_id=1722#. 上一篇:Spring 4 MVC hello world 教程-完全基于XML(带项目源码) 下一篇: Spring 4 MVC 表单校验资源处理(带源码) 在上一个例子:Spring 4 MVC hello world

spring的bean管理(注解方式)

1.Spring的Bean管理的中常用的注解 @Component:组件.(作用在类上) public interface UserDao {     public void sayHello(); }   @Component(value="userDao")     public class UserDaoImpl implements UserDao {   @Override public void sayHello() {     System.out.println(&qu

「spring」定时任务(纯注解方式)

[问题现象] 需要通过纯注解方式启动定时任务,网上搜索到的定时任务大部分都是配置+注解. [问题解决] /** * 定时任务:打印CPU使用率 */@Component@EnableSchedulingpublic class PrintCpuWorker {    @Scheduled(cron="0/10 * *  * * ? ") // 每10秒一次    public void print() {        System.out.println("PrintCpu