深入Spring源码专题(11)

107 阅读2分钟

这是我参与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选择正确的构造函数。