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)的基础上提供了若干新特性用 ...
随机推荐
- Java核心技术·卷 II(原书第10版)分享下载
Java核心技术·卷 II 内容介绍 Java领域最有影响力和价值的著作之一,由拥有20多年教学与研究经验的资深Java技术专家撰写(获Jolt大奖),与<Java编程思想>齐名,10余年 ...
- iptables脚本封ip
##自动封IP:分析web或应用日志或者网络连接状态封掉垃圾IP #!/bin/sh /bin/netstat -na|grep ESTABLISHED|awk |grep -v -E '192.16 ...
- Python学习3月5号【python编程 从入门到实践】---》笔记
---恢复内容开始--- 1.变量 一.只能包含字母.数字.下划线.****不能以数字开头作变量 二.不能包含空格, 三.不要将python关键字和函数名用作变量名 四.最好能有描述性和简短的特征 五 ...
- Spring MVC 请求处理过程
1. 2. 3. 4. 5. 6.
- Java防锁屏小程序
为防止系统桌面自动锁屏,只需打成jar包,写个批处理程序start.bat,双击执行保持dos窗口执行即可,无其他影响. 程序设计为每30秒动一次鼠标,可根据需要调整. 附代码: package ma ...
- vmware workstation12在安装VMware tools时出现问题:A previous installation of VMware Tools has been detected 解决
win10安装的vmware workstation12在安装VMware tools时出现问题: root@lc:/root/vmware-tools-distrib# ./vmware-insta ...
- nginx 负载均衡及反向代理
Nginx简介 Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师开发,官方测试nginx能够支支撑5万并发链接,并且cpu.内存 ...
- tensorflow数据读取机制tf.train.slice_input_producer 和 tf.train.batch 函数
tensorflow中为了充分利用GPU,减少GPU等待数据的空闲时间,使用了两个线程分别执行数据读入和数据计算. 具体来说就是使用一个线程源源不断的将硬盘中的图片数据读入到一个内存队列中,另一个线程 ...
- windows创建git并连结github
1.下载跟自己系统相对应的git版本 2.默认安装 3.绑定用户 git config --global user.name ""git config --global user. ...
- 云资源中的低成本战斗机——竞价实例,AWS、阿里云等六家云厂商完全用户使用指南
云端资源价格 预留实例:长期持有,批发路线,价格最便宜. 按需实例:即买即用,零售路线,价格最贵. 这两种资源,基于不同区域/价格的六家云厂商价格对比,连同原始数据文档我们已经打包成了一份电子文档,有 ...