JavaEE Spring~ IDEA 创建 Spring Boot项目 并且基于Annotation装配Bean

Spring Boot

  • Spring Boot 是所有基于 Spring 开发的项目的起点。Spring Boot 的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。简单来说就是 SpringBoot 其实不是什么新的框架,它默认配置了很多框架的使用方式,整合了所有的框架。
  • 本质作用就是为了减少配置性的工作
    - 如web项目的传统开发步骤:
    (1. 创建web项目结构, 包括web资源文件和web.xml
    (2. 使用Spring Framework配置很多xml文件
    (3. 部署到tomcat
  • 但是如果我们使用Spring Boot 其内置就默认了很多配置 (启动类中自动完成的工作)

搭建一个Spring Boot

在这里插入图片描述
在这里插入图片描述

  • 修改pom.xml 将下面的配置加到pom.xml中
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>frank</groupId>
    <artifactId>springboot-study</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- 名字随意 -->
    <name>springboot</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

        <!--        <dependency>-->
        <!--            <groupId>org.mybatis.spring.boot</groupId>-->
        <!--            <artifactId>mybatis-spring-boot-starter</artifactId>-->
        <!--            <version>2.1.1</version>-->
        <!--        </dependency>-->

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  • 创建启动包 (必须在一个包下创建)
    在这里插入图片描述

  • 启动包代码

package todayTest.application;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * Created with IntelliJ IDEA.
 * Description: If you don't work hard, you will a loser.
 * User: Listen-Y.
 * Date: 2020-08-17
 * Time: 9:56
 */
@SpringBootApplication
public class TodayTestApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(TodayTestApplication.class, args);
    }

}

  • 验证是否启动正常 执行main方法出现如下则正常
    在这里插入图片描述
  • 并且可以正常访问
    在这里插入图片描述

Spring Boot的配置介绍

默认的web配置

(1. web资源文件夹: 映射静态资源文件夹
(2. 默认的web.xml文件
(3. 内置的 tomcat

自动扫描并初始化:

  • (1. 扫描包: 以启动类所在的包, 为扫描的包 (所以启动类必须在一个包下)
  • (2. 扫描类上的注释: 扫描Spring框架支持的注解 (初始化实例对象 依旧是单例模式)

常见类上的注释:

1. @Component
可以使用此注解描述Spring上的Bean 但他是一个泛化的概念 就是说仅仅表示一个Bean组件, 可以使用在任何层次, 使用时只需要将该注释标注在相应的类上即可
注解一个类表示这个类的将作为对象提供方出现,并且对象的创建过程完全交给 Spring 来进行。
2. @Respository
用于数据访问层(dao层) 的类标识为Spring中的Bean 其功能与@Component类似
3. @Service
常作用在业务层(Service层) 用于将业务层的类标识为Spring的Bean 其功能与@Component类似
4. Controller
常用于标识web请求响应的处理类, 通常作用在控制层 用于将控制层的Spring的Bean标识出来, 其功能与@Component类似
5. @Configuration
这是一个配置类 启动时做配置工作
6. @SpringBootApplication
会扫描被该注解修饰包下的所有的类,包括其子包下的类,以达到完成上面一些注解修饰类的创建和注入过程
6. @ControllerAdvice统一处理

  • (3. 初始化: 属性和方法上有Spring支持的注解 进行初始化 (初始化实例对象 使用单例模式)
    @Bean :配置类方法上的, 以返回值作为Bean的实例对象, 注册到容器中 (Bean的名称为方法名)
    注意: @Bean注解方法, 如果没有被扫描到是不会起作用的 而且同一个类型要实例化多个对象时, 这种方式比较适合
    @Bean和 @Component 类似, @Bean 的目的也是为了把一个 bean 对象注册到 IOC 容器中.
    @Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。
    @Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。
    @Component(@Controller、@Service、@Repository)通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中, 而 @Bean 注解通常是我们在标有该注解的方法中定义产生这个bean的逻辑。
    很多场景下都是既可以使用 @Component 也可以使用 @Bean但是当我们引用第三方库中的类, 装配到 Spring 容器中时, 就只能使用 @Bean (我们无法修改第三方类库的代码).

装配Bean的方式(注解)

  1. @AutoWired 这是一个属于Spring框架的一个装配Bean的方式
  2. @Resource JDK提供的注解表示资源 但是JDK只提供了一个规范没有提供实现(像JDBC和Servlet也是这样)
@AutoWired 与 @Resource主要区别
  1. 一个是Spring的 一个是JDK提供的
  2. 如果存在一个类型 有多个实例对象时, 默认查找bean的名称和变量名相同的那一个 如果变量名和bean的名称不一致需要手动指定 :
    在这里插入图片描述

代码演示

  • 准备工作实现一个Person类
package todayTest.application.modle;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

/**
 * Created with IntelliJ IDEA.
 * Description: If you don't work hard, you will a loser.
 * User: Listen-Y.
 * Date: 2020-08-17
 * Time: 10:05
 */
@Getter
@Setter
@ToString
public class Person {
    
    
    
    private String name;
    private String Id;
    private int age;
    
}

  • 创建@Configuration用于启动时做好配置工作 使用@Bean 配置类方法上, 以返回值作为Bean的实例对象
package todayTest.application.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import todayTest.application.modle.Person;

import java.util.HashMap;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description: If you don't work hard, you will a loser.
 * User: Listen-Y.
 * Date: 2020-08-17
 * Time: 10:19
 */
@Configuration
//用于启动时完成的配置工作
public class PersonConfiguration {
    
    

    @Bean
    //注意的方法名和返回名不一样 但是这个bean对象是以方法名作为他的名称的

    public Map<String, String> test1() {
    
    
        Map<String, String> map = new HashMap<>();
        map.put("勒布朗", "詹姆斯");
        map.put("科比", "布莱恩特");
        return map;
    }

    @Bean
    public Person person1() {
    
    
        Person person = new Person();
        person.setName("Listen");
        person.setId("612720199900008000");
        person.setAge(20);
        return person;
    }
    
    @Bean
    public Person person2() {
    
    
        Person person = new Person();
        person.setName("Frank");
        person.setId("892720199900008000");
        person.setAge(22);
        return person;
    }

}

  • 创建@Controller用于web请求的处理 并使用@Resource和@AutoWired装配bean
package todayTest.application.controller;

import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * Description: If you don't work hard, you will a loser.
 * User: Listen-Y.
 * Date: 2020-08-17
 * Time: 10:10
 */
//当前类型注册实例到容器中,并指定为Web请求的处理
@Controller
//@RequestMapping可以定义请求相关的配置:如路径,请求方法等等
@RequestMapping("/per")
public class PersonController {
    
    

    @Resource
    //@AutoWired 使用这个也是可以的
    //以我们设置的变量名去查找初始化好的bean对象
    private Map<String, String> test1;

    
    
    @RequestMapping(value = "/test1", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, method = {
    
    RequestMethod.GET})
    //设置web请求的访问路径  
    // produces设置返回的数据格式是uft-8
    // method设置可以访问的http方法为get
    @ResponseBody
    //设置以json格式返回结果
    public Object test1() {
    
    
        return test1;
    }
    
    
    
}

  • 使用postman请求演示
    在这里插入图片描述
  • 演示如果同一个类型 有多个实例对象的时候, 并且此时变量名和bean的名称不一样时 使用@Resource和@AutoWired的不同处理方法
 //使用@Resource时
    @Resource(name = "person1")
    private Person person;

    @RequestMapping(value = "test2")
    @ResponseBody
    public Object test2() {
    
    
        return person;
    }

    //使用@Autowired时
    @Autowired
    @Qualifier(value = "person2")
    private Person person3;

    @RequestMapping(value = "test3")
    @ResponseBody
    public Object test3() {
    
    
        return person3;
    }
  • 使用postman请求演示
    在这里插入图片描述
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Shangxingya/article/details/108042304