首页 > 其他分享 >Spring Boot自动装配

Spring Boot自动装配

时间:2024-07-01 11:57:45浏览次数:3  
标签:装配 Spring 配置 Boot 自动 模块 spring public starter

一、作用

为了简化配置,使spring的使用更加方便,例如:可以回忆一下springboot中是如何继承redis的。

spring配置方式的进化过程:

  • xml的方式配置
  • java config的方式配置,使用@configuration注解在java中配置
  • 自动装配

springboot starter作用:

  • 引入模块所需的相关jar包
  • 自动配置各自模块所需的属性

使用springboot后集成常用的第三方框架变得非常简单了。

springboot starter带来的问题
        starter使SpringBoot集成第三方框架变得简单,但对刚刚上手SpringBoot的人来说,可能只知道配置属性是在application.xml或application.yml中添加,但他们各自的属性都有哪些,具体怎么配置,却无从下手 

二、注解

1. 元注解

为更好的理解装配过程,复习一下元注解

  • @Target: 自定义注解的使用范围,比如类,方法,属性等
  • @Retention: 保留策略,如源码中保存(@Override),class中保存(@SupperWarning),运行时保存等
  • @Docmented: 为javadoc使用的。
  • @Inherited: 被其修饰的自定义注解可以被子类继承

2. @Import

作用:为容器导入bean的定义
常用的三种方式:
1) @Import(value={A.class}) 将A类导入容器中,交给IOC管理
2) @Import(value={XxxImportBeanDefinitionRegister.class}) 也是将bean导入容器中,与上面不同的是实现了ImportBeanDefinitionRegistrar接口,该接口用来动态注册bean
3) @Import(value={XxxImportSelector.class}) 可以批量导入,需要实现ImportSelector接口,该接口返回一个数组(需要注册的bean的全路径),实现批量注册

3. @Configuration

被挂上@Configuration注解,表明它是一个配置类,作用等同于xml配置,里面有被@Bean注解的方法,也等同于xml配置的各种<bean>

4. @ConditionalXXX

  • @ConditionalOnBean,仅在当前上下文中存在某个bean时,才会实例化这个Bean
  • @ConditionalOnClass,某个class位于类路径上,才会实例化这个Bean
  • @ConditionalOnExpression,当表达式为true的时候,才会实例化这个Bean
  • @ConditionalOnMissingBean,仅在当前上下文中不存在某个bean时,才会实例化这个Bean
  • @ConditionalOnMissingClass,某个class在类路径上不存在的时候,才会实例化这个Bean
  • @ConditionalOnNotWebApplication,不是web应用时才会实例化这个Bean
  • @AutoConfigureAfter,在某个bean完成自动配置后实例化这个bean
  • @AutoConfigureBefore,在某个bean完成自动配置前实例化这个bean

5. EnableConfigurationProperties

作用就是将@ConfigurationProperties修饰的Bean加入到IOC容器中。@ConfigurationProperties与@EnableConfigurationProperties注解结合,可以方便的读取配置文件

三、结构

1. 启动器

一个空的jar包,提供依赖管理。这些依赖可能用于自动装配或其他的第三方jar

命名规范

  • spring官方的start: spring-boot-starter-xxx
  • 自定义的start: xxx-spring-boot-starter

2. 自动配置

编写一个自动配置的模块,用于完成自动配置, 上一步的启动器依赖于自动配置, 用户在使用时自需引入启动器模块,即可自动导入自动配置模块。

四、创建工程

创建一个空工程,在该工程中创建两个模块,一个为start模块(启动类),一个为自动配置模块。

创建一个名为:sbautoconfig的Maven空项目

启动模块只需要导入自动配置模块,所以不需要集成springboot父项目。 自动配置模块需要依赖一spring-boot-start(Spring Boot核心starter,包含自动配置、日志、yal配置文件支持),所以需要spring-boot-starter-parent为父项目。

一个为start模块,启动模块,不需要做任何开发,只用在pom.xml配置文件中导入自动配置模块。使用者通过导入启动模块,启动模块导入自动配置模块,(可以将start启动模块想象成使用导火索)

请注意上面提到的命名规范!!!

 五、开发自动配置模块

启动类的作用是导入自动配置模块,并不要进行编码开发

在自动配置模块如下:

1.HelloProperties

该类的作用时读取项目的配置文件, 使用@ConfigurationProperties注解,并指定读取demo.starter前缀的配置文件

@ConfigurationProperties(prefix = "demo.starter")
public class HelloProperties {

    //greeting问候
    private String greeting;

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }
}

2.HelloService

该类用于通过传入的参数,与配置文件中的配置,组成一个字符串返回, 没有业务意义,仅用于演示spring start的运行原理

