Spring Boot和依赖注入

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

Spring Boot中的依赖注入与Spring框架中的依赖注入没有什么不同。我们可以使用任何标准的Spring Framework技术来定义bean及其注入的依赖项。 SpringBoot建议使用@ComponentScan(查找bean)和使用@Autowired(进行构造函数注入)。

Spring Boot依赖注入示例

我们将创建一个简单的Spring Boot独立应用程序,以显示Spring Boot依赖项注入。

对于独立的应用程序,除了需要增加spring-boot-starter-parent的依赖之外,还需要添加spring-boot-starter的依赖。

Maven依赖

<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>SpringBootProject</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.6.RELEASE</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>
</project>

豆类
在该示例中,有一个用于下订单的类称为Order,可以从存在RetailStore类的商店中进行购买。订单类对商店有依赖性。

public interface OrderService {
  public void buyItems();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class OrderServiceImpl implements OrderService {
  private IStore store;
  @Autowired
  public OrderServiceImpl(IStore store){
    this.store = store;
  }

  public void buyItems() {
    store.doPurchase();
  }
}
public interface IStore {
  public void doPurchase();
}
@Service
public class RetailStore implements IStore {
  public void doPurchase() {
    System.out.println("Doing purchase from Retail Store");
  }
}

依赖项注入的最佳实践之一是对接口进行编码,这就是为什么要有接口然后是它们的具体实现的原因。这个想法是依靠抽象而不是具体的实现,以减少依赖的僵化。

此外,类还使用@Service注释进行注释,这使这些类有资格进行组件扫描。 @Autowired注释用于通过构造函数注入来注入依赖项。

具有主方法的应用程序类

要引导此春季启动示例,请使用带有@SpringBootApplication注释的类。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import com.theitroad.springbootproject.service.OrderService;
import com.theitroad.springbootproject.service.OrderServiceImpl;

@SpringBootApplication
public class FirstSpringBootApp {
  public static void main(String[] args) {
    ApplicationContext ctx = SpringApplication.run(FirstSpringBootApp.class, args);
    OrderService orderService = ctx.getBean(OrderServiceImpl.class);
    orderService.buyItems();
  }
}

@SpringBootApplication是一个方便注释,它添加了以下所有注释

1 @ Configuration注释将类标记为应用程序上下文的Bean定义的源。

2 @ EnableAutoConfiguration告诉Spring Boot启用自动配置。 Spring Boot自动配置会尝试根据添加的jar依赖项自动配置Spring应用程序。例如,starter spring-boot-starter-web添加了Tomcat和Spring MVC,因此自动配置假定我们正在开发Web应用程序并相应地设置Spring,其中包括设置DispatcherServlet。

3 @ ComponentScan告诉Spring递归查找此包中的其他组件,配置和服务,并注册它们。所有应用程序组件(@ Component,@ Service,@ Repository,@ Controller等)都将自动注册为Spring Bean。

在将此Application类作为Java应用程序运行时,我们将获得以下输出:

.   ____          _            __ _ _
 /\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.6.RELEASE)

2019-08-11 11:48:12.473  INFO 13036 --- [           main] c.k.s.FirstSpringBootApp                 : Starting FirstSpringBootApp on user with PID 13036 (started by Anshu in F:\theitroad\Spring WorkSpace\SpringBootProject)
2019-08-11 11:48:12.476  INFO 13036 --- [           main] c.k.s.FirstSpringBootApp                 : No active profile set, falling back to default profiles: default
2019-08-11 11:48:13.414  INFO 13036 --- [           main] c.k.s.FirstSpringBootApp                 : Started FirstSpringBootApp in 1.478 seconds (JVM running for 2.515)
Doing purchase from Retail Store