详解如何实现SpringBoot的底层注解

一、@Configuration注解

1、基本使用

自定义配置类

/**
 * 1、@Configuration 告诉SpringBoot这是一个配置类,相当于一个xml配置文件
 *
 * 2、配置类里面使用 @Bean 标注在方法上 来给容器注册组件,默认是单实例的
 *
 * 3、配置类本身也是一个组件
 */
@Configuration(proxyBeanMethods = true)
public class MyConfig {

    @Bean
    public User user01(){
        return new User("zhangsan",23);
    }

    @Bean
    public Pet pet01(){
        return new Pet("cat");
    }
}

主程序类

/**
 * 主程序类
 * @SpringBootApplication:这是一个SpringBoot应用
 */
@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {
        //返回IOC容器
        ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);

        //从容器中获取bean
        User user = context.getBean(User.class);
        System.out.println(user);

        Pet pet = context.getBean("pet01", Pet.class);
        System.out.println(pet);

        MyConfig myConfig = context.getBean(MyConfig.class);
        System.out.println(myConfig);

        /*如果配置@Configuration(proxyBeanMethods = true),代理对象调用方法从容器中拿组件,SpringBoot总会检查容器中是否有这个组件
        * 保持组件的单实例*/
        User user1 = myConfig.user01();
        User user2 = myConfig.user01();
        System.out.println(user1 == user2);

    }
}

打印结果:

2、Full模式与Lite模式

Full模式是指proxyBeanMethods = true,开启代理bean的方法。此时调用配置类中每一个给而容器注册组件方法,都会从容器中找组件,保持单例模式。

  /*如果配置@Configuration(proxyBeanMethods = true),代理对象调用方法从容器中拿组件,SpringBoot总会检查容器中是否有这个组件
        * 保持组件的单实例*/
        User user1 = myConfig.user01();
        User user2 = myConfig.user01();
        System.out.println(user1 == user2);		//true

Lite模式是指proxyBeanMethods = false,关闭代理bean的方法。容器中不会保存代理对象,每一次调用配置类里面的方法,·都会产生一个新的对象。这可以解决组件依赖的问题。

User组件里面有Pet组件

public class User {
    private String name;
    private Integer age;

    private Pet pet;

    public Pet getPet() {
        return pet;
    }
}

自定义的配置类中proxyBeanMethods设置为false

@Configuration(proxyBeanMethods = false)
public class MyConfig {

    @Bean
    public User user01(){
        User user = new User("zhangsan", 23);
        //User组件依赖了Pet组件
        user.setPet(pet01());
        return user;
    }

    @Bean
    public Pet pet01(){
        return new Pet("cat");
    }
}

主程序类

@SpringBootApplication
public class MainApplication {
    public static void main(String[] args) {

        User user01 = context.getBean("user01", User.class);
        Pet pet01 = context.getBean("pet01", Pet.class);
        System.out.println(user01.getPet() == pet01);		//true

    }
}

打印结果:

  • 配置类组件之间无依赖关系Lite模式加速容器启动过程,减少判断
  • 配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,这时要用Full模式

二、@Import注解导入组件

@Import注解可以给容器中自动创建出指定类型的组件,默认组件的名字就是全类名

@Import(DBHelper.class)
@Configuration(proxyBeanMethods = false)
public class MyConfig {

}

在容器中或者这个导入的组件

三、@Conditional注解条件装配

满足Conditional指定的条件的方法,则进行组件注入

也可以标注在类上,当容器中存在指定的组件的时候,配置类中的方法才会生效

四、@ImportResource注解导入Spring配置文件

外部配置文件

导入外部配置文件

获取导入的外部组件

五、@ConfigurationProperties注解配置绑定

JavaBean与配置文件中属性进行绑定

需要使用@ConfigurationProperties@Component两个注解,@Component注解将组件注册到容器中,因为只有在容器中的组件,才能使用SpringBoot提供的一些强大的注解功能

访问请求获取绑定的JavaBean

还可以在配置类中使用@EnableConfigurationProperties开启组件属性配置功能,并把这个组件自动注册到容器中,这样就不需要再使用 @Component注解

