范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Spring优雅注册Bean的方式

  1、Spring 注册 Bean
  这篇先说明用法,下篇分析以下场景是如何将 Bean 注册进 IOC容器的。1.1、使用 @Bean 注解
  这种用法在项目中是非常常见的,基本上是必有。我们来看下用法:@Configuration public class TestConfig {      @Bean     public TestBean testBean(){         return new TestBean();     }     public static class TestBean{} }  复制代码
  这样一个 Bean 就注册进 IOC 容器了,Bean 的名称默认是方法名,并且是不会转换大小写的,也就是假如你的方法名是 TestBean() ,那么 Bean 的名称就是 TestBean 。当然我们也可以使用 name 或者 value 指定 Bean 的名称,比如 @Bean(value = "testBean"),如果二者同时存在则会报错。
  我们来看下其他属性:
  autowireCandidate:默认值是 true 。如果设置为 false 的话,那么通过 byType 的方式获取 Bean 就会报错,当然我们可以使用 Resource 注解获取。
  initMethod:在 Bean 实例化后调用的初始化方法,值是 Bean 类中的方法名。
  destroyMethod:在 Bean 要销毁时调用的清理方法,值是 Bean 类中的方法名。
  @Bean 注解只能定义在 @Configuration 类下吗? NO NO NO,它可以定义在任意能被 IOC 扫描的注解下,比如 @Component注解,至于区别,下篇再讲。1.2、使用 @ComponentScan 注解组件扫描
  先讲普通用法:@ComponentScan(basePackages = "com.rookie.spring.source.run.component") @Configuration public class TestConfig { } 复制代码
  使用 @ComponentScan 组件扫描方式,它会扫描指定包下(包括子包)下的所有类,只要包含了 @Component、@Configuration 等 Spring 的声明注解,就会将 Bean 加入到 IOC 容器中。
  深度用法:
  ComponentScan 注解中有两个这样的属性:includeFilters 与 excludeFilters,前一个是只包含规则,后一个是排除包含规则,他们的值是一个 @Filter 注解的形式,Filter 中的 type 有 5 中类型,分别如下。
  1、ANNOTATION
  第一种是以注解的形式包含或不包含,比如:@ComponentScan(basePackages = "com.rookie.spring.source.run.component",         includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Configuration.class),         useDefaultFilters = false) 复制代码
  这里边要配置useDefaultFilters = false 禁用默认规则,因为默认规则是扫描所有,配只包含就没用了。这里的意思只扫描 Configuration 注解。
  2、ASSIGNABLE_TYPE
  这种是包含我们给定的类型,不管是给定的类型和子类都会被包含进 IOC 容器。public class TestBean1 extends TestBean { } public class TestBean { }  @ComponentScan(basePackages = "com.rookie.spring.source.run.component",         includeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Configuration.class),         @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE,classes = TestBean.class)},         useDefaultFilters = false) @Configuration public class TestConfig { } 复制代码
  然后我们发现 testBean 注册进去了,为什么我们不标注 @Component 这样的注解实例也会被注册进 IOC 呢?因为 ComponentScan 会扫描包下所有文件,只要符合我们定义的过滤规则,它就会将 Bean 注册进 IOC 容器中。
  3、ASPECTJ
  ASPECTJ 是使用 aspectj 表达式
  4、REGEX
  REGEX 是使用正则表达式
  5、CUSTOM
  这种呢就是我们 SpringBootApplication 注解用到的方式了,我来解释一下具体规则:这种方式是可以自己自定义扫描规则,它接受一个实现 TypeFilter 接口的类。public class MyTypeFilter implements TypeFilter {     /**      *      * @param metadataReader 当前类的信息      * @param metadataReaderFactory 可以获取其他类的信息      * @return 匹配结果      * @throws IOException 异常      */     @Override     public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { //        获取当前扫描类信息         ClassMetadata classMetadata = metadataReader.getClassMetadata();         return classMetadata.getClassName().contains("com.rookie.spring.source.run.component.TestBean");      } }  @ComponentScan(basePackages = "com.rookie.spring.source.run.component",         includeFilters = {@ComponentScan.Filter(type = FilterType.CUSTOM,classes = MyTypeFilter.class)},         useDefaultFilters = false) @Configuration public class TestConfig { } 复制代码
  当它扫描类的时候扫描到了 TestBean,然后符合了我的匹配规则(也就是返回true)就注册进去了。1.3、使用 @Import 注解
  下面的例子中,我们直接看 Spring 源码的实现比较具有代表性一点。
  我们点进 @EnableTransactionManagement 注解中,发现了这个 @Import(TransactionManagementConfigurationSelector.class),它的作用就是将类导入,类会被注册进 IOC 容器中。
  这个注解放置的位置要是 Spring 能扫描到的地方,不然 Spring 也不会主动去解析这个注解。
  如果我们自己要使用注解的话,我们可以做个类似于 EnableTransactionManagement 的功能插拔式导入配置类,这样就可以实现动态开启一些 Bean 了。1.4、实现 ImportSelector 接口public interface ImportSelector {  	/** 	 * Select and return the names of which class(es) should be imported based on 	 * the {@link AnnotationMetadata} of the importing @{@link Configuration} class. 	 */ 	String[] selectImports(AnnotationMetadata importingClassMetadata);  }  复制代码
  我们还是来看下 TransactionManagementConfigurationSelector 这个类,看下它的继承关系发现它间接性的实现了 ImportSelector 接口,主要看它实现的这个方法:@Override 	protected String[] selectImports(AdviceMode adviceMode) { 		switch (adviceMode) { 			case PROXY: 				return new String[] {AutoProxyRegistrar.class.getName(), 						ProxyTransactionManagementConfiguration.class.getName()}; 			case ASPECTJ: 				return new String[] {determineTransactionAspectClass()}; 			default: 				return null; 		} 	} 复制代码
  这个方法的作用就是根据你返回的类全限定名(org.springframework.context.annotation.AutoProxyRegistrar)数组来创建 Bean 。
  实现了 ImportSelector 的类也是需要使用 @Import 导入。1.5、实现 ImportBeanDefinitionRegistrar 接口public interface ImportBeanDefinitionRegistrar {  	/** 	 * Register bean definitions as necessary based on the given annotation metadata of 	 * the importing {@code @Configuration} class. 	 * 

Note that {@link BeanDefinitionRegistryPostProcessor} types may not be * registered here, due to lifecycle constraints related to {@code @Configuration} * class processing. * @param importingClassMetadata annotation metadata of the importing class * @param registry current bean definition registry */ void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry); } 复制代码   这个我们来看下 @MapperScan (org.mybatis.spring.annotation)导入的 MapperScannerRegistrar 发现它实现了 ImportBeanDefinitionRegistrar:public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { AnnotationAttributes mapperScanAttrs = AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(MapperScan.class.getName())); if (mapperScanAttrs != null) { this.registerBeanDefinitions(mapperScanAttrs, registry); } } 复制代码   它的作用是拿到 BeanDefinitionRegistry Bean 的定义信息,然后往里面加 BeanDefinition 就会将相应的对象注册进去,它更深入的就不说了,实际上就是解析下注解属性,然后扫描相应的包下的类注册 Bean。我们自己搞个简单的。registry.registerBeanDefinition("testBean",new RootBeanDefinition(TestBean.class)); 复制代码   这样就注册了一个 Bean 名称是 testBean 类型是 TestBean 类型的 Bean 了。   如果注册的是一个有参构造器呢?那就这样:BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(TestBean.class); beanDefinitionBuilder.addConstructorArgValue(1); registry.registerBeanDefinition("testBean",beanDefinitionBuilder.getBeanDefinition()); 复制代码   addConstructorArgValue 根据构造器参数的顺序去添加。   实现了 ImportBeanDefinitionRegistrar 的类也是需要使用 @Import 导入。1.6、实现 FactoryBean 接口public class MyFactoryBean implements FactoryBean { @Override public TestBean getObject() throws Exception { return new TestBean(); } @Override public Class<?> getObjectType() { return TestBean.class; } @Override public boolean isSingleton() { return true; } } @Import(MyFactoryBean.class) @Configuration public class TestConfig { } 复制代码   然后 TestBean 就注册进去了,打印的时候我们发现 Bean 的名称是 MyFactoryBean 的全限定名,但是它的类型是 TestBean 类型的,如果想要获取 MyFactoryBean 类型的 Bean 的话,通过 Bean 名称为 &myFactoryBean 就能获取到。1.7、使用 spring.factories 配置   在我们的Spring Boot项目中,一般都是只扫描主类下的所有类,然后将一些被特定注解标注的类加载到IOC容器,但是如果我们将包分离,我们又如何更加方便的将其他包的类加载进来呢? spring boot提供了一种类似于Java的SPI(服务发现)机制spring.factories,只要在resources目录下创建META-INF文件夹,再创建 spring.factories文件,然后再里面配置org.springframework.boot.autoconfigure.EnableAutoConfiguration= com.jylcloud.jyl.common.commondcs.config.RedissonManagerConfig 复制代码   这样在导入当前包的就会自动扫描spring.factories文件,解析后将里面的一些类加载到IOC容器中。具体的实现代码在spring-core的SpringFactoriesLoader类中。1.8、使用 @Component、@Repository、@Service、@Controller、@RestController   这些就不讲了。


