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