本文討論最簡(jiǎn)單的 Spring setter 方法實(shí)現(xiàn)依賴注入的方法竟秫。
我們主要討論手動(dòng)模式的 setter 方法實(shí)現(xiàn)依賴注入荚孵,主要有三種模式货徙。
- xml 資源配置元信息
- Java 注解配置元信息
- API 配置元信息
首先上代碼結(jié)構(gòu)圖:
我們定義 model 類 Employee,兩個(gè)最簡(jiǎn)單屬性:String name 和 Long id挟鸠。
Boss 類繼承 Employee 類嘉赎,并且添加屬性 String title置媳。兩個(gè)類都加上 getter/ setter 方法和 toString() 方法。
我們首先定義基本的 dependency-injection-context.xml 文件公条,來(lái)定義 Employee 和 Boss 的 Spring bean拇囊。
<?xml version="1.0" encoding="UTF-8"?>
<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">
<!--實(shí)時(shí)查找 bean 的方式-->
<bean id="emp" class="container.overview.domain.Employee">
<property name="id" value="1"></property>
<property name="name" value="小明"></property>
</bean>
<bean id="boss" class="container.overview.domain.Boss" parent="emp" primary="true">
<property name="title" value="CTO"></property>
</bean>
</beans>
然后我們定義一個(gè) UserHolder 類來(lái)放置 Employee 類。
public class UserHolder {
private Employee employee;
public UserHolder(Employee employee) {
this.employee = employee;
}
/*public UserHolder() {
}*/
public Employee getEmployee() {
return employee;
}
public void setEmployee(Employee employee) {
this.employee = employee;
}
@Override
public String toString() {
return "UserHolder{" +
"employee=" + employee +
'}';
}
}
xml 資源配置元信息
相關(guān) xml 文件
<?xml version="1.0" encoding="UTF-8"?>
<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">
<import resource="classpath:/META-INF/dependency-injection-context.xml"/>
<bean class="ioc.dependency.injection.UserHolder">
<property name="employee" ref="boss"/>
</bean>
</beans>
我們第一個(gè)最簡(jiǎn)單的方式就是使用 xml 來(lái)實(shí)現(xiàn)依賴注入靶橱。如上面的 xml 文件所示寥袭,我們的 UserHolder 類的 <property name="employee" ref="boss"/>
。
Java 代碼:
public class XmlDependencyInjectionDemo {
public static void main(String[] args) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // 這個(gè)類可以實(shí)現(xiàn)層次性关霸、集合類型传黄、單一類型的
// 查找。
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);
String resourcePath = "classpath:/META-INF/dependency-setter-injection.xml";
// 加載 xml 資源谒拴,解析并且生成 BeanDefinition
xmlBeanDefinitionReader.loadBeanDefinitions(resourcePath);
UserHolder userHolder = beanFactory.getBean(UserHolder.class);
System.out.println(userHolder);
}
}
Java 注解配置元信息
public class AnnotationDependencyInjectionDemo {
public static void main(String[] args) {
// 創(chuàng)建 beanFactory 容器
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 注冊(cè)配置類來(lái)取代我們的 xml 文件。
applicationContext.register(AnnotationDependencyInjectionDemo.class);
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
String resourceLocation = "META-INF/dependency-injection-context.xml";
// 加載 xml 資源涉波,解析并且生產(chǎn) beanDefinition
xmlBeanDefinitionReader.loadBeanDefinitions(resourceLocation);
applicationContext.refresh();
UserHolder holder = applicationContext.getBean(UserHolder.class);
System.out.println(holder);
applicationContext.close();
}
@Bean
public UserHolder userHolder(Employee employee) {
return new UserHolder(employee);
}
}
將當(dāng)前類作為配置類英上,然后使用 @Bean 注解注入 Spring bean。
API 配置元信息
public class APIDependencyInjectionDemo {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
// 生成并且注冊(cè) UserHolder 的 beanDefinition
BeanDefinition beanDefinition = createDefinition();
applicationContext.registerBeanDefinition("userHolder",beanDefinition);
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);
String resourceLocation = "META-INF/dependency-injection-context.xml";
xmlBeanDefinitionReader.loadBeanDefinitions(resourceLocation);
// 啟動(dòng)應(yīng)用上下文
applicationContext.refresh();
UserHolder userHolder = applicationContext.getBean(UserHolder.class);
System.out.println(userHolder);
applicationContext.close();
}
private static BeanDefinition createDefinition() {
BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.genericBeanDefinition(UserHolder.class);
beanDefinitionBuilder.addPropertyReference("employee","boss");
return beanDefinitionBuilder.getBeanDefinition();
}
}
使用相關(guān)的 API 來(lái)實(shí)現(xiàn) setter 注入依賴啤覆。
完整代碼放在我的 github 上苍日。戳此可以查看
本文參考資料:小馬哥講Spring核心編程思想
自動(dòng)注入可以參考我的另一篇文章 自動(dòng)注入 autowire 中 byName 和 byType 的區(qū)別