深入Spring专题(14)

65 阅读2分钟

这是我参与2022首次更文挑战的第20天,活动详情查看2022首次更文挑战

字段注入

其实字段注入有一些缺点:

  • 使用字段注入可容易添加依赖项,不要违反单一责任原则,拥有更多的依赖项意味着担负更多的责任。这可能在重构时出现难以分离的问题。当使用构造函数或setter设置依赖项时,可容易看出类变得臃肿。但是当使用字段注入时却难看出来。
  • 注入依赖项的责任在Spring中由容器承担,但类应该通过方法或构造函数传达使用公共接口所需的依赖项类型。而如果使用字段注入,则可能很难搞清楚什么类型的依赖项是真正需要的,以及依赖项是不是强制性的。
  • 字段注入引入了Spring容器的依赖项,因为@Autowired注解是Spring组件,因此这个Bean不再是一个POJO,并且不能独立实例化。
  • 字段注入不能用于final字段,这种类型的字段只能使用构造函数注入来初始化。
  • 由于必须手动注入依赖项,因此在编写测试时,字段注入带来困难。

使用注入参数

Spring支持多种注入参数选项,不仅可注入其他组件和简单值,还可以注入Java集合、外部定义的属性以及其他工厂中的bean。通过分别使用和标记下的相应标记,可将这些注入参数类型用于setter注入和构造函数注入。

注入简单值

只需要在配置标记中指定值,并将其包含在标记内即可。默认情况下,标记不仅可以读取String值,还可以将这些值转换为任何原始值或原始值包装类。bean具有多种用于注入的属性代码如下:

public class InjectSimple{
    private String name;
    private int age;
    private float height;
    private boolean programmer;
    private Long ageInSeconds;
    public static void main(String... args){
        GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();
        ctx.load("classpath:spring/app-context-xml.xml");
        ctx.refresh();
        
        InjectSimple injectSimple=ctx.getBean("injectSimple");
        System.out.println(injectSimple);
        ctx.close();
    }
    
    public void setAgeInSeconds(Long ageInSeconds){
        this.ageInSeconds=ageInSeconds;
    }
    
    public void setProgrammer(boolean programmer){
		this.programmer=programmer;
    }
    public void setAge(int age){
        this.age=age;
    }
    public void setHeight(float height){
        this.height=height;
    }
    public void setName(String name){
        this.name=name;
    }
    public String toString(){
        return "Name:"+name+"\n"+
            	"Age:"+age+"\n"+
            	"Age in Seconds:"+ageInSeconds+"\n“+
            	"Height:"+height+"\n"+
            	"Is Programmer?:"+programmer;
    }
}