看完就懂的springBoot2学习(01)关于组件和注解详解

创建项目,配置你的pom文件(这部分有经验的可跳过)

springBoot这样创建可以自动导入pom依赖,非常省事(要选择Spring Initializr)

勾选自己需要用到的(如spring Web, Lombok)

pom文件

starter为一组依赖,导入starter相当于导入了相关场景的所有依赖,功能非常强大

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

这里推荐一个依赖,在开发网络项目当中非常方便,

devtools,每次程序运行中更改代码只要Ctrl+F9就可以在运行时更改,不用重新运行(或者构建 构建项目)
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>

常用注解(先解释用法,后面一行代码看懂)

1:@SpringBootApplication//声明这是一个springBoot应用,要在有main方法的类头注解
2:@RestController//等于@ResponseBody(作用是告诉Spring Boot,这个方法的返回值应该直接写入HTTP响应的body中)和@Controller(声明这是一个Controller类)两个注解,@RestController要在contraller类头注解
3:@Configuration(proxyBeanMethods = true)//告诉SpringBoot这是一个配置类。这个(proxyBeanMethods = true)后面会讲。
4:@Import//给容器自动创建这些类型的组件(默认组件名为全类名),可以是自己创建的
5@Component//将组件加到容器当中,通常在自己创建的实体类上注解
6@EnableConfigurationProperties()//在括号中写入XX.class 相当于在实体类XX上加了@Component(自动注册到容器),但是有点区别:(用该注解时)无法用main通过run.getBean("xx",XX.class)找到XX组件.通常在配置类当中注解。
7@Conditional//这类注解:在特定条件下才会执行eg:@ConditionalOnMissingBean(找不到组件)@ConditionalOnJava(判断当前的 Java 版本是否满足特定的条件)
8@Bean()//添加("")可以使组件名由方法或类变为特点名,在MainApplication的打印语句当中有user01和tom两个组件
9@Autowired//自动注入
10:@RequestMapping()//处理 HTTP 请求的一个核心注解。它用于映射 web 请求(如 URL 路径、HTTP 方法、请求参数等)到特定的处理器方法(即控制器中的方法),在controller类文件当中使用
11:@Slf4j//注解:可以通过日志而非控制台,打印日志

下面一行代码学会使用

先创建如下文件结构(MainApplication一般为创建好的Main类,只要在同级目录下创建bean,config,controller包即可,java文件创建出不用写)

在Car类:

@Component
@ConfigurationProperties(prefix = "mycar")
@Data//导入lombok才能用
@ToString//导入lombok才能用
public class Car {
    private Integer price;
    private String brand;
    
}

@Component在Spring 容器会在启动时自动扫描并识别这个类,然后将其创建为一个 bean 实例,并添加到 Spring 的应用上下文中,这样其他的 bean 就可以通过依赖注入来引用它。

在application.properties文件当中写入

mycar.brand=BYD
mycar.price=1000

通过@ConfigurationProperties(prefix = "mycar")就可以给car注入属性,诞生一个组件mycar

在controller类当中:

@RestController
public class HelloController {

    @Autowired
    Car mycar;

    @RequestMapping("/car")
    public Car mycar(){
        return mycar;
    }

然后在main类头添加@SpringBootApplication注解

这时运行程序,打开浏览器输入http://localhost:8080/car

浏览器就会显示

那么你就成功了第一步(使用springBoot打开网页,显示自己创建的组件)。

在HelloController类中再写

@Slf4j//注解:可以通过日志
@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String handle01(@RequestParam("name") String name){//未在Main配置@ComponentScan不能放在比主文件(这里MainApplication)目录级别高的地方,可以放在主文件同级子文件下
        //有(@RequestParam("name") String name)就必须向url当中传递参数  http://localhost:8888/hello?name=ws

        log.info("进来了。。。");//通过@Slf4j注解
        return "hello, Spring boot2你好啊"+name;
    }

    @Autowired
    Car mycar;

    @RequestMapping("/car")
    public Car mycar(){
        return mycar;
    }

这时使用

localhost:8080/hello?name=666访问浏览器,会出现

每次刷新网站日志都会更新

那么你就成功了第二步(使用日志,以及访问特点路径资源)


 

组件

在Spring Boot中,组件通常指的是构成应用程序的各个部分,这些部分协同工作以实现特定的功能。这些组件可以是配置类、控制器、服务、仓库、实体类等,也可以是自己创建后注入的类。

 Pet类:

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Pet {
    private String Name;
}

User类:(当中有个Pet类对象)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private Pet pet;
}

Myconfig类:

@Configuration(proxyBeanMethods = true) //告诉SpringBoot这是一个配置类.proxyBeanMethods = true 在MainApplication当中有解释
@Import({User.class, DBHelper.class})//给容器自动创建这些类型的组件(默认组件名为全类名),可以是自己创建的
@EnableConfigurationProperties(Car.class)//注解作用:相当于在实体类上加了@Component(自动注册到容器),但是有区别:(用该注解时)我在main方法下不能通过Car.class找到car组件
//1开启属性配置,2将car这个组件自动注册到容器当中。这时在(这里为Car,class)实体类当中无需添加@Component注入到容器
//@ImportResource("classpath:beans.xml")//可以导入之前的配置文件之类的,我运行有问题
public class Myconfig {
    @Autowired
    Pet pet;
    @ConditionalOnMissingBean(name = "tom")//该注解:当组件当中有tom时下面这一堆才会生效
    //@Conditional()这类注解:在特定条件下才会执行eg:@ConditionalOnMissingBean @ConditionalOnJava
    @Bean//给容器添加组件,以方法名作为组件的id,返回类型为组件类型,返回的值为组件在容器中的实例
    public User user01(){
        User user = new User("ws", 20,pet);
        user.setPet(MyPet());
        return user;
    }

    @Bean("tom")//添加("tom")可以使组件名(MyPet)变为tom,在MainApplication的打印语句当中有user01和tom两个组件
    public Pet MyPet(){
        return  new Pet("tomcat");
    }

}

MainApplication类:

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //1,返回IOC容器
        ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args);
        //2.查看容器里面的组件
        String[] names =run.getBeanDefinitionNames();
        for (String name : names){
            System.out.println(name);
        }
        //3,从容器当中获取组件
        Pet tom01 = run.getBean("tom",Pet.class);
        Pet tom02 = run.getBean("tom",Pet.class);
//      tom01 和tom02 为一个组件
        Myconfig bean =run.getBean(Myconfig.class);//可以打印出,配置类本身也是组件

//      如果在@Configuration(proxyBeanMethods = true),user和user2相等,保持组件单实例
//      若为false,就不相等,每次调用都会产生一个新对象。组件依赖问题
        User user =bean.user01();
        User user2 =bean.user01();

//      组件依赖
//        user和user2当中获取的pet在proxyBeanMethods = true时相同,为false时不同
//        这是springBoot2最大的更新

//        proxyBeanMethods为true是springBoot每次都会检查组件是否存在,但效率慢。false不会检查,但每次创建新的会影响组件之间的依赖

//        Boolean ws = run.containsBean("ws");//检查是否有beans.xml文件当中的组件
        boolean mycar = run.containsBean("car");//在yml当中注入属性,在car实体类当中将组件注入容器
//        Car car = run.getBean("car", Car.class);//当在myconfig使用@EnableConfigurationProperties(Car.class)时,取消car的@component就会找不到该组件
//        System.out.println(car);
    }
}

这里需要知道在Config类当中用注解@Configuration(proxyBeanMethods = true)

为true时容器中的同一类组件永远只有一个,即组件依赖

此处为springBoot2最大的更新

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值