public class HelloService implements IHelloService {

    HelloProperties helloProperties;

    public HelloProperties getHelloProperties() {
        return helloProperties;
    }

    public void setHelloProperties(HelloProperties helloProperties) {
        this.helloProperties = helloProperties;
    }

    @Override
    public String sayHello(String name) {
        return helloProperties.getGreeting() + " " + name;
    }
}

3.HelloServiceAutoConfigration

该类用于进行自动配置

@Configuration  //表明该类为配置类
@ConditionalOnWebApplication  //指定该配置类在web环境下有效
@EnableConfigurationProperties(HelloProperties.class)
public class HelloServiceAutoConfigration {

    @Autowired
    HelloProperties helloProperties;

    @Bean
    public HelloService helloService() {
        HelloService helloService = new HelloService();
        helloService.setHelloProperties(helloProperties);
        return helloService;
    }

}

4.spring.factories

编写spring.factories, 可以参mybatis-spring-boot-autoconfigure编写

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.lisen.starter.HelloServiceAutoConfigration

5.安装到本地仓库

将工程安装到本地仓库,以便于其他的工程使用

因为启动模块和自动装配模块都在sbautoconfig模块中,所以直接进行sbautoconfig的install即可

六、使用自动装配模块

创建一个springboot项目,并在pom.xml中引入上面的自动配置模块(只需引入启动类,启动类自动引入配置模块)

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
    </parent>


    <properties>
        <java.version>1.8</java.version>
        <mysql.driver.version>5.1.44</mysql.driver.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.lisen.starter</groupId>
            <artifactId>demo-spring-boot-starter</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

项目配置文件: application.properties

server.port=8080
server.servlet.context-path=/
server.tomcat.uri-encoding=utf-8

demo.starter.greeting=hello

启动类:

@SpringBootApplication
public class AppStarter {

    public static void main(String[] args) {

        SpringApplication.run(AppStarter.class, args);

    }

}

controller

@RestController
public class HelloController {

    @Autowired
    private IHelloService helloService;

    @RequestMapping("/hello")
    public String hello() {
        return helloService.sayHello("zs");
    }

}

最后启动服务,调用http://localhost:8080/hello,如果提示信息正常输出则说明运行成功

 

本篇Spring Boot自动装配到此结束,希望能帮助到一些不懂的小白。

若还想继续学习,静候博主更新(博主正在努力学习中!!!)

标签:装配,Spring,配置,Boot,自动,模块,spring,public,starter
From: https://blog.csdn.net/Love_Baixiong/article/details/140064992

相关文章

  • springboot异常解决
    问题解决问题解释出现这个问题表示拦截器或控制器的某个请求处理方法返回了一个与请求路径相同的视图名称,导致视图解析器循环地尝试解析并渲染这个视图,从而引发循环视图路径的异常。问题分析原先的java代码如下@Controller@RequestMapping("/interceptor")publicclassInt......
  • SpringBoot自定义注解实现接口幂等
    一、前言接口幂等就是对一个接口执行重复的多次请求,与一次请求所产生的结果是相同的。对数据库的查询和删除是天然幂等的,更新操作在大多数场景下也是天然幂等。插入大多数情况下都是非幂等的,除非利用数据库的唯一索引来保证数据不会重复保存。二、为什么需要幂等1.超时重试......
  • 创建springboot项目的具体步骤
    点击newProject点击SpringInitializer创建springboot项目将ServerURL改为start.aliyun.com这样就可以选择java11的版本Location选择文件存放路径Language选择编程语言Type选择项目管理的类型JDK选择项目的JDKJava选择项目的java版本Packaging选择项目的打包......
  • (免费领源码)java#Springboot#mysql物品代拿系统32500-计算机毕业设计项目选题推荐
    摘 要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术开发,Sp......
  • 网上商品订单转手系统boot论文
    摘 要传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装网上商品订单转手系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,网上商品订......
  • 粮仓管理系统的设计与实现boot论文
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统粮仓管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个粮仓管理系......
  • 基于springbo在线考试系统研究与实现万字文档PPT源码分享
    前言......
  • 基于springboot足球社区管理系统万字文档PPT源码分享
    前言......
  • 基于springboot助农管理系统万字文档PPT源码分享
    前言......
  • SpringMVC-02-什么是SpringMVC
    1、概述SpringMVC是SpringFramework的Web开发部分,是基于Java实现MVC的轻量级Web框架。官方文档:https://docs.spring.io/spring-framework/docs/4.3.24.RELEASE/spring-framework-reference/html/中文官方文档:https://www.w3cschool.cn/spring_mvc_documentation_linesh_t......