Spring注入方式及优缺点

Spring注入方式

Spring依赖注入的方式有:构造器注入,setter方法注入、属性注入、工厂方法注入,官方3.x版本推荐使用setter方法注入,到4.x之后官方推荐使用构造器注入。

1、构造器注入

通过构造器注入Shop这个Bean到Person中,可以将需要注入的字段声明为final,使其在类实例化期间被初始化。

@Component
public class Person {
    private final Shop shop;

    @Autowired
    public Person(Shop shop) {
        this.shop = shop;
    }
}

Spring 4.3版本之后,如果类中只有一个构造方法,则Spring会实现一个隐式的自动注入。

@Component
public class Person {
    private final Shop shop;

    // @Autowired
    public Person(Shop shop) {
        this.shop = shop;
    }
}

2、setter方法注入

@Component
public class Person {

    private Shop shop;

    @Autowired
    public void setShop(Shop shop) {
        this.shop = shop;
    }
    
}

3、属性注入

@Component
public class Person {

    @Autowired
    private Shop shop;
}

4、工厂方法注入

工厂方法实现注入,因为Spring ioc容器以框架的方式提供工厂方法的功能,并以透明的方式提供给开发者,因此手工编写基于工厂方法的注入这种方式不常用。

public class ShopFactory {

    public static Shop getShop(){
    	Shop shop = new Shop();
    	return shop;
    }
}
<bean id="shop" class="xxx.ShopFactory" factory-method="getShop" />

5、注入方式优缺点对比

1.属性注入

优点

  • 简单,便于添加新的依赖,项目中使用最多(然而是Spring官方不推荐的方式)
  • 减少大量冗余代码
  • 新增依赖时不需要修改过多代码

缺点 or 为什么Spring官方不推荐使用这种方式?

  • 单一职责侵入,添加依赖过于简单,添加了五个甚至十个依赖都很容易,使我们不易察觉违反单一职责原则的程序。
  • 无法声明不可变的字段,字段不能使用final修饰
  • 隐藏了依赖关系,使用依赖注入容器将获取依赖对象的职责从类中抽离出来交与IOC容器装配,当类不再为依赖对象负责时应该更明确的使用公有的接口方法或构造器来清楚的表明类需要什么依赖项。使用属性注入则将这些依赖对外进行了隐藏。
  • 与依赖注入容器紧耦合,依赖注入的核心思想是受容器管理的类不应该再与容器紧耦合,这个类应该是一个简单的类并且能够被单独实例化,这样在进行单元测试中实例化这个类时不必去启动IOC容器。

2.构造器注入

优点

  • 依赖不可变:可以使用final关键字来修饰依赖字段
  • 依赖不为空:允许构造函数可以保证一些重要属性在Bean实例化时就设置好
  • 单一职责原则:当使用构造函数注入时,如果参数过多可能会促使你主动对类进行拆分
  • 完全初始化的状态:保证返回客户端的代码是完全初始化的状态
  • 更好的封装类变量:不需要为每个属性指定Setter方法,避免外部错误的调用
  • 更利于单元测试:其它两种方式注入,进行单元测试时需要初始化整个Spring的环境
  • 避免循环依赖:若存在循环依赖则启动会抛异常

缺点

  • 当注入对象特殊多的时候,构造器会显得十分繁琐,可读性和可维护性较差;但此时也应该考虑类的功能是否过多,是否应该拆分
  • 灵活性不强,在有些属性是可选的情况下,如果通过构造器注入,需要为可选参数提供一个null值
  • 构造器不利于类的扩展和继承,子类需要引用父类复杂的构造函数

3.Setter方法注入

优点

  • 注入属性过多时,使用Setter方法更轻便
  • 方便在类实例化之后重新对该属性进行配置或注入

缺点

  • Setter方法过多会导致代码冗余,维护麻烦
  • 会把循环依赖隐藏掉
  • 依赖不是不可变的
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring和MyBatis都是非常流行的Java开发框架。它们各自有着一些优点和缺点,下面是一些常见的观点: Spring的优点: 1. 提供了丰富的IoC和AOP功能,使得应用程序的组件之间的依赖关系更加清晰和易于维护。 2. 提供了一个强大的事务管理框架,支持多种事务管理机制,包括编程式事务和声明式事务。 3. 提供了Spring MVC框架,使得开发Web应用程序更加容易和高效。 4. 提供了Spring Security框架,使得应用程序的安全性更容易实现。 Spring的缺点: 1. Spring的学习曲线相对较陡峭,需要花费一定的时间和精力来掌握其复杂的概念和功能。 2. Spring的配置文件可能相对较长和复杂,需要耐心和细心地编写和维护。 3. Spring的依赖注入(DI)可能导致应用程序的运行效率略微下降。 MyBatis的优点: 1. MyBatis提供了一个简单易用的ORM框架,使得Java开发人员可以更加容易地与数据库进行交互。 2. MyBatis的SQL映射文件可以提供更细粒度的控制,使得开发人员可以更加灵活地编写和维护SQL语句。 3. MyBatis支持多种数据库,包括MySQL、Oracle、SQL Server等。 MyBatis的缺点: 1. MyBatis需要开发人员手动编写SQL语句和映射文件,对于一些简单的查询可能需要编写大量的代码。 2. MyBatis缺乏一些高级的ORM功能,例如自动关联、延迟加载等。 3. MyBatis的配置文件可能相对较长和复杂,需要耐心和细心地编写和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值