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