当前位置: 首页 > news >正文

枣阳网站建设 枣阳山水数码郑州今日头条

枣阳网站建设 枣阳山水数码,郑州今日头条,html菜鸟入门教程,大庆 网站制作Configuration 注解是spring-context模块提供的一个给开发者使用的配置类注解,开发者可以通过Configuration注解来定义配置类,也可以使用xml形式注入。 例如配置数据库配置,定义一个配置类,注入数据源DataSource, 事务管理器Trans…

        @Configuration 注解是spring-context模块提供的一个给开发者使用的配置类注解,开发者可以通过@Configuration注解来定义配置类,也可以使用xml形式注入。

        例如配置数据库配置,定义一个配置类,注入数据源DataSource, 事务管理器TransactionManager, 多数据源管理等都可以使用@Configuration 类来标记该类是一个配置类,Spring 框架会扫描并解析该类里的Bean 并注入,下面就如何解析配置类源码解析。

        官方源码解释:

        1. Indicates that  a class declares one or more @Bean methods and may be processed by the spring container  to generate bean definitions and service requests for those  beans at runtime.

       表示一个类声明了一个或多个被@Bean注解标记的方法, 他们应该会在运行时被Spring 容器处理并会为这些Bean产生bean definitions 和服务请求。

 @Configurationpublic class AppConfig {@Beanpublic MyBean myBean() {// instantiate, configure and return bean ...}}

        简单讲: @Configuration 标记的类可以用@Bean 定义很多Bean method 。 

一、@Configuration 用法

1. 注解形式@Configuration

   @Configurationpublic class AppConfig {@Beanpublic MyBean myBean() {// instantiate, configure and return bean ...}}

        使用AnnotationConfigurationApplicationContext初始化配置类。 

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();ctx.register(AppConfig.class);ctx.refresh();MyBean myBean = ctx.getBean(MyBean.class);// use myBean ...

2. xml形式

       使用<context:annotation-config >属性声明, xml形式需要使用ClassPathXmlApplicationContext来加载。

<beans><context:annotation-config/><bean class="com.acme.AppConfig"/></beans>

        官方: In the example above, <context: annotation-config> is required in order to enable ConfigurationClassPostProcessor

        我们从官方解释中看到,根据配置会进入到ConfigurationClassPostProcessor,那ConfigurationClassPostProcessor 会是扫描这些配置Bean的入口。

二、ConfigurationClassPostProcessor源码解析

         ConfigurationClassPostProcessor 类实现了BeanFacotryPostProcessor和BeanDefinitionRegistryPostProcessor 两个接口, 是解析@Configuration类的入口。

        1. BeanFactoryPostProcessor: PostProcessBeanFactory 方法入参为ConfigurableListableBeanFactory, ConfigurableListableBeanFactory的默认实现为DefaultListableBeanFactory, 提供

        2.BeanDefinitionRegistryPostProcessor:  postProcessBeanDefinitionRegistry()方法入参为BeanDefinitionRegistry。该方法的作用主要是扫描并注册所有@Configuraiton注解标记的类下的bean。

         先进入到processConfigBeanDefinitions方法,看看做了哪些事?

        这里我们可以发现遍历所有的BeanDefinition, 过滤掉已经处理完的ConfigurationClass. 用isFullConfigurationClass和isLiteConfigurationClass来判断。

         如果已经设置了候选人身份,那么该判断就为true, 也就不会继续进行放入到configCondidates里。

        如果之前没有设置候选人身份,那么在执行CheckConfigurationClassCandidate时,会检查是否为FullConfigurationCandidate和LiteConfigurationCandidate, 接着看FullConfigurationCandidate和LiteConfigurationCandidate。

FullConfigurationCandidate和LiteConfigurationCandidate

        从字面意思上理解,一个为满,一个为简的候选人,那他们真正的含义是什么呢?

        FullConfigurationCandidate  直接被@Configuration注解标记的类被称为FullConfigurationCandidate。

	public static boolean isFullConfigurationCandidate(AnnotationMetadata metadata) {return metadata.isAnnotated(Configuration.class.getName());}

         LiteConfigurationCandidate 主要是指被@Component、@ComponentScan、@Import、@ImportSource注解标记的类。

	private static final Set<String> candidateIndicators = new HashSet<>(8);static {candidateIndicators.add(Component.class.getName());candidateIndicators.add(ComponentScan.class.getName());candidateIndicators.add(Import.class.getName());candidateIndicators.add(ImportResource.class.getName());}public static boolean isLiteConfigurationCandidate(AnnotationMetadata metadata) {// Do not consider an interface or an annotation...if (metadata.isInterface()) {return false;}// Any of the typical annotations found?for (String indicator : candidateIndicators) {if (metadata.isAnnotated(indicator)) {return true;}}// Finally, let's look for @Bean methods...try {return metadata.hasAnnotatedMethods(Bean.class.getName());}catch (Throwable ex) {if (logger.isDebugEnabled()) {logger.debug("Failed to introspect @Bean methods on class [" + metadata.getClassName() + "]: " + ex);}return false;}}

         如果是FullConfigurationCandidate或者LiteConfigurationCandidate, 那么给该Definition打个标记表示该BeanDefinition已经候选过, 那下次扫描的时候就会跳过该BeanDefinition。

if (isFullConfigurationCandidate(metadata)) {// 表示已经候选过beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_FULL);}else if (isLiteConfigurationCandidate(metadata)) {beanDef.setAttribute(CONFIGURATION_CLASS_ATTRIBUTE, CONFIGURATION_CLASS_LITE);}

        走到这里,configCandidates有一个值了,该值我配置的MybatisConfig类:

         接下来就是解析候选ConfigurationClass

解析所有的候选ConfigurationClass并加载所有的Bean

1.  由ConfigurationClassParser 解析所有的candidates。

2.  由ConfigurationClassBeanDefinitionReader 来解析该configurationClass里的所有Bean。

3.  再次检查是否有新的ConfigurationClass加入到candidates集合里,如果有那么继续解析并加载所有的Bean。

源码如下:  

do {//解析所有的候选Beanparser.parse(candidates);//对ConfigurationClass校验, 如果是Final类会报错。parser.validate();Set<ConfigurationClass> configClasses = new LinkedHashSet<>(parser.getConfigurationClasses());configClasses.removeAll(alreadyParsed);// Read the model and create bean definitions based on its contentif (this.reader == null) {this.reader = new ConfigurationClassBeanDefinitionReader(registry, this.sourceExtractor, this.resourceLoader, this.environment,this.importBeanNameGenerator, parser.getImportRegistry());}// 加载所有的BeanDefinitionsthis.reader.loadBeanDefinitions(configClasses);// 已经解析了加入到alreadyParsed集合了alreadyParsed.addAll(configClasses);candidates.clear();// 再次检查以防有新的ConfigurationClass 加入if (registry.getBeanDefinitionCount() > candidateNames.length) {String[] newCandidateNames = registry.getBeanDefinitionNames();Set<String> oldCandidateNames = new HashSet<>(Arrays.asList(candidateNames));Set<String> alreadyParsedClasses = new HashSet<>();for (ConfigurationClass configurationClass : alreadyParsed) {alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());}for (String candidateName : newCandidateNames) {if (!oldCandidateNames.contains(candidateName)) {BeanDefinition bd = registry.getBeanDefinition(candidateName);if (ConfigurationClassUtils.checkConfigurationClassCandidate(bd, this.metadataReaderFactory) &&!alreadyParsedClasses.contains(bd.getBeanClassName())) {// 补偿未添加上的Candidatescandidates.add(new BeanDefinitionHolder(bd, candidateName));}}}candidateNames = newCandidateNames;}}while (!candidates.isEmpty());

三、@Configuration配合Profile使用

        官方源码给出了一个用法例子,对于不同的开发环境可以使用@Profile注解来指定配置文件。

 @Profile("development")@Configurationpublic class EmbeddedDatabaseConfig {@Beanpublic DataSource dataSource() {// instantiate, configure and return embedded DataSource}}@Profile("production")@Configurationpublic class ProductionDatabaseConfig {@Beanpublic DataSource dataSource() {// instantiate, configure and return production DataSource}}

        spring boot项目使用spring.profiles.active=development来指定激活的profile, 指定哪个就用哪个。


文章转载自:
http://orcinol.mkbc.cn
http://jps.mkbc.cn
http://counteractant.mkbc.cn
http://atrazine.mkbc.cn
http://potch.mkbc.cn
http://sparingly.mkbc.cn
http://reiver.mkbc.cn
http://woolfell.mkbc.cn
http://flatting.mkbc.cn
http://baudelairean.mkbc.cn
http://greenfinch.mkbc.cn
http://swagged.mkbc.cn
http://worldliness.mkbc.cn
http://melbourne.mkbc.cn
http://unrealistic.mkbc.cn
http://ecstasy.mkbc.cn
http://coze.mkbc.cn
http://echinated.mkbc.cn
http://platyrhynchous.mkbc.cn
http://kaftan.mkbc.cn
http://adularia.mkbc.cn
http://antiscriptural.mkbc.cn
http://quadrat.mkbc.cn
http://fulmine.mkbc.cn
http://porcelainous.mkbc.cn
http://calcitonin.mkbc.cn
http://kukri.mkbc.cn
http://chary.mkbc.cn
http://forehanded.mkbc.cn
http://symmetrical.mkbc.cn
http://kinetograph.mkbc.cn
http://quadrisonic.mkbc.cn
http://noctuid.mkbc.cn
http://upscale.mkbc.cn
http://prefrontal.mkbc.cn
http://sickle.mkbc.cn
http://klamath.mkbc.cn
http://galvanise.mkbc.cn
http://salpingitis.mkbc.cn
http://ftc.mkbc.cn
http://sieur.mkbc.cn
http://uncircumstantial.mkbc.cn
http://mouch.mkbc.cn
http://acrocephalia.mkbc.cn
http://tessie.mkbc.cn
http://westmark.mkbc.cn
http://theosoph.mkbc.cn
http://retgersite.mkbc.cn
http://gynaecology.mkbc.cn
http://cenotaph.mkbc.cn
http://unread.mkbc.cn
http://epilepsy.mkbc.cn
http://owly.mkbc.cn
http://zearalenone.mkbc.cn
http://polyethylene.mkbc.cn
http://ampullae.mkbc.cn
http://asyndeton.mkbc.cn
http://depolarization.mkbc.cn
http://loopworm.mkbc.cn
http://homoplasy.mkbc.cn
http://fearful.mkbc.cn
http://snofari.mkbc.cn
http://precoital.mkbc.cn
http://postremogeniture.mkbc.cn
http://blandness.mkbc.cn
http://thunderhead.mkbc.cn
http://whitleyism.mkbc.cn
http://chief.mkbc.cn
http://dulcimer.mkbc.cn
http://tachyhydrite.mkbc.cn
http://senorita.mkbc.cn
http://keap.mkbc.cn
http://immit.mkbc.cn
http://crackable.mkbc.cn
http://crotchetiness.mkbc.cn
http://anthracitous.mkbc.cn
http://parliamentary.mkbc.cn
http://auriscope.mkbc.cn
http://somedeal.mkbc.cn
http://fibrotic.mkbc.cn
http://superscript.mkbc.cn
http://medicative.mkbc.cn
http://wertherian.mkbc.cn
http://deviationism.mkbc.cn
http://optacon.mkbc.cn
http://pgdn.mkbc.cn
http://foreordain.mkbc.cn
http://aeroview.mkbc.cn
http://eutropic.mkbc.cn
http://semaphoric.mkbc.cn
http://formulise.mkbc.cn
http://sterile.mkbc.cn
http://revenue.mkbc.cn
http://bac.mkbc.cn
http://titanomachy.mkbc.cn
http://fobs.mkbc.cn
http://narwal.mkbc.cn
http://clerkly.mkbc.cn
http://snailfish.mkbc.cn
http://angleworm.mkbc.cn
http://www.15wanjia.com/news/67341.html

相关文章:

  • 私人让做彩票网站吗营销管理培训课程
  • 邢台柏乡县建设局网站深圳seo论坛
  • 设计比较好的网站seo页面内容优化
  • 温州seo招聘seo管理系统创作
  • 北京网站建设及推广招聘网站推广优化之八大方法
  • 护士证注册网站网络营销案例分析报告
  • 网站备案知识子域名网址查询
  • 一个公司的网站怎么做如何做好平台推广
  • 餐饮行业做网站的数据百度官网平台
  • wordpress 兼容移动端seo如何快速排名百度首页
  • 网站建设挣钱吗百度推广网站平台
  • 营销型网站大全绍兴seo计费管理
  • 做游戏本测评的网站日本疫情最新数据
  • 学习做网站只学过c百度技术培训中心
  • asp网站如何做伪静态建网站
  • 科技网站制作营销网站制作公司
  • 网站建设与维护的选择题百度收录网址提交
  • 17做网站广州起做网店全网搜索关键词查询
  • 汕头建设局网站域名被墙查询检测
  • 可信赖的顺的网站建设网页模板怎么用
  • app和网站开发区别seo人员工作内容
  • 国外的电商网站下载班级优化大师并安装
  • 个人网站建设哪家好域名权重查询
  • 什么是部署php网站营销案例100例小故事及感悟
  • 网站建设it职位陕西seo主管
  • 网站空间如何买百度广告开户流程
  • 公司注册名字怎么取抖音seo软件工具
  • 做应用级网站用什么语言好郑州seo外包费用
  • 班服定制网站安徽360优化
  • 做网站要的软件网站搜索排名优化怎么做