2.1 获取所有的 Bean ApplicationContext 提供了获取所有已经成功注入 Spring IoC 容器的 Bean 名称的方法 getBeanDefinitionNames() 。...ApplicationContext 提供了可以加载特定类型的 Bean 的所有 Bean 的方法getBeansOfType()。...它将返回 Map 其中键是 Bean 名称,而值是 Bean 的实际对象。...的 getBeansWithAnnotation() 方法可以让我们获取 @Service,@Controller或任何其它可以用来创建 Bean 的注解创建的 Bean 。...总结 在本文中,我们学习如何从 Spring 应用上下文中获取所有 Bean 的列表。
Spring 容器最基本最基本的接口就是BeanFactory。BeanFactory负责配置,创建、配置Bean,其中有一个子接口ApplicationContext,也被称为Spring上下文。...容器同时还管理这Bean和Bean之间的依赖关系 Spring IoC容器的实现,从根源上是BeanFactory,但是真正作为一个可以独立使用的IoC容器的还是DefaultListableBeanFactory...requiredType) 通过Bean 的名称+类型组合查找 T getBean(String name, Class requiredType) 通过注解查找 Map getBeansWithAnnotation...在获取ApplicationContext实例后,就可以像BeanFactory一样调用getBean(beanName)返回Bean了。...ApplicationContext的初始化和BeanFactory有一个重大的区别:BeanFactory在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例化目标Bean;而ApplicationContext
Bean 初始化流程: 1、 Spring 先检查注解注入的bean,并将它们实例化 2、 然后spring初始化bean的顺序是按照xml中配置的顺序依次执行构造 3、 如果某个类实现了ApplicationContextAware...()方法执行完毕后,调用afterPropertiesSet()方法进行操作 */ object DomainAbilityInvoker { /** * DomainAbility...()方法执行完毕后,调用afterPropertiesSet()方法进行操作 */ @Component object DomainAbilityLoader : ApplicationContextAware...() /** * 实现了ApplicationContextAware接口的类会被调用 setApplicationContext() 方法,从而获取到 Spring容器的上下文。...*/ override fun setApplicationContext(applicationContext: ApplicationContext) { this.ctx
也就是说如果想让注解能够实现预期的作用,就必须给注解搭配一个能够读取并处理该注解的方法,这里为了方便描述我将这样一个方法定义为注解处理器。...那么如何在Spring中实现一个注解处理器呢?...由此我们得到两种在Spring框架中实现注解处理器的方式: 基于BeanDefinition方式:通过ApplicationContext的getBeansWithAnnotation方法获取被注解的Bean...} } } private void handleClass() { Map beans = applicationContext.getBeansWithAnnotation...但是在这里我们需要注意一个问题,即如果从应用上下中获取到的Bean是一个代理对象,那么上面关于方法级别的处理逻辑还能够生效吗?
(Spring 源码第 9 篇,深入分析 FactoryBean),大家知道 Spring 中还有一个和 FactoryBean 单词很像的类叫做 BeanFactory!...同时,ApplicationContext 和 BeanFactory 还有一个很大的不同在于 ApplicationContext 在容器启动时,就会完成所有 Bean 的初始化,这也就以为着容器启动时间较长...getBeanProvider 方法用于获取指定 Bean 的提供者,可以看到它返回的是一个 ObjectProvider,该类扩展自 ObjectFactory,从 Spring4.3 时开始提供。...不同的是,ObjectFactory 中只有一个 getObject 方法,该方法可以返回 Object 实例。...从 Spring4.3 开始,在 UserService 中注入 UserDao 时,如果构造方法只有一个参数,可以不用添加 @Autowired 注解,像下面这样: @Service public class
设计模式 需求 业务需求是,有一个代报考系统,里面的一个功能是根据报考类目的不同维护不同的代报考规则。...我们从中获取一个抽象的处理器AbstractExamRuleHandler,调用其方法实现业务逻辑。...,当spring容器初始化的时候,会自动的将ApplicationContext注入进来 我们将核心的功能封装在ExamRuleHandlerContext类中,完成上面的功能。...) throws BeansException { Map beans = applicationContext.getBeansWithAnnotation...本文只是提供一个大致的思路,还有很多细节可以灵活变化,例如使用枚举类型、或者静态常量,作为代报考的类型,相信你能想到更多更好的方法。
= applicationContext.getBeansWithAnnotation(PayCode.class); if (beansWithAnnotation...3、模板方法判断 当然除了上面介绍的两种方法之外,spring的源码实现中也告诉我们另外一种思路,解决if...else问题。...我们先一起看看spring AOP的部分源码,看一下DefaultAdvisorAdapterRegistry的wrap方法 public Advisor wrap(Object adviceObject...list集合中,返回在调用支付接口时循环遍历这个list集合,如果code跟自己定义的一样,则调用当前的支付类实例的pay方法。...4.spring中的判断 对于参数的异常,越早被发现越好,在spring中提供了Assert用来帮助我们检测参数是否有效。
但目前我们想要的效果是让所有的接口走一个统一的方法,再由这个方法分发到具体的实现上。那这个有意思的需求要如何实现呢? 实现思路 我们肯定需要一个统一的处理器,让所有的第三方都调用这个处理器。...首先想到的肯定是需要用户除了传递业务参数外,多传递一个 method 属性。通过这个 method 方法名属性去调用对应的方法 第一个难点在于我们如何通过一个字符串的方法名找到对应的方法呢?...这就需要了解 Spring 的 Bean 生命周期及相关知识 我们可以定义一个配置类,把我们的 Map 定义成一个 Bean,让 Spring 在启动的时候去加载并且初始化这个 Bean。...========="); } } 这里有两个需要明确的知识点: @Bean 注解标记的方法必须要有返回值 @PostConstruct 注解标记的方法会在依赖注入完成后执行,适合初始化操作,...* * @param method 方法 * @param paramMap 形参列表 * @return 参数列表 */ private
= applicationContext.getBeansWithAnnotation(PayCode.class); if (beansWithAnnotation...2.3 模板方法判断 当然除了上面介绍的两种方法之外,spring 的源码实现中也告诉我们另外一种思路,解决 if...else 问题。...我们先一起看看 spring AOP 的部分源码,看一下 DefaultAdvisorAdapterRegistry 的 wrap 方法 public Advisor wrap(Object adviceObject...list 集合中,返回在调用支付接口时循环遍历这个 list 集合,如果 code 跟自己定义的一样,则调用当前的支付类实例的 pay 方法。...2.6.4 spring 中的判断 对于参数的异常,越早被发现越好,在 spring 中提供了 Assert 用来帮助我们检测参数是否有效。
,该方法的逻辑是获取ApplicationContext对象并从中得到PayCode的子类,之后遍历这些子类并构建一个Map对象,key为支付代码payCode,value则为IPay子类,后续我们就能通过...Map beans = applicationContext.getBeansWithAnnotation(PayCode.class); if(beans...第一步,新建PayHandler抽象类,里面定义一个PayHandler类型的next属性,表示处理完对应逻辑后应当返回的对象,即返回处理的对象本身,这样就构成了一个链式调用: public abstract...模板方法判断 模板方法这种方式灵感来源于Spring AOP的源码,查看一下其中DefaultAdvisorAdapterRegistry#wrap()方法的源码: public Advisor...type){ return "type不能为空"; } return "后续逻辑"; } 可以考虑使用Spring提供的断言来进行判断,
/org/apache/rocketmq/spring/autoconfigure/ListenerContainerConfiguration.java @Configuration public class... beans = this.applicationContext.getBeansWithAnnotation(RocketMQMessageListener.class...applicationContext;其afterSingletonsInstantiated方法会获取标注了RocketMQMessageListener注解的bean,然后挨个执行registerContainer...,然后对于没有running的container执行start方法 RocketMQMessageListener rocketmq-spring-boot-2.0.3-sources.jar!...applicationContext;其afterSingletonsInstantiated方法会获取标注了RocketMQMessageListener注解的bean,然后挨个执行registerContainer
序 本文主要研究一下rocketmq的ListenerContainerConfiguration ListenerContainerConfiguration rocketmq-spring-boot... beans = this.applicationContext.getBeansWithAnnotation(RocketMQMessageListener.class...applicationContext;其afterSingletonsInstantiated方法会获取标注了RocketMQMessageListener注解的bean,然后挨个执行registerContainer...,然后对于没有running的container执行start方法 RocketMQMessageListener rocketmq-spring-boot-2.0.3-sources.jar!...applicationContext;其afterSingletonsInstantiated方法会获取标注了RocketMQMessageListener注解的bean,然后挨个执行registerContainer
spring boot 中经常遇到这样的场景,老大让你写一个定时任务脚本、开启一个spring缓存,或者让你提供spring 异步支持。...之前有写过一个项目,是日志系统,其中要提供spring 注解支持,简化配置,当时就是参考以上源码的技巧实现的。...可以看出,这种方法适用于初始化时便获取到全部想要的信息,如@Scheduled的元数据等。同时需要注意:被注解方法不能有参数,不能有返回值。...第二种方式只传入了一个AnnotationMetadata,返回类全限定名,框架自动帮你注册。而第三种方式,还传入了一个BeanDefinitionRegistry让你自己去注册。...{ DisconfMgrBean bean = new DisconfMgrBean(); Map bootBeans = this.applicationContext.getBeansWithAnnotation
本文主要研究一下rocketmq的ExtProducerResetConfiguration timg (37).jpeg ExtProducerResetConfiguration rocketmq-spring-boot.../org/apache/rocketmq/spring/autoconfigure/ExtProducerResetConfiguration.java @Configuration public class...applicationContext) throws BeansException { this.applicationContext = (ConfigurableApplicationContext... beans = this.applicationContext.getBeansWithAnnotation(ExtRocketMQTemplateConfiguration.class...DefaultMQProducer,然后执行其start方法,然后复制给该bean,并设置objectMapper ExtRocketMQTemplateConfiguration rocketmq-spring-boot
序 本文主要研究一下rocketmq的ExtProducerResetConfiguration ExtProducerResetConfiguration rocketmq-spring-boot-2.0.3.../org/apache/rocketmq/spring/autoconfigure/ExtProducerResetConfiguration.java @Configuration public class...applicationContext) throws BeansException { this.applicationContext = (ConfigurableApplicationContext... beans = this.applicationContext.getBeansWithAnnotation(ExtRocketMQTemplateConfiguration.class...DefaultMQProducer,然后执行其start方法,然后复制给该bean,并设置objectMapper ExtRocketMQTemplateConfiguration rocketmq-spring-boot
RPC 接口 本示例提供了两个接口:HelloService 和 HiService,里面分别有一个接口方法,客户端仅需引用 rpc-sample-api,只知道接口定义,并不知道里面的具体实现。...服务启动 本示例 Server 使用 Spring Boot,但是我们并不需要启动一个 Web 服务,只需要保持后台运行就可以,所以将 web 设置成 WebApplicationType.NONE @...; for (Object object : applicationContext.getBeansWithAnnotation(RpcServer.class).values()) {...> cls(); } applicationContext.getBeansWithAnnotation(RpcServer.class).values() 就是获取项目中带有 RpcServer 注解的类...,验证能够正常返回即可。
但是有一些方法可以最小化所有臃肿重复代码。这个Spring beans教程向您展示了如何编写更高效的应用程序。...注解类的定义 首先创建一个自定义注解,可以将其放在每个实现类上,使它们成为可用的一种Spring bean。...甚至可能在ComponentScan中使用新的注解,以便这个注解将放在每一个类上,并使每个实现类都成为一个Spring bean,甚至不必在其上添加@Component类型的注解了。...Spring在ListableBeanFactory中有一个扩展BeanFactory的方法,你可以在ApplicationContext中找到它。...bean,但是使用这个Spring bean教程,您可以使用注解和简单的反射方法或Spring应用程序方法调用来简化问题。
1、策略模式简介 策略模式:定义一系列算法,然后将每一个算法封装起来,并将它们可以互相替换。也就是将一系列算法封装到一系列策略类里面。策略模式是一种对象行为型模式。...return modelAndView; } } 在一个@Service类里,将实现SysHandler接口的类都装载到Spring容器 public static Map sysHandlerMap = new HashMap(16); @Autowired ApplicationContext applicationContext...; /** * 装载到Spring容器 * @Author nicky * @Date 2020/06/23 17:47 * @Param [applicationContext....getBeansWithAnnotation(SysType.class); for (Map.Entry entry
BeanFactory:Spring容器的基石,顶级容器接口 在第一个章节中,我们提到过,在Spring官方文档中,称org.springframework.context.ApplicationContext...这个接口就代表了Spring的容器,在解释ApplicationContext之前,必须要先介绍Spring容器的基石,BeanFactory接口。...通过这些方法,可以看出BeanFactory是一个典型的工厂模式的工厂接口。 在之前的文章中我们提到过:Spring框架的设计中,充满了通过上下继承关系来对基类进行功能扩充与功能分隔的类体系。...Spring使用父子容器实现了很多功能,比如在Spring MVC中,展现层Bean位于一个子容器中,而业务层和持久层的Bean位于父容器中。...在此基础上,ApplicationContext还同时继承了其它四个接口,对容器进行了方法的扩展,其源码如下: 额外的知识 BeanFactroy和ApplicationContext的区别 BeanFactory
interface IConvertEnumToCodeItem { String getCodeName(); } 规范化枚举定义 定义枚举包含name和value字段,实现枚举转换接口,返回代码项名称...Exception e){ e.printStackTrace(); } } 系统启动扫描 新建class实现ApplicationRunner重写run方法...(value = 99) public class StartUpContext implements ApplicationRunner { @Autowired private ApplicationContext...(ApplicationArguments args) throws Exception { Map annotatedBeans = context.getBeansWithAnnotation...if(StringUtil.isEmpty(codeName)){ return Result.errorResult().add("msg","代码项名称不能为空"