这是我参与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();
}
}