向Spring容器中注册组件的方法汇总小结
1、通过xml定义
<bean class="">
<property name="" value=""></property>
</bean>
2、通过注解
这种方式比较常见,通常用@Controller、@Component、@Service等等
3、通过@Bean注解
比如下面的代码往容器中注册一个Person对象
@Bean
public Person person(){
return new Person("张三", 20);
}
默认情况下,使用方法【person()】名person作为Person对象的注册id
也可以通过修改方法名或者使用@Bean(“customBeanName”)
4、通过实现FactoryBean接口
public interface FactoryBean<T> {
T getObject() throws Exception;
Class<?> getObjectType();
boolean isSingleton();
}
// Sample
public class PersonFactoryBean implements FactoryBean<Person> {
....
}
实现上述接口的3个方法,并把PersonFactoryBean注册到容器中,就可以把Person也注册到容器中。
具体创建Person过程的源码可以看FactoryBeanRegistrySupport#getObjectFromFactoryBean方法。
// 如下代码拿到的是Person对象
applicationContext.getBean("personFactoryBean")
// 如果想要拿到PersonFactoryBean对象,可以再前面加&
applicationContext.getBean("&personFactoryBean")
5、通过@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();
}
源码注释写的也很清楚,可以引入 配置类、ImportSelector、ImportBeanDefinitionRegistrar,甚至是普通class。 通过@Import,我们可以使用如下方式注册组件:
@Import({Person.class, MyImportSelector.class,MyImportBeanDefinitionRegistrar.class})
其中:
MyImportSelector实现了ImportSelector接口,selectImports方法返回类全名的String[]都会被注册到容器中
MyImportBeanDefinitionRegistrar实现了ImportBeanDefinitionRegistrar接口
// Sample
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 指定Bean定义信息
RootBeanDefinition beanDefinition = new RootBeanDefinition(Person.class);
// 注册一个Bean,指定bean名
registry.registerBeanDefinition("person", beanDefinition);
}
}
```
这是一个非常重要的注解,在Spring源码中,哪哪都能看到他的身影。
如 @EnableAspectJAutoProxy注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
...
}
EnableAspectJAutoProxy通过@Import引入了AspectJAutoProxyRegistrar类[实现了 ImportBeanDefinitionRegistrar],这个Registrar里面又会向Spring容器中注册AnnotationAwareAspectJAutoProxyCreator(Spring aop注解实现的功臣)。
如 @EnableWebMvc注解。通过Import引入的是一个配置类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(DelegatingWebMvcConfiguration.class)
public @interface EnableWebMvc {
}
如 @EnableAsync注解。通过Import引入的是AsyncConfigurationSelector[实现了ImportSelector接口]
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {
...
}
向Spring容器中注册组件的方法汇总小结的更多相关文章
- Spring注解驱动开发04(给容器中注册组件的方式)
给容器中注册组件的方式 1. 组件注解标注 + 包扫描(适用于自己写的类) //控制层组件 @Controller public class PersonController { } //业务逻辑层组 ...
- 2、组件注册-@Configuration&@Bean给容器中注册组件
2.组件注册-@Configuration&@Bean给容器中注册组件 2.1 创建maven项目 spring-annotation pom.xml文件添加 spring-context 依 ...
- 【String注解驱动开发】如何按照条件向Spring容器中注册bean?这次我懂了!!
写在前面 当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,不 ...
- 【String注解驱动开发】面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?
写在前面 在前面的文章中,我们知道可以通过多种方式向Spring容器中注册bean.可以使用@Configuration结合@Bean向Spring容器中注册bean:可以按照条件向Spring容器中 ...
- spring注解开发:容器中注册组件方式
1.包扫描+组件标注注解 使用到的注解如下,主要针对自己写的类 @Controller @Service @Repository @Component @ComponentScan 参考 spring ...
- 【Spring注解开发】组件注册-使用@Configuration和@Bean给容器中注册组件
写在前面 在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对! ...
- 一、Spring之组件注册-@Configuration&@Bean给容器中注册组件
xml配置方式 首先我们创建一个实体类Person public class Person { private String name; private Integer age; private St ...
- spring 给容器中注册组件的几种方式
1.@Bean 导入第三方的类或包的组件 2.包扫描+组件的标注注解(@ComponentScan: @Controller,@service,@Reponsitory,@Componet), 自己写 ...
- Servlet自动注入Spring容器中的Bean解决方法
很多情况在进行Web开发的时候需要自己手写Servlet来完成某些功能,而servlet有需要注入Spring容器中的某些bean,这是每次都要手动获取比较麻烦,这里有一个解决方案,只需要写一个ser ...
随机推荐
- iOS 计算所有标注的经纬度范围 来确定地图显示区域
1.计算所有点的经纬度范围 //向点聚合管理类中添加标注 _imageDataArr是存放经纬度标注数组 for (NSInteger i = 0; i < _imageDataArr.coun ...
- 在linux环境下用中文查询数据库
1.用SQL在linux环境下,查询语句的中文条件,查不到结果. mysql -h ***.***.***.*** -P 3303 -uroot -p*********** -D boztax -e ...
- mysql 连接 的drive 不一样
DB_DRIVER 为任意名 com.mysql.jdbc.Driver 是 mysql-connector-java 5(jar包)com.mysql.cj.jdbc.Driver 是 ...
- Eclipse 配置 Tomcat 服务器
配置Tomcat 在首先外部安装好Tomcat,然后在eclipse配置Tomcat服务器: 选择要配置的Tomcat版本: 注意:这一步如果勾选了Create a new local server ...
- ueditor编辑器显示style标签样式
在使用ueditor编辑器中,想保存style标签的样式需要对js配置文件进行修改.官方为了安全考虑,默认会将style标签转为DIV标签,导致样式不能显示出对应的效果. 基于1.4.3版本修改如下 ...
- GITHUB(github)初级使用
Github顾名思义是一个Git版本库的托管服务,是目前全球最大的软件仓库,拥有上百万的开发者用户,也是软件开发和寻找资源的最佳途径,Github不仅可以托管各种Git版本仓库,还拥有了更美观的Web ...
- GIT的初级使用
安装git [root@localhost ~]# yum -y install git [root@localhost ~]# git --version git version 1.8.3.1 初 ...
- 网页的异步请求(Ajax)
JS原生Ajax操作(XMLHttpRequest) GET请求 var xmld=new XMLHttpRequest(); xmld.open("GET","wan. ...
- [EXP]IIS全版本提权工具
工具: iislpe.exe 编译: .net 3.5 全版本IIS提权工具,支持IIS应用池用户/网络服务用户/本地服务用户 原理: 通过NTLM重放将权限提升至SYSTEM权限,详情参 ...
- tensorflow 1.0 学习:卷积层
在tf1.0中,对卷积层重新进行了封装,比原来版本的卷积层有了很大的简化. 一.旧版本(1.0以下)的卷积函数:tf.nn.conv2d conv2d( input, filter, strides, ...