@EnableConfigurationProperties(Pet.class)
public class MyConfig {
}
//@Component
@ConfigurationProperties(prefix = "mydog")
public class Pet {
}

依然可以访问请求获取绑定的JavaBean

到此这篇关于详解如何实现SpringBoot的底层注解的文章就介绍到这了,更多相关SpringBoot底层注解内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springboot中使用@Transactional注解事物不生效的坑

    一:在springboot中使用事物遇到的坑 1.我们知道spring中的事物分为两种:一种是编程式事物,一种是声明式事物.顾名思义,编程式事物是指通过代码去实现事物管理,这里不做过多说明.另一种是声明式事物,分为两种情况01:一种是通过传统xml方式配置,02:使用@Transaction注解方式配置,这是主要讲解的是通过注解方式配置.因为在springboot项目中,会自动配置DataSourceTransactionManager,我们只需要在对应的方法上或者类上加上@Transactio

  • SpringBoot用@Async注解实现异步任务

    什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行. 如何实现异步调用? 多线程,这是很多人第一眼想到的关键词,没错,多线程就是一种实现异步调用的方式. 在非spring目项目中我们要实现异步调用的就是使用多线程方式,可以自己实现Runable接口或者集成Thread类,或者使用jdk1.5以上提供了的Executors线程池. StrngBoot中则提供了很方便的方式执行异步调

  • SpringBoot 拦截器和自定义注解判断请求是否合法

    应用场景举例: 当不同身份的用户请求一个接口时,用来校验用户某些身份,这样可以对单个字段数据进行精确权限控制,具体看代码注释 自定义注解 /** * 对比请求的用户身份是否符合 * @author liuyalong * @date 2020/9/25 16:03 */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface CompareUser { /** * The name

  • SpringBoot启动类@SpringBootApplication注解背后的秘密

    在用SpringBoot的项目的时候,会发现不管干什么都离不开启动类,他是程序唯一的入口,那么他究竟为我们做了什么?本篇文章主要解析@SpringBootApplication. 一.启动类 @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } } 二.@SpringBoo

  • 浅谈基于SpringBoot实现一个简单的权限控制注解

    注解是 JDK 5.0 引入的一种注释机制.注解可以作用在类型(类.接口.枚举等).属性.方法.参数等不同位置,具体的 JDK 版本所支持的注解位置可参考 java.lang.annotation.ElementType .此外还有注解的策略,也就是 RetentionPolicy ,这里不加赘述. 注解可以实现很多功能,其中最主要的就是进行代码标注,所以有时候注解也叫做标注.使用起来也基本顾名思义,就是对代码进行标注,简化部分代码的逻辑. 下面我们就着手实现一个简单的权限控制注解,来对注解有一

  • 基于注解实现 SpringBoot 接口防刷的方法

    该示例项目通过自定义注解,实现接口访问次数控制,从而实现接口防刷功能,项目结构如下: 一.编写注解类 AccessLimit package cn.mygweb.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Targ

  • SpringBoot基于自定义注解实现切面编程

    1.相关依赖包 <!-- aop 依赖包 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <ar

  • springBoot系列常用注解(小结)

    @PropertySource 作用是:对自定义的properties文件加载 使用:@PropertySource(value={"classpath:people.properties"})或者@PropertySource(value="classpath:people.properties") properties文件,获取到值乱码问题 乱码解决: file ->settings -->file encoding--> 勾选Transpar

  • 详解如何实现SpringBoot的底层注解

    一.@Configuration注解 1.基本使用 自定义配置类 /** * 1.@Configuration 告诉SpringBoot这是一个配置类,相当于一个xml配置文件 * * 2.配置类里面使用 @Bean 标注在方法上 来给容器注册组件,默认是单实例的 * * 3.配置类本身也是一个组件 */ @Configuration(proxyBeanMethods = true) public class MyConfig { @Bean public User user01(){ retu

  • 详解IDEA中SpringBoot整合Servlet三大组件的过程

    Spring MVC整合 SpringBoot提供为整合MVC框架提供的功能特性 内置两个视图解析器:ContentNegotiatingViewResolver和BeanNameViewResolver 支持静态资源以及WebJars 自动注册了转换器和格式化器 支持Http消息转换器 自动注册了消息代码解析器 支持静态项目首页index.html 支持定制应用图标favicon.ico 自动初始化Web数据绑定器:ConfigurableWebBindingInitializer Sprin

  • 详解如何为SpringBoot项目中的自定义配置添加IDE支持

    导言 代码是写给人看的,不是写给机器看的,只是顺便计算机可以执行而已 --<计算机程序的构造和解释(SICP)> 导言 在我们的项目里经常会出现需要添加自定义配置的应用场景,例如某个开关变量,在测试环境打开,在生产环境不打开,通常我们都会使用下面的代码来实现,然后在Spring Boot配置文件中添加这个key和Value Application.java: application.properties 或者是没有使用@Value而直接在XML中使用我们配置的属性值 application.x

  • 详解如何在SpringBoot中自定义参数解析器

    目录 前言 1.自定义参数解析器 2.PrincipalMethodArgumentResolver 3.RequestParamMapMethodArgumentResolver 4.小结 前言 在一个 Web 请求中,参数我们无非就是放在地址栏或者请求体中,个别请求可能放在请求头中. 放在地址栏中,我们可以通过如下方式获取参数: String javaboy = request.getParameter("name "); 放在请求体中,如果是 key/value 形式,我们可以通

  • 详解Spring中@Valid和@Validated注解用法

    目录 案例引入 @Valid 详解 @Validated 详解 @Valid 和 @Validated 比较 案例引入 下面我们以新增一个员工为功能切入点,以常规写法为背景,慢慢烘托出 @Valid 和 @Validated 注解用法详解. 那么,首先,我们会有一个员工对象 Employee,如下 : /** * 员工对象 * * @author sunnyzyq * @since 2019/12/13 */ public class Employee { /** 姓名 */ public St

  • 详解如何在SpringBoot项目中使用全局异常处理

    目录 1. 创建自定义异常 2.创建全局异常处理器 3.创建测试控制器 在完整的项目开发中,异常的出现几乎是无法避免的:如果凡是有可能出现异常的地方,我们都手动的使用try-catch将其捕获的话,虽然也能达到处理异常的效果,但是这样做会使得代码显得十分臃肿并且后期不好维护,也不利于多人系统开发. 在Spring Boot中提供了统一处理异常的方法,SpringBoot中有一个ControllerAdvice的注解,使用该注解表示开启了全局异常的捕获,我们只需在自定义一个方法使用Exceptio

  • 详解如何用SpringBoot 2.3.0.M1创建Docker映像

    1.发布 SpringBoot2.3.0.M1刚刚发布,它带来了一些有趣的新特性,可以帮助您将SpringBoot应用程序打包到Docker映像中.在这篇博客文章中,我们将查看创建Docker映像的典型方式,并展示如何通过使用这些新特性来改进这些镜像 2.说明 SpringBoot 2.3.0.M1 暂时不支持Windows, 很鸡肋 暂时在Mac 和Linux 上运行良好 3.常见的Docker 运行方式 一般情况下,通过docker 运行springboot 是这样的 FROM openjd

  • 详解如何配置springboot跳转html页面

    本文主要介绍了如何配置springboot跳转html页面,分享给大家,具体如下: 1.首先在pom文件中引入模板引擎jar包,即: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 2.在application.properties中

  • 详解如何将springboot项目导出成war包

    以demo-3项目为例: 1.将pom.xml中的jar改成war     2.添加依赖 <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> 3.移除插件 如果已经嵌入了tomcat插件,还要移除tomcat插件

  • 详解json在SpringBoot中的格式转换

    @RestController自动返回json /** * json 三种实现方法 * 1 @RestController自动返回json */ @GetMapping("/json") public Student getjson() { Student student = new Student("bennyrhys",158 ); return student; } @ResponseBody+@Controller 组合返回json //@RestContr

随机推荐