如何在家搭个小型服务器?送你一个神器,wgcloud监控系统,免费的,只要是服务器,肯定选它就没错了。我们项目中就用的它,主要是领导喜欢它的UI风格,它用户体验做的确实也好。它能对服务器各种指标进行实时监过年该送什么手机给爸妈?这几点才是刚需,长辈使用更放心之前很多朋友都私信妖妖,该如何给家里的父母长辈挑选手机,其实父母需要的手机并不需要多强大的性能和复杂的操作,最关键的是以下几点,才是父母长辈需要的功能,凭着三点挑选手机,大概率挑选中国互联网下西洋中国互联网的航海时代,显然是一个大浪淘沙的时代。文丨华商韬略胖大海很难相信,老美会钟情于修仙,爱上霸道总裁中东土豪逐渐在老铁化。而这些,都是中国互联网企业文化输出的成果。从难破壁垒欠网贷想上岸有多难?虽然国家有规定如果负债者有困难,可以和平台金融机构协商,只还本金,利息违约金减免,但是基本没有几家网贷平台愿意这么干。好多银行都可以,不知道网贷平台怎么不同意。而且虽然国家有规定,2000到3000元宝爸宝妈手机推荐2000到3000元,是大部分朋友购买手机的选择价位。本文推荐手机的对象是人到中年,以工作或家庭为重,手机用途以工作为主的朋友。我们有的在为房子媳妇儿奋斗的路上,有的需要经常给孩子2022年有望上市的10款手机随着智能手机发展的步伐如此之快,总有一些东西在等待。一旦有新的手机发布,人们就开始期待下一件大事了。这里我们来看看那些尚未上市的手机,即将于2022年上市的手机,看看哪款是你最期待OPPOReno7测评性价比高,物美价廉众所周知,目前OPPOReno系列的手机一直都是OPPO主打的明星款式,OPPOReno7更是其代表之一,在手机市场中的热度也是与日俱增,吸引着不少朋友的关注。只不过目前在网上关于为什么没有iPhone9?苹果为什么打破命名规则?这是iPhone7,这是iPhone8,这是iPhoneX,你有没有发现中间少了个iPhone9。苹果并没有按数字的顺序命名手机,而是直接从8跳到了X,很多人就好奇。苹果为什么要这一键还原及其他笔记本电脑的一键还原,重装系统,如何自己操作?在更新和安全中进行还原。1。点开始,设置。选更新和安全,选左侧菜单中的恢复选项。点击开始选项。2。弹出初始化这台电脑弹窗。根据个人需要IPS屏幕最大硬伤终被解决LG量产IPS新面板,对比度上去了在LCD面板中,目前基本上也就只有IPS和VA两种类型的面板了,其他面板实际都是这两种面板衍生而来的,比如说三星的PLS面板以及京东方的ADS面板,其实在技术类型上都算是IPS面板年终盘点你心目中的2021年最美手机是哪款?第五小米12系列,得票数10票与其说小米12是一款2021年机型,我觉得它更像是一款今年发布的新机。作为发布于2021年尾巴的系列机型,其确实是名副其实的新机,只是对于一向热衷于抢
延续影像能力不失外观创新,小屏旗舰华为P50E真香3月24日,华为P50E已经正式开售,作为P50家族最容易上车的一款旗舰,8128GB版本仅需4088元,8256GB版本也只要4488元。无疑吸引了众多小伙伴的目光!充满质感的色iQOOneo6和realme真我GT2价格差不多,该如何选?更建议选择realme真我GT2,256GB价格便宜了400元,但整体配置差距很小,在某些方面甚至更强1主摄为索尼IMX766,底更大规格更到,成像效果更好2电池容量更大。而iQO智能纯电汽车智己L7上市,价格瞄准豪华品牌智己汽车日前宣布智己L7上市。其中,智己L7Pro售价40。88万元,智己L7Dynamic售价36。88万元。智己L7在底层架构上采用了全新的纯电架构,以零百公里加速3。87秒的五月换机首选,这三款手机好评率最高,性能强悍关键价格不贵OPPOFindX3OPPOFindX3系列是目前OPPO旗下最高端的旗舰机型,除了旗舰级的硬件配置,该系列机型还有以下几点特色顶级的手机屏幕,2K120HzLTPO三星E4材质,比iPhone14Pro漂亮,魅族19渲染图曝光种种迹象表明今年的iPhone14Pro将会采用感叹号屏幕,这是苹果首次放弃刘海屏。不过相对于单挖孔屏,感叹号屏幕可能需要市场和消费者适应一段时间。除了屏幕形态的变化之外其它方面还国产6200mAh4nm新机,161TB放在六千出头,值得否?最近这几年来,手机厂商们为了差异化经营,纷纷向市面上推出了自己主打游戏性能的旗舰手机,其中比较出名的品牌有红魔黑鲨联想拯救者华硕ROG以及近期入局游戏手机的红米和一加。但是大家发现WIN10安装教程,装WIN10系统详细教程,通过PE安装原版微软WIN10电脑如果没有安装系统,就等没有灵魂,只是一个摆设。通过U盘PE系统装微软原版WIN10。首先我们要准备好工具。1优盘(这里推荐是16G以上)并且已经做好PE的优盘,不会做PE优盘,加码智慧零售家乐福零售云第100店落地北京五里坨北京商报讯(记者赵述评赵驰)4月18日,北京商报记者了解到,家乐福零售云全国第100家店北京五里坨店开启试营业。北京五里坨店经营总面积约为2600,商品SKU约2万,包括蔬菜水果酒溢价到9000也愿意买,华为Mate40Pro今晚限时促销,直降500对于华为Mate40Pro大家并不陌生,甚至是很多人梦寐以求的手机,因为太难买到了,有的朋友甚至表示就算溢价到9000也愿意买,那么华为Mate40Pro真的这么值得买吗?就在今天小米有品ESM智能剃须系统上线,39元却有德国进口钢材,太实用了每天早起后,男人总是有2分钟是需要留给刮胡子的,胡须是男人的象征,但是当下审美中,留着胡须会略显邋遢,干净清爽的男人才是当下审美主流。想要把胡须刮得干干净净,一款好用又性价比超高的证监会滴滴自主退市是特定个案与其他在美上市中概股无关本报记者吴晓璐4月16日,滴滴官网发布公告称,将于5月23日举行临时股东大会,就公司从纽约证券交易所自愿退市进行投票。为更好地配合网络安全审查和整改措施,在退市完成前,公司将不会申