Spring 基于Java的配置示例

时间:2020-01-09 10:44:35  来源:igfitidea点击:

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