本次主要整理四个注解 @ComponentScan、@Scope、@Conditional、@Import

1. @ComponentScan(value = "com.xiaoguo") 报扫描注解: 扫描该路径下的@controller @component @service 等等注解并将其交给spring容器管理。可以选择只扫描那些组件或是排除那些组件: includeFilters=Filter[]:指定只包含的组件
excludeFilters=Filter[]:指定需要排除的组件;

注解:

 @ComponentScan(value = "com.xiaoguo.annotation", excludeFilters = {
@ComponentScan.Filter(type = FilterType.CUSTOM, classes = {MyTypeFilter.class})
})

自定义过滤类:

 package com.xiaoguo.annotation.filter;

 import com.xiaoguo.annotation.beans.Car;
import org.springframework.core.io.Resource;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter; import java.io.IOException; /**
* @author xiaoguo
* @date 2019-10-14 下午 9:11
*/
public class MyTypeFilter implements TypeFilter { @Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {
//获取当前正在扫描的类的类信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String className = classMetadata.getClassName();
Class<?> forName = null;
try {
forName = Class.forName(className);
if (Car.class.isAssignableFrom(forName)) {
// true就加载到IOC容器
return true;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return false;
}
}

2. @Scope("prototype") 此注解表示交给容器管理的对象为多例模式,不加默认为但例模式,加此注解每次从容器获取对象都是新new的对象。

3. @Conditional({WindowsCondition.class}) 按照一定的条件满足条件的则注册bean到容器中

注解:

 @Conditional({LinuxCondition.class})
@Bean("linux")
public Person person03() {
return new Person("linux", 25);
}

自定义条件类:

 package com.xiaoguo.annotation.condition;

 import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata; /**
* @author xiaoguo
* @date 2019-10-11 下午 8:12
*/
public class LinuxCondition implements Condition { @Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { //3.获取到当前环境信息
Environment environment = context.getEnvironment(); String property = environment.getProperty("os.name");
if (property.contains("linux")) {
//true 注入bean
return true;
}
return false;
}
}

4. @Import({Car.class}) 快速将Car导入到spring容器中

ImportSelector 注册类到容器中:

 @Import({MyImportSelector.class})

 public class MyImportSelector implements ImportSelector {

     /**
* 返回值就是导入容器中的组件全类名
*
* @param importingClassMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{"com.xiaoguo.annotation.beans.Red"};
}
}
ImportBeanDefinitionRegistrar与上同理:
 public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {

     /**
*
* @param importingClassMetadata 当前类的注解信息
* @param registry BeanDefinition注册类
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
boolean tf = registry.containsBeanDefinition("com.xiaoguo.annotation.beans.Red");
if (tf) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(XiaoGuo.class);
registry.registerBeanDefinition("xiaoguo", beanDefinition);
}
}
}

最新文章

  1. ASP.NET MVC 过滤器(四)
  2. poj 并查集
  3. K3中添加的一条新数据,其在数据库中的位置
  4. Auty自动化测试框架第五篇——框架内部的调用支持、自动化安装库与配置说明
  5. c++类的声明和对象的定义---10
  6. iOS各个版本的新特性介绍
  7. JVM相关问答
  8. MySQL 存储过程传参之in, out, inout 参数用法
  9. SQLServer2005,2000获取表结构:字段名、类型、长度、主键、非空、注释
  10. Weex详解:灵活的移动端高性能动态化方案
  11. Android AlertDialog更改标题颜色,字体等
  12. POJ3050 Hopscotch 【DFS】
  13. javaEE异常摘要——更换工作区相同tomcat当部署在同一个项目疑难解答
  14. 【IT小常识】如何将IE手动升级或降级
  15. 一个自定义python分布式专用爬虫框架。支持断点爬取和确保消息100%不丢失,哪怕是在爬取进行中随意关停和随意对电脑断电。
  16. java计算器实验报告
  17. Codeforces Round #374 (Div. 2) C(DAG上的DP)
  18. Python args **kwargs作用
  19. java 连接Kafka报错java.nio.channels.ClosedChannelExcep
  20. HDUOJ----2647Reward

热门文章

  1. Vue 组件切换
  2. Vue 列表动画实现
  3. InetAddress与Socket
  4. es6—变量的解构赋值
  5. linux Tasklets 机制
  6. 解决应用服务器变为集群后的Session问题
  7. 2018-2-13-Xamarin-Forms-进度条控件
  8. Java 学习笔记(3)——函数
  9. javascript 闭包的理解(一)
  10. python监控模块