java setter 注入_Spring 使用 setter 方法实现依赖注入的三种方式

本文讨论最简单的 Spring setter 方法实现依赖注入的方法。

我们主要讨论手动模式的 setter 方法实现依赖注入,主要有三种模式。

xml 资源配置元信息

Java 注解配置元信息

API 配置元信息

首先上代码结构图:

c2ec04d489fb

在这里插入图片描述

我们定义 model 类 Employee,两个最简单属性:String name 和 Long id。

Boss 类继承 Employee 类,并且添加属性 String title。两个类都加上 getter/ setter 方法和 toString() 方法。

我们首先定义基本的 dependency-injection-context.xml 文件,来定义 Employee 和 Boss 的 Spring bean。

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">

然后我们定义一个 UserHolder 类来放置 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 资源配置元信息

相关 xml 文件

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">

我们第一个最简单的方式就是使用 xml 来实现依赖注入。如上面的 xml 文件所示,我们的 UserHolder 类的 。

Java 代码:

public class XmlDependencyInjectionDemo {

public static void main(String[] args) {

DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); // 这个类可以实现层次性、集合类型、单一类型的

// 查找。

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) {

// 创建 beanFactory 容器

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

// 注册配置类来取代我们的 xml 文件。

applicationContext.register(AnnotationDependencyInjectionDemo.class);

XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(applicationContext);

String resourceLocation = "META-INF/dependency-injection-context.xml";

// 加载 xml 资源,解析并且生产 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);

}

}

将当前类作为配置类,然后使用 @Bean 注解注入 Spring bean。

API 配置元信息

public class APIDependencyInjectionDemo {

public static void main(String[] args) {

AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

// 生成并且注册 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);

// 启动应用上下文

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();

}

}

使用相关的 API 来实现 setter 注入依赖。

完整代码放在我的 github 上。戳此可以查看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值