spring组件注册
基于注解和类的组件注册
@Conditional
作用:按照一定的条件进行判断,如果满足条件的话就给spring容器中注册bean
该注解既可以标注到方法上面,也可以标注到类上面(只有满足条件时,当前类中配置的bean才能注册)
属性:Class<? extends Condition>[] value()
value属性需要创建一个实现Condition接口的类并且重写其中的matches方法
public class testCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return false;
}
}
示例:想要实现如果当前是在windows系统下就注册bill如果是在linux下就注册linus
MyConfig配置类
@Configuration
@ComponentScan("com.zl")
public class MainConfig {
@Bean("bill")
@Conditional(WindowsCondition.class)
public Person person01(){
return new Person("bill",50);
}
@Bean("linus")
@Conditional(LinuxCondition.class)
public Person person02(){
return new Person("linus",49);
}
}
WindowsCondition
public class WindowsCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
if (property.contains("Windows")){
return true;
}
return false;
}
}
LinuxCondition
public class LinuxCondition implements Condition {
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String property = environment.getProperty("os.name");
if (property.contains("Linux")){
return true;
}
return false;
}
}
测试类
public class IocTest {
private ApplicationContext applicationContext;
@Before
public void init(){
applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
}
@Test
public void testConditional(){
String[] names = applicationContext.getBeanDefinitionNames();
for (String name : names) {
System.out.println(name);
}
}
}
//因为是在windows环境下运行,所以IOC容器中注册的就是bill
@Import()
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {
/**
* {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}
* or regular component classes to import.
*/
Class<?>[] value();
}
我们这里来分析一下{@link ImportBeanDefinitionRegistrar}以这种方式来注册bean
作用:我们可以通过给@Import注解传入一个实现了ImportBeanDefinitionRegistrar的类来完成注册bean
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* AnnotationMetadata: 当前标注@Import注解类的所有注解信息
* BeanDefinitionRegistry: BeanDefinition注册类
* @param importingClassMetadata
* @param registry
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
registry.registerBeanDefinition("person",new RootBeanDefinition(Person.class));
}
}
FactroyBean
作用:我们可以创建一个实现FactoryBean接口的工厂类,并且实现其中的方法,从而完成bean的注册
PersonFactoryBean工厂类
public class PersonFactoryBean implements FactoryBean {
//返回一个Person对象并且添加到容器当中
public Object getObject() throws Exception {
return new Person();
}
//返回bean对象的类型
public Class<?> getObjectType() {
return Person.class;
}
//创建的bean对象是否单例?
public boolean isSingleton() {
return false;
}
}
在MyConfig中配置PersonFactoryBean
@Bean
public PersonFactoryBean personFactoryBean(){
return new PersonFactoryBean();
}
测试类
@Test
public void testPersonFactoryBean(){
Object bean1 = applicationContext.getBean("personFactoryBean");
System.out.println(bean1.getClass());
Object bean2 = applicationContext.getBean("&personFactoryBean");
System.out.println(bean2.getClass());
}
/**
* 通过测试我们发现当我们从IOC容器中获取personFactroyBean对象时,得到的是我们通过
* PersonFactroyBean中的 getObject()方法创建的Person对象
*
* 如果想要获取到PersonFactoryBean对象的话就要在name属性前加上&
*/
spring组件注册的更多相关文章
- 【spring 注解驱动开发】spring组件注册
尚学堂spring 注解驱动开发学习笔记之 - 组件注册 组件注册 1.@Configuration&@Bean给容器中注册组件 2.@ComponentScan-自动扫描组件&指定扫 ...
- spring 组件注册
一.声明配置类和注册 bean /** * 配置类 == applicationContext.xml 配置文件 * @author Administrator * */ //@Configurati ...
- Spring 注解原理(一)组件注册
Spring 注解原理(一)组件注册 Spring 系列目录(https://www.cnblogs.com/binarylei/p/10198698.html) 当我们需要使用 Spring 提供的 ...
- spring注解扫描组件注册
最近对单点系统进行微服务拆分,被各个springboot的组件注册搞得云里雾里的.(有的是通过springboot的自动配置进IOC容器的,有的是自己添加构造方法添加进IOC容器.)决定抽时间将spr ...
- Spring注解开发-全面解析常用注解使用方法之组件注册
目录 1. @Configuration 2. @ComponentScan excludeFilters includeFilters 使用自定义TypeFilter 3. @Bean @Scope ...
- Spring Framework 组件注册 之 @Import
Spring Framework 组件注册 之 @Import 写在前面 向spring中注册组件或者叫javaBean是使用spring的功能的前提条件.而且spring也提供了很多种方式,让我们可 ...
- Spring Framework 组件注册 之 @Component
Spring Framework 组件注册 之 @Component 写在前面 在spring大行其道的今天,对于spring的使用和掌握乃是不可缺少的必备技能.但是spring的整个体系尤为庞大,对 ...
- Spring Framework 组件注册 之 FactoryBean
Spring Framework 组件注册 之 FactoryBean 前言 前两篇文章介绍了如何使用@Component,@Import注解来向spring容器中注册组件(javaBean),本文将 ...
- Spring注解开发系列Ⅰ--- 组件注册(上)
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
随机推荐
- Activiti6系列(2)- 运行和编译
前言 Activiti6.0在官网已经无法下载了,需要在Github上下载. 下载地址: https://github.com/Activiti/Activiti/releases/download/ ...
- java多线程基础(二)--sleep(),wait,()yield()和join()方法
1.sleep()方法 在指定时间内让当前正在执行的线程暂停执行,但不会释放“锁标志”.不推荐使用. sleep()使当前线程进入阻塞状态,在指定时间内不会执行. 2.wait()方法 在其他线程调用 ...
- Guava cache使用总结
缓存分为本地缓存和远端缓存.常见的远端缓存有Redis,MongoDB:本地缓存一般使用map的方式保存在本地内存中.一般我们在业务中操作缓存,都会操作缓存和数据源两部分.如:put数据时,先插入DB ...
- golang学习(1)---快速hello world
很多著名的计算机语言都是一两个人在业余时间捣鼓出来的,但是Go语言是由Google的团队打造的.可能一些基础的知识点我不会细讲,因为这个时代你真的得快速学习,才能适应发展. 来看看go的hello, ...
- java后端_百度二面
参考: https://www.nowcoder.com/discuss/215891?type=2&order=0&pos=10&page=1 1. gc 2. java l ...
- 身体质量指数BMI
Solution: 方法一:"Python语言程序设计"(中国大学MOOC平台)的答案 分析:对比两种指标,将共性(相同的区间)和异性(不同的区间)细分.这样两种指标的判断条件(不 ...
- .netcore持续集成测试篇之web项目验收测试
系列目录 通过前面的单元测试,我们能够保证项目的基本模块功能逻辑是正常的,通过集成测试能够保证接口的请求是正常的.然而最终项目交付我们还需要对项目进行页面的行为进行测试,比如页面布局是否正常,按钮是否 ...
- Mysql高可用(HA)
MySQL特点: 1) 开放的源代码的关系型数据库 2) 适应于所有平台 3) 支持多线程,充分利用CPU资源,性能很出色 4) 价格便宜 5) 大数据库能处理5000万条记录. ACID 事务 一组 ...
- Cocos2d-x 学习笔记(21) ScrollView (CCScrollView)
1. 简介 CCScrollView.cpp文件内的滚动视图ScrollView直接继承了Layer+ActionTweenDelegate. 滚动视图能在屏幕区域内,用户通过触摸拖动屏幕,实现大于屏 ...
- GStreamer基础教程07 - 播放速率控制
摘要 在常见的媒体播放器中,通常可以看到快进,快退,慢放等功能,这部分功能被称为“特技模式(Trick Mode)”,这些模式有个共同点:都通过修改播放的速率来达到相应的目的. 本文将介绍如何通过GS ...