Spring注解开发系列Ⅱ --- 组件注册(下)
1.@Import注册组件
@Import主要功能是通过导入的方式实现把实例加入springIOC容器中,
/**
* 给容器注册组件
* 1.包扫描+组件标注注解(@Controller,@Service,@Repository,@Component)
* 2.@Bean(导入第三方包里的组件)
* 3.@Import[快速给容器导入组件]
* 1)@Import(要导入容器的组件),容器中就会自动注册这个组件
* 2)ImportSelector:返回需要导入的组件的全类名数组
* 3)ImportBeanDefinitionRegistrar:
* 4.使用Spring提供的FactoryBean注册组件:
* 1)默认获取到的是工厂bean调用getObject创建的对象
* 2)获取工厂bean本身需要在bean的id前加"&"
*/ @Import({/*Color.class,*/Red.class,MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
@Configuration
public class ImportConfig {
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
}
使用ImportSelector注册组件:
public class MyImportSelector implements ImportSelector {
/**
* 返回值,导入到容器中组件的全类名
* AnnotationMetadata:当前标注@Import注解的类的所有注解信息
* @param annotationMetadata
* @return
*/
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
return new String[]{"com.wang.bean.Blue"};
}
}
InportBeanDefinitionRegistrar:手动注册组件
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
*
* @param annotationMetadata 当前类的注解信息
* @param beanDefinitionRegistry BeanDefinition注册类
* 把所有需要添加到容器中的Bean,返回需要导入的组件
*
*/
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
boolean red = beanDefinitionRegistry.containsBeanDefinition("com.wang.bean.Red");
boolean blue = beanDefinitionRegistry.containsBeanDefinition("com.wang.bean.Blue");
if (blue && red){ //如果容器中有该组件,注册一个
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Yellow.class);
beanDefinitionRegistry.registerBeanDefinition("yellow",rootBeanDefinition);
}
}
}
测试:
@Test
public void testImport(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ImportConfig.class);
String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames();
for (String name:beanDefinitionNames){
System.out.println(name);
} }
2.使用FactoryBean注册组件:
首先创建一个类实现FactoryBean<T>接口,其中T是要注册的Bean的类型:
public class ColorFactoryBean implements FactoryBean<Color> {
//返回一个Color对象,这个对象会返回到容器中
@Override
public Color getObject() throws Exception {
System.out.println("ColorFactoryBean ... ");
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
//是否单例
/**
* true 单例
* false 多例
* @return
*/
@Override
public boolean isSingleton() {
return false;
}
}
在config配置类中注册这个FactoryBean:
@Configuration
public class ImportConfig {
@Bean
public ColorFactoryBean colorFactoryBean(){
return new ColorFactoryBean();
}
}
测试:
@Test
public void testBeanFactory(){
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ImportConfig.class); //工厂bean调用的是getObject取得的对象
Color colorFactoryBean = (Color) annotationConfigApplicationContext.getBean("colorFactoryBean");
Color colorFactoryBean2 = (Color) annotationConfigApplicationContext.getBean("colorFactoryBean");
System.out.println("bean的类型:"+colorFactoryBean.getClass()); System.out.println(colorFactoryBean==colorFactoryBean2); //获取ColorFactoryBean
Object bean = annotationConfigApplicationContext.getBean("&colorFactoryBean");
System.out.println("bean的类型:"+bean.getClass());
}
Spring注解开发系列Ⅱ --- 组件注册(下)的更多相关文章
- Spring注解开发系列Ⅰ--- 组件注册(上)
传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点:1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件 ...
- 【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件
写在前面 在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对! ...
- 浅尝Spring注解开发_自定义注册组件、属性赋值、自动装配
Spring注解开发 浅尝Spring注解开发,基于Spring 4.3.12 包含自定义扫描组件.自定义导入组件.手动注册组件.自动注入方法和参数.使用Spring容器底层组件等 配置 @Confi ...
- Spring注解开发系列专栏
这个系列主要是讲Spring注解的使用,可以为后面SpringBoot的学习带来一定的帮助.我觉得从Spring直接过度到SpringBoot还是有点快,还是得需要一个演变的过程.从Spring开发, ...
- Spring注解开发系列Ⅵ --- AOP&事务
注解开发 --- AOP AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,横向重复,纵向抽取.详细的AO ...
- Spring注解开发系列Ⅴ --- 自动装配&Profile
自动装配: spring利用依赖注入和DI完成对IOC容器中各个组件的依赖关系赋值.自动装配的优点有: 自动装配可以大大地减少属性和构造器参数的指派. 自动装配也可以在解析对象时更新配置. 自动装配的 ...
- Spring注解开发系列Ⅲ --- 生命周期
Bean的生命周期 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解. 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: S ...
- Spring注解开发系列VIII --- SpringMVC
SpringMVC是三层架构中的控制层部分,有过JavaWEB开发经验的同学一定很熟悉它的使用了.这边有我之前整理的SpringMVC相关的链接: 1.SpringMVC入门 2.SpringMVC进 ...
- Spring注解开发系列VII --- Servlet3.0
Servlet3.0简介 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用 ...
随机推荐
- while Ture怎么退出全部
while True: #这是一个死循环 如果想要quit出去只能一层一层的退出 比如如果在第三层输入quit会回到第二层 那么有什么方法能够在第三层就退出全部? print("level1 ...
- nor flash之频率限制
背景 支持一款nor flash时,出于性能考虑,一般会查看其nor支持的最高频率以及主控端spi控制器的最高频率,以选择一个合适的运行频率. 对于一款主控支持多款flash的情况,还得考虑好兼容性等 ...
- 关于Qt中窗口的坐标
主要是给自己以后参考,所以不会太仔细的讲解. #include "mainwindow.h" #include <QApplication> #include<Q ...
- 微信小程序map地图的一些使用注意事项
1.小程序组件map,在微信7.0.4以上(不包括7.0.4)层级问题官方已作更新,可在map上随意添加任何标签使用z-index即可:微信7.0.4版本以下map组件层级默认是最高的,只能使用官方提 ...
- ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析
1. ArrayList ArrayList 是一个数组队列,相当于动态数组.与Java中的数组相比,它的容量能动态增长.它继承于AbstractList,实现了List, RandomAccess, ...
- zabbix安装完成后查看编译参数
最近学习zabbix分布式监控系统,突然想如何查看自己编译时的参数,最终找到自己想要的结果. 1.首先进入zabbix源码目录 2.用ls -l命令查看是否有一个叫config.log文件 3.这个文 ...
- Python学习3月5号【python编程 从入门到实践】---》笔记(2)
1.操作列表 一.遍历整个列表,并且想对每一个元素执行相同的操作.##这里就不得不提起我们一直用的For函数了. 二.深入地研究循环 (1)for i in superheroes:##首先读取其 ...
- 从头学pytorch(十二):模型保存和加载
模型读取和存储 总结下来,就是几个函数 torch.load()/torch.save() 通过python的pickle完成序列化与反序列化.完成内存<-->磁盘转换. Module.s ...
- Ubuntu 18.04 + ROS Melodic + TurtleBot3仿真
1. 下载安装包 官网地址: http://wiki.ros.org/action/show/Robots/TurtleBot?action=show&redirect=TurtleBot 所 ...
- C# 把文件夹下所有文件添加到集合中
private List<string> FindFile(string Path) { List<string> list=new List<string>(); ...