深入Spring专题(13)

266 阅读2分钟

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

深入Spring IoC专题(13)

注解式的构造函数注入,可通过将注解直接应用于目标构造函数方法来避免混淆,代码如下所示:

@Service("constructorConfusion")
public class ConstructorConfusion{
    private String value;
    
    public ConstructorConfusion(String value){
        System.out.println("ConstructorConfusion (String) called");
        this.value=value;
    }
    @Autowired
    public ConstructorConfusion(@Value("90") int value){
        System.out.println("ConstructorConfusion (int) called");
        this.value="Number"+String.valueOf(value);
    }
    public static void main(String... args){
        GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();
        ctx.load("classpath:spring/app-context-annotation.xml");
        ctx.reload();
        
        constructorConfusion cc=(ConstructorConfusion)ctx.getBean("constructorConfusion");
        System.out.println(cc);
        ctx.close();
    }
    
}

通过将@Autowired注解应用于所需的构造函数方法,Spring将使用该方法来实例化Bean并按照指定注入值,将配置的值外部化。

注意:

@Autowired注解只能应用于其中一个构造函数方法,如果将该直接应用于多个构造函数方法,Spring会在启动ApplicationContext时产生错误。

使用字段注入

Spring中支持的第三种依赖注入称为字段注入,依赖项直接注入字段中,不需要构造函数或setter,字段注入是通过使用Autowired注解来注解类成员完成。

@Service("singer")
public class Singer{
    
    @Autowired
    private Inspiration inspiration;
    
    public void sing(){
        	System.out.println(inspiration.getValue());
    }
}

字段是私有的,但Spring IoC容器不关注这个问题,它使用反射来填充所需的依赖项,Inspiration类代码如下,它是一个带有String成员的bean。

@Component
public class Inspiration{
	private String value=""bean content";
    public Inspiration(@Value("outsize value") String value){
        this.value=value;
    }
    public String getValue(){
        return value;
    }
   	public void setValue(String value){
       	this.value=value;
    }
}

使用组件扫描来发现bean,由Spring IoC容器创建的bean定义

<beans ...>
<context:component-scan base-package="com.ozx"/>
</beans>

当找到一个Inspiration类型的bean,Spring IoC容器会将该bean注入singer bean的inspiration成员中。

运行如下代码控制台输出结果:outsize value

public class FieldInjection{
    public static void main(String... args){
        GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();
        ctx.load("classpath:spring/app-context.xml");
        ctx.refresh();
        Singer singer=ctx.getBean(Singer.class);
        singer.sing();
        ctx.close();
    }
}