这是我参与2022首次更文挑战的第17天,活动详情查看2022首次更文挑战
使用Setter注入
使用XML配置来配置setter注入,需要在标记下指定标记,将消息提供程序Bean分配给messageRenderer Bean 的messageProvider属性,只需要更改renderer Bean的标记即可
<bean ..>
<bean id="renderer" class="co.ozx.StandardOutMessageRenderer">
<property name="messageProvider" ref="provider"></property>
<bean id="provider" class="com.ozx.BeanMessageProvider" />
</bean>
provider bean被分配给了messageProvider属性,可使用ref属性分配一个bean引用。
使用注解,则需要向setter方法添加一个@Autowired注解即可。
@Service("renderer")
public class StandardOutRenderer implements MessageRenderer{
@Override
@Autowired
public void setMessageProvider(MessageProvier messageProvider){
this.messagesProvider=messageProvider;
}
}
因为在XML配置文件中声明了cotext:component-scan标记,在Spring的ApplicationContext初始化期间,Spring发现这些@Autowired注解并根据需要注入依赖项。
使用构造函数注入
MessageProvider的实现BeanMessageProvider为getMessage()方法的每次调用都返回相同的硬编码信息。在Spring配置文件中,可创建一个可配置的MessageProvider,从而允许从外部定义消息。
public class ConfigurableMessageProvider implements MessageProvider{
private String message;
public ConfigurableMessageProvider(String message){
this.message=message;
}
@Override
public String getMessage(){
return message;
}
}
如果没有为消息提供一个值,就不可能创建ConfigurableMessageProvider实例。该类适合与构造函数注入使用。如何重新定义provider bean以创建ConfigurableMessageProvider实例,并使用构造函数注入来注入消息:
<beans xmls="http://www.springframework.org/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="messageProvider" class="com.ozx.ConfigurableMessageProvider">
<constructor-arg value=" message content" />
</bean>
</beans>
使用一个标记而不是标记。因为没有传入另一个bean,只是传入一个String文本,使用value属性而不是ref来指定构造函数参数的值。当有多个构造函数参数或你的类有多个构造函数时,需要为每个标记指定一个index属性,以指定构造函数签名中参数的索引,从0开始,对于具有多个参数的构造函数,通常最好使用index属性,以避免混淆参数并确保Spring选择正确的构造函数。