spring给容器注册组件 的几种方式
环境搭建:
新建一个maven项目,引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency> 创建一个简单的类Person
package com.yang.spring.domain; public class Person {
private String name;
private int age; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Person(String name, int age) {
this.name = name;
this.age = age;
} public Person() {
System.out.println("我被初始化了............");
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
1.使用传统的xml进行配置
<bean id="xiaohui" class="com.yang.spring.domain.Person">
<property name="name" value="yangxiaohui"></property>
<property name="age" value="20"></property>
</bean>
创建一个测试类
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Person p = (Person) ctx.getBean("xiaohui");
System.out.println(p); }
}
2.使用注解@Bean的方式
@Configuration
public class Configurate {
@Bean
public Person person(){
return new Person("xiaoMing",22);
}
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
Person p = (Person) ctx.getBean("person");
System.out.println(p); }
}
3.使用@Import注解
@Import({Person.class})
public class Configurate { } public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] beanDefinitionNames = ctx.getBeanDefinitionNames();
Person person = ctx.getBean(Person.class);
System.out.println(person);
for (String definitionName : beanDefinitionNames) {
System.out.println(definitionName); //com.yang.spring.domain.Person
} }
}
@Import注解 和@Bean注解区别:@bean注入spring容器的对象,其beanName是方法名,而@Import注解注入的对象的beanName是类的全限定类名
4.@Import的另外一种方式
public class MyImport implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
String[] kk = new String[1];
kk[0]="com.yang.spring.domain.Person";
return kk;
}
}
@Import(MyImport.class)
public class Configurate { } public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
System.out.println(definitionName);
} }
}
5.@ComponentScan注解和@componet,@Service,@Controller ,@Reposity的组合使用
@ComponentScan("com.yang.spring")
public class Configurate {
}
@Component
public class Person {
private String name;
private int age;
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
System.out.println(definitionName);
}
}
}
6.实现ImportBeanDefinitionRegistrar,需求:当容器中有person这个bean时才注册Pig这个bean
public class Person {
private String name;
private int age;
}
public class Pig {
public Pig() {
}
}
public class MyImportBeanDefinitionRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
if(beanDefinitionRegistry.containsBeanDefinition("person")){
RootBeanDefinition bd = new RootBeanDefinition(Pig.class);
beanDefinitionRegistry.registerBeanDefinition("cutePig",bd);
}
}
}
@Import({MyImportBeanDefinitionRegister.class})
public class Configurate {
@Bean
public Person person(){
return new Person("yangxiaohui",22);
}
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
System.out.println(definitionName);
}
}
}
7.通过实现FactoryBean接口
public class Pig {
public Pig() {
}
}
public class MyFactoryBean implements FactoryBean<Pig> {
@Override
public Pig getObject() throws Exception {
return new Pig();
} @Override
public Class<?> getObjectType() {
return Pig.class;
} @Override
public boolean isSingleton() {
return true;
}
}
@Import({MyFactoryBean.class})
public class Configurate {
@Bean
public Person person(){
return new Person("yangxiaohui",22);
} }
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
Object bean = ctx.getBean("com.yang.spring.domain.MyFactoryBean");
System.out.println(bean.getClass());//class com.yang.spring.domain.Pig }
}
//8.手工注册
public class Cat {
public Cat() {
System.out.println("猫被初始化");
}
}
public class Demo {
public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.register(Appconfig.class);
ctx.refresh();
RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(Cat.class);
ctx.registerBeanDefinition("cat",rootBeanDefinition);
System.out.println(ctx.getBean("cat").getClass()); }
}
@bean注解一般用于第三方类,如redis的key和value对应的序列化器的 @ComponentScan用于自身开发的类 @Import方式比较少用
@Condional注解的用法,如果需要根据不同系统,注入不同的bean
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Environment environment = conditionContext.getEnvironment();
String osVersion = environment.getProperty("os.name");
if(osVersion.contains("linux")){
return true;
}
return false;
}
}
public class WindowsCondition implements Condition{
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
Environment environment = conditionContext.getEnvironment();
String osVersion = environment.getProperty("os.name");
if(osVersion.contains("Windows")){
return true;
}
return false;
}
}
public class Configurate {
@Bean
@Conditional(LinuxCondition.class)
public Person chinese(){
return new Person("xiaoMing",22);
}
@Bean
@Conditional(WindowsCondition.class)
public Person english(){
return new Person("peter",18);
}
}
public class App
{
public static void main( String[] args )
{
ApplicationContext ctx = new AnnotationConfigApplicationContext(Configurate.class);
String[] definitionNames = ctx.getBeanDefinitionNames();
for (String definitionName : definitionNames) {
System.out.println(definitionName);
}
}
}
spring给容器注册组件 的几种方式的更多相关文章
- Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!
前一篇<不要再说不会Spring了!Spring第一天,学会进大厂!>文章可点击下方链接进行回看. 不要再说不会Spring了!Spring第一天,学会进大厂! 今天将继续讲解Spri ...
- spring 给容器中注册组件的几种方式
1.@Bean 导入第三方的类或包的组件 2.包扫描+组件的标注注解(@ComponentScan: @Controller,@service,@Reponsitory,@Componet), 自己写 ...
- Vue加载组件、动态加载组件的几种方式
https://cn.vuejs.org/v2/guide/components.html https://cn.vuejs.org/v2/guide/components-dynamic-async ...
- 使用react定义组件的两种方式
react组件的两种方式:函数定义,类定义 在定义一个组件之前,首先要明白一点:react元素(jsx)是react组件的最基本的组成单位 组件要求: 1,为了和react元素进行区分,组件名字首必须 ...
- Spring Boot定义系统启动任务的两种方式
Spring Boot定义系统启动任务的两种方式 概述 如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进行,以后都不再执行,这里,容易想到web ...
- JDBC注册驱动的三种方式
JDBC注册驱动的三种方式 1.通过导入的JDBC的驱动包拿到的com.mysql.jdbc.Driver对象,利用java.sql.DriverManager对象的DriverManager.reg ...
- spring mvc获取路径参数的几种方式 - 浅夏的个人空间 - 开源中国社区
body { font-family: "Microsoft YaHei UI","Microsoft YaHei",SimSun,"Segoe UI ...
- react学习笔记1之声明组件的两种方式
//定义组件有两种方式,函数和类 function Welcome(props) { return <h1>Hello, {props.name}</h1>; } class ...
- Spring加载properties文件的两种方式
在项目中如果有些参数经常需要修改,或者后期可能需要修改,那我们最好把这些参数放到properties文件中,源代码中读取properties里面的配置,这样后期只需要改动properties文件即可, ...
随机推荐
- JAVA指令集——GETSTATIC
(indexbyte1<<8)|indexbyte2——得到index 1,从runtimeconstantpool中取得index处的FieldRef,FieldRef已经解析完成 Fi ...
- mysql中的函数总结
mysql中常用日期时间函数 MySQL服务器中的三种时区设置: ①系统时区---保存在系统变量system_time_zone ②服务器时区---保存在全局系统变量global.time_zone ...
- 架构设计 | 基于电商交易流程,图解TCC事务分段提交
本文源码:GitHub·点这里 || GitEE·点这里 一.场景案例简介 1.场景描述 分布式事务在业务系统中是十分常见的,最经典的场景就是电商架构中的交易业务,如图: 客户端通过请求订单服务,执行 ...
- 虚拟机安装:VirtualBox上安装Ubuntu
在Win10 中使用VirtualBox安装Ubuntu 本教程将指引读者在Windows10操作系统下使用开源虚拟机软件VirtualBox安装Ubuntu,读者也可以使用其他虚拟机VMware W ...
- Android Home
unity处理Android的home键响应事件 http://blog.csdn.net/tianyongheng/article/details/38459531 Unity3D教程:处理Home ...
- 【平台开发】— 4.mysql建库建表
本想着把前端脚手架run起来了,然后就可以借着登录来捋一下前后端交互的过程.但是后端导入JPA的时候就发现了,还没有数据库. 既然是本着学习的目的,那咱也不想只在后端写死返回的数据,要做就做全套. 一 ...
- lidar激光雷达领域的分类
lidar领域可以按分为以下五方面: 激光雷达系统与装备 激光雷达系统与开发 激光雷达光源 激光雷达探测 多光谱激光雷达系统 单光子激光雷达系统 低成本RGB-D距离传感器 激光雷达元器件及装备等 激 ...
- FastJSON解析JSON的时候保证深堆的顺序
普通的JSONObject.parseObject(),解析的时候,底层采用HashMap解析所以是无序的, JSONObject params = JSONObject.parseObject(ex ...
- JAVA读取文件夹大小
几种不同的实现方法: (一)单线程递归方式 package com.taobao.test; import java.io.File; public class TotalFileSizeSequen ...
- Nginx及其架构设计
1.1. 什么是 Nginx Nginx 是俄罗斯人编写的十分轻量级的 HTTP 服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个 IMAP/P ...