【构造参数注入】
类有构造方法
public class ServiceTemplate {
private JmsMessageSender jmsMessageSender;
private EmailMessageSender emailMessageSender;
private WebServiceInvoker webServiceInvoker;
public ServiceTemplate(JmsMessageSender jmsMessageSender, EmailMessageSender emailMessageSender,
WebServiceInvoker webServiceInvoker) {
this.jmsMessageSender = jmsMessageSender;
this.emailMessageSender = emailMessageSender;
this.webServiceInvoker = webServiceInvoker;
logger.info("Invoked constructor: ServiceTemplate(JmsMessageSender jmsMessageSender,"
+ "EmailMessageSender emailMessageSender," + "WebServiceInvoker webServiceInvoker) ");
}
}
配置文件中使用constructor-arg
指定相应的值
<bean id="serviceTemplate"
class="sample.spring.chapter03.bankapp.base.ServiceTemplate">
<!--可以通过自动类型判断来寻找合适的构造参数-->
<constructor-arg name="emailMessageSender" ref="emailMessageSender" />
<constructor-arg name="jmsMessageSender" ref="jmsMessageSender" />
<constructor-arg name="webServiceInvoker" ref="webServiceInvoker" />
</bean>
<bean id="jmsMessageSender"
class="sample.spring.chapter03.bankapp.base.JmsMessageSender" />
<bean id="webServiceInvoker"
class="sample.spring.chapter03.bankapp.base.WebServiceInvoker" />
<bean id="emailMessageSender"
class="sample.spring.chapter03.bankapp.base.EmailMessageSender" />
【Set方法注入】
源码
public class FixedDepositController {
private static Logger logger = LogManager
.getLogger(FixedDepositController.class);
private FixedDepositService fixedDepositService;
public FixedDepositController() {
logger.info("initializing");
}
public void setFixedDepositService(FixedDepositService fixedDepositService) {
logger.info("Setting fixedDepositService property");
this.fixedDepositService = fixedDepositService;
}
public boolean submit() {
return fixedDepositService.createFixedDeposit(new FixedDepositDetails(
1, 10000, 365, "someemail@something.com"));
}
public FixedDepositDetails get() {
return fixedDepositService.getFixedDepositDetails(1L);
}
}
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="controller"
class="sample.spring.chapter01.bankapp.FixedDepositController">
<property name="fixedDepositService" ref="service" />
</bean>
<bean id="service"
class="sample.spring.chapter01.bankapp.FixedDepositService">
<property name="fixedDepositDao" ref="dao" />
</bean>
<bean id="dao" class="sample.spring.chapter01.bankapp.FixedDepositDao" />
</beans>
在spring-beans.xsd schema中定义的<beans>元素是应用程序上下文的XML文件的根元素。
图示
Spring容器创建bean的顺序取决于它们在applicationContext.xml文件中的定义顺序。Spring容器确保在调用setter方法之前完全配置了一个bean的依赖关系。例如FixedDepositController Bean依赖于FixedDepositService Bean,那在调用FixedDepositController的set方法前,Spring容器会配置好
FixedDepositService
set方法注入可以和构造器注入结合