深度解析互联网大厂面试难题自定义@EnableXX系列

 

其实是一个@Import的设计技巧

创建注解@EnableXX(任何名称注解都行,只是这个名字好一些)

XXConfiguration类不能使用@Component,不然Bean就立即注册了,达不到开关的目的

使用@EnableXX注解的时候,一定是与@Component或者@Configuration进行复合使用,否则开关本身无效,换句话说就是让别的@Component或者@Configuration把自己的@Bean带进去。

实体类

package com.example.demo14.entity;

public class Stu {

String name;

public Stu(String name) {

this.name = name;

}

public Stu() {

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public String toString() {

return "Stu{" +

"name='" + name + '\'' +

'}';

}

}

配置类

package com.example.demo14.configuration;

import com.example.demo14.entity.Stu;

import org.springframework.context.annotation.Bean;

//注意这里,没有添加@Configuration,不然开关就失效了

public class StuConfiguration {

@Bean

public Stu stu() {

return new Stu();

}

}

注解类

package com.example.demo14.annotation;

import com.example.demo14.configuration.StuConfiguration;

import org.springframework.context.annotation.Import;

import java.lang.annotation.*;

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

//这里的@Import成为了开关的关键,携带具有@Bean的类

//注意这里如果@Import是普通类,也注册的进去

@Import(StuConfiguration.class)

public @interface EnableStu {

}

启动类

package com.example.demo14;

import com.example.demo14.annotation.EnableStu;

import com.example.demo14.configuration.StuConfiguration;

import com.example.demo14.entity.Stu;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.context.ConfigurableApplicationContext;

import java.util.Map;

@SpringBootApplication

//开启功能,然后注册Bean

//因为@SpringBootApplication本身复合了@Configuration,因此具备注册@Bean的能力

@EnableStu

public class Demo14Application {

public static void main(String[] args) {

ConfigurableApplicationContext context = SpringApplication.run(Demo14Application.class, args);

//查看@Bean情况

Map<String, Stu> beansOfType = context.getBeansOfType(Stu.class);

System.out.println(beansOfType.size());

//查看@Configuration情况,也就是StuConfiguration自己

Map<String, StuConfiguration> beansOfType2 = context.getBeansOfType(StuConfiguration.class);

System.out.println(beansOfType2.size());

context.close();

}

}

深度解析互联网大厂面试难题自定义@EnableXX系列的更多相关文章

  1. 《大厂面试》京东+百度一面,不小心都拿了Offer

    你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和 ...

  2. 深度解析HashMap底层实现架构

    摘要:分析Map接口的详细使用以及HashMap的底层是如何实现的? 本文分享自华为云社区<[图文并茂]深度解析HashMap高频面试及底层实现结构![奔跑吧!JAVA]>,原文作者:灰小 ...

  3. spring源码深度解析— IOC 之 自定义标签解析

    概述 之前我们已经介绍了spring中默认标签的解析,解析来我们将分析自定义标签的解析,我们先回顾下自定义标签解析所使用的方法,如下图所示: 我们看到自定义标签的解析是通过BeanDefinition ...

  4. spring5 源码深度解析----- 被面试官给虐懵了,竟然是因为我不懂@Configuration配置类及@Bean的原理

    @Configuration注解提供了全新的bean创建方式.最初spring通过xml配置文件初始化bean并完成依赖注入工作.从spring3.0开始,在spring framework模块中提供 ...

  5. 经验总结:超详细的 Linux C/C++ 学习路线!大厂面试指南

    ❝ 文章每周持续更新,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) ❞ 最近在知乎经常被邀请回答类似如何学习C++和C++后台开 ...

  6. Nginx大厂面试需要掌握多少v1.21.3

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Nginx官网 最新版本为1.21.3 Nginx (engine x) 是一个开源的.高性能的HTTP和反向代理web服务 ...

  7. 深度解析 Vue 响应式原理

    深度解析 Vue 响应式原理 该文章内容节选自团队的开源项目 InterviewMap.项目目前内容包含了 JS.网络.浏览器相关.性能优化.安全.框架.Git.数据结构.算法等内容,无论是基础还是进 ...

  8. 《SEO深度解析——全面挖掘搜索引擎优化的核心秘密》

    <SEO深度解析——全面挖掘搜索引擎优化的核心秘密> 基本信息 作者: 痞子瑞 出版社:电子工业出版社 ISBN:9787121224041 上架时间:2014-2-28 出版日期:201 ...

  9. 深度解析Objective-C笔试题

    2011-08-11 17:39 佚名 互联网 字号:T | T 本文介绍的是Objective-C笔试题,先来问一个,为什么很多内置类如UITableViewController的delegate属 ...

随机推荐

  1. python3多线程应用详解(第四卷:图解多线程中LOCK)

    先来看下图形对比: 发现没有这种密集型计算的任务中,多线程没有穿行的速率快,原因就是多线程在线程切换间也是要耗时的而密集型计算任务执行时几乎没以偶IO阻塞,这样你说谁快

  2. iOS自定义弹出视图、收音机APP、图片涂鸦、加载刷新、文件缓存等源码

    iOS精选源码 一款优秀的 聆听夜空FM 源码 zhPopupController 简单快捷弹出自定义视图 WHStoryMaker搭建美图(贴纸,涂鸦,文字,滤镜) iOS cell高度自适应 有加 ...

  3. Xshell中使用xftp怎么选择默认编辑器,如nodepad

    工具-选项-高级-编辑器路径

  4. JVM如何判断对象能否被回收

    •写在前面说起Java和C++,很容易想到让人疯狂的指针,Java使用了内存动态分配和垃圾回收技术,让我们从C++的各种指针问题中摆脱出来,更加专心于业务逻辑,不过如果我们需要深入了解java的JVM ...

  5. Vue+elementUI build打包部署后字体图标丢失问题

    错误描述:Vue+elementUI  build打包部署后字体图标丢失,控制台显示文件element-icons.woff和element-icons.ttf文件404 错误展现: 控制台报错截图 ...

  6. HTTP协议八种请求类型介绍

    HTTP 协议中共定义了八种方法或者叫“动作”来表明对 Request-URI 指定的资源的不同操作方式,具体介绍如下: OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法.也可以利用向W ...

  7. pytorch中的view函数和max函数

    一.view函数 代码: a=torch.randn(,,,) b = a.view(,-) print(b.size()) 输出: torch.Size([, ]) 解释: 其中参数-1表示剩下的值 ...

  8. CentOS 5.5 --学习(1)

    一.解决浏览器乱码问题: 用yum 安装 yum  -y  install  fonts-chinese yum  -y  install  fonts-ISO8859-2-75dpiCentOS系统 ...

  9. svn使用3 (转)

    接下来,试试用TortoiseSVN修改文件,添加文件,删除文件,以及如何解决冲突等. 添加文件 在检出的工作副本中添加一个Readme.txt文本文件,这时候这个文本文件会显示为没有版本控制的状态, ...

  10. async样例

    function iniProcessDetail(isjob) { var cursor = logColl.find({}).sort({ip: 1}); var insertbolk = []; ...