Spring 基于Java的配置示例
在Spring XML Configuration Example中,我们看到了如何在XML中指定配置元数据,该元数据用于注册bean和连接依赖性。 Spring框架还提供了基于Java的配置来配置Spring容器,在这个基于Spring Java的配置示例中,我们将了解如何完成此操作。
Spring 基于Java的配置
Spring的基于Java的配置中的主要注释是@Configuration和@Bean。
- @Configuration –用@Configuration注释类表示该类用作Bean定义的源。此外,@Configuration类允许通过调用同一类中的其他@Bean方法来定义Bean之间的依赖关系。
- @Bean – @Bean注释用于指示方法实例化,配置和初始化要由Spring IoC容器管理的新对象。 @Bean注释与XML配置中的元素具有相同的作用。我们可以将@Bean注释的方法与任何Spring @Component一起使用。但是,它们最常与@Configuration bean一起使用。
例如,以下基于Java的配置
@Configuration
public class AppConfig {
@Bean
public OrderService orderService() {
return new OrderServiceImpl();
}
}
等效于以下XML配置
<beans> <bean id="orderService" class="com.theitroad.service.OrderServiceImpl"/> </beans>
Spring 基于Java的配置示例
在该示例中,有一个用于下订单的类称为Order,可以从商店进行购买。 Order and Store bean和bean依赖项将使用基于Java的配置进行配置。
对于此基于Spring Java的配置示例,Maven构建工具用于管理依赖项。请参阅在Eclipse中使用Maven创建Java项目,以了解如何创建Maven项目。
Maven依赖
对于此示例,我们需要spring核心和spring上下文依赖项。使用的Spring Version是5.1.8 Release,它在properties元素下定义。
Spring核心提供了基本框架类和与其他模块进行交互的类。
Spring上下文模块提供了org.springframework.context.ApplicationContext接口,该接口表示Spring IoC容器,并负责实例化,配置和组装Bean。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.theitroad</groupId>
<artifactId>SpringProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringProject</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.1.8.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</project>
豆类
public interface OrderService {
public void buyItems();
}
public class OrderServiceImpl implements OrderService {
private IStore store;
public IStore getStore() {
return store;
}
public void setStore(IStore store) {
this.store = store;
}
public void buyItems() {
store.doPurchase();
}
}
public interface IStore {
public void doPurchase();
}
public class RetailStore implements IStore {
public void doPurchase() {
System.out.println("Doing purchase from Retail Store");
}
}
Java配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.theitroad.springproject.service.IStore;
import com.theitroad.springproject.service.OrderService;
import com.theitroad.springproject.service.OrderServiceImpl;
import com.theitroad.springproject.service.RetailStore;
@Configuration
public class AppConfig {
@Bean
public OrderService orderService(){
OrderServiceImpl orderService = new OrderServiceImpl();
//setting bean dependency
orderService.setStore(store());
return orderService;
}
@Bean
public IStore store(){
return new RetailStore();
}
}
在配置类中,两个bean被配置为OrderService和Store。在orderService对存储的依赖关系也得到满足。
为了运行该应用程序,我们可以使用以下类。
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import com.theitroad.springproject.model.Employee;
import com.theitroad.springproject.service.EmployeeService;
import com.theitroad.springproject.service.OrderService;
import com.theitroad.springproject.service.OrderServiceImpl;
public class App {
public static void main( String[] args ){
AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
OrderService orderService = context.getBean("orderService", OrderService.class);
orderService.buyItems();
context.close();
}
}
输出:
17:40:49.318 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalConfigurationAnnotationProcessor' 17:40:50.243 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerProcessor' 17:40:50.251 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.event.internalEventListenerFactory' 17:40:50.255 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'org.springframework.context.annotation.internalAutowiredAnnotationProcessor' 17:40:50.271 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'appConfig' 17:40:50.291 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'orderService' 17:40:50.399 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'store' Doing purchase from Retail Store
请注意,此处使用ApplicationContext的AnnotationConfigApplicationContext实现,该实现接受@Configuration类作为输入。
自定义Bean名称
默认情况下,配置类使用@Bean方法的名称作为结果bean的名称,这就是为什么在示例中将" orderService"识别为bean名称的原因。我们可以使用name属性提供任何其他名称。例如
@Configuration
public class AppConfig {
@Bean(name = "myService")
public OrderService orderService() {
return new OrderServiceImpl();
}
}
具有构造函数依赖项注入的Spring Java Configuration
在上面的示例中,使用setter依赖注入来设置bean依赖,下面的类展示了构造函数依赖注入。
这是一个经过修改的OrderServiceImpl类,带有用于初始化Store的构造函数。
public class OrderServiceImpl implements OrderService {
private IStore store;
public OrderServiceImpl(IStore store){
this.store = store;
}
public void buyItems() {
store.doPurchase();
}
}
修改后的Java配置类。
@Configuration
public class AppConfig {
@Bean
public OrderService orderService(){
// Bean dependency (Constructor)
return new OrderServiceImpl(store());
}
@Bean
public IStore store(){
return new RetailStore();
}
}

