1、包扫描+组件标注注解


使用到的注解如下,主要针对自己写的类

  • @Controller
  • @Service
  • @Repository
  • @Component
  • @ComponentScan

参考 spring注解开发:ComponentScan组件扫描

2、使用bean注解


主要使用场景:导入第三方包里面的组件,使用到的注解:

  • @Bean

3、使用@Import注解


  • 使用方式:@Import(要导入到容器中的组件);容器中就会自动注册这个组件
  • bean的id默认是全类名
  • 示例:@Import(value = {Person.class})

实战

1、新建一个maven工程,添加如下依赖

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.0.5.RELEASE</version>
</dependency>

2、新建一个实体 Person

package com.yefengyu.annotation.bean;public class Person
{private String name;private Integer age;public Person(){}public Person(String name, Integer age){this.name = name;this.age = age;}public String getName(){return name;}public void setName(String name){this.name = name;}public Integer getAge(){return age;}public void setAge(Integer age){this.age = age;}@Overridepublic String toString(){return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}
}

3、新建一个配置类(重点

package com.yefengyu.annotation.config;import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*;@Configuration

public class MainConfig
{
}

4、测试代码

public static void main(String[] args)
{ApplicationContext ctx= new AnnotationConfigApplicationContext(MainConfig.class);String[] names = ctx.getBeanDefinitionNames();for (String name : names){System.out.println(name);}Person person1= (Person)ctx.getBean(Person.class);//bean的id默认是全类名Person person2= (Person)ctx.getBean("com.yefengyu.annotation.bean.Person");
}

4、使用ImportSelector


ImportSelector和Import一起使用:首先编写一个类实现ImportSelector接口MyImportSelector,然后将MyImportSelector添加到Import中,那么MyImportSelector自定义逻辑返回需要导入的组件就会被加入到容器中。

利用上面第三节的代码,我们重新添加一个类,这个类什么都没有,现在我们尝试着使用ImportSelector方式将其注册到容器中。

package com.yefengyu.annotation.bean;public class Car
{
}

1、编写MyImportSelector实现ImportSelector接口,重写selectImports方法,返回的数组中每个字符串就是要导入到容器的组件的全类名。

package com.yefengyu.annotation;import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;//自定义逻辑返回需要导入的组件
public class MyImportSelector implements ImportSelector
{//返回值就是要导入到容器的组件的全类名
     @Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata){return new String[]{"com.yefengyu.annotation.bean.Car"};}
}

2、修改MainConfig配置类,使用Import注解加入MyImportSelector类,注意下面红色部分。

package com.yefengyu.annotation.config;import com.yefengyu.annotation.MyImportSelector;
import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*;@Configuration
@Import({Person.class, })
public class MainConfig
{
}

3、测试,同样使用上面的测试代码,可以看出打印结果为:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
com.yefengyu.annotation.bean.Person

4、针对于public String[] selectImports(AnnotationMetadata annotationMetadata)方法中的参数AnnotationMetadata有很多信息可以帮助筛选要注册的组件。

5、使用ImportBeanDefinitionRegistrar


和使用ImportSelector方式一样,定义一个类实现ImportBeanDefinitionRegistrar接口,重写其中的方法,手动注册组件。

1、定一个类,作为要注册的组件

package com.yefengyu.annotation.bean;public class Alarm
{
}

2、实现ImportBeanDefinitionRegistrar接口,手动注册组件

package com.yefengyu.annotation;import com.yefengyu.annotation.bean.Alarm;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar
{@Overridepublic void registerBeanDefinitions(AnnotationMetadata annotationMetadata,BeanDefinitionRegistry beanDefinitionRegistry){beanDefinitionRegistry.registerBeanDefinition("alarm",new RootBeanDefinition(Alarm.class));}
}

beanDefinitionRegistry.registerBeanDefinition("alarm",new RootBeanDefinition(Alarm.class));

第一个参数是组件名称。

第二个参数是要注册的组件的类型的定义。

AnnotationMetadata 和上一节类似。BeanDefinitionRegistry 的功能很多:

3、修改MainConfig配置类,使用Import注解加入MyImportBeanDefinitionRegistrar类,注意下面红色部分。

package com.yefengyu.annotation.config;import com.yefengyu.annotation.MyImportBeanDefinitionRegistrar;
import com.yefengyu.annotation.MyImportSelector;
import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*;@Configuration
@Import({Person.class, MyImportSelector.class, .class})
public class MainConfig
{
}

4、测试,同样使用上面的测试代码,可以看出打印结果为:

org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig
com.yefengyu.annotation.bean.Person
com.yefengyu.annotation.bean.Car

6、使用FactoryBean


1、首先创建一个待加入到容器的组件

package com.yefengyu.annotation.bean;public class Event
{
}

2、创建一个Spring定义的FactoryBean

package com.yefengyu.annotation;import com.yefengyu.annotation.bean.Event;
import org.springframework.beans.factory.FactoryBean;//创建一个Spring定义的FactoryBean
public class EventFactoryBean implements FactoryBean<Event>
{//返回一个Event对象,这个对象会添加到容器中
    @Overridepublic Event getObject()throws Exception{return new Event();}@Overridepublic Class<?> getObjectType(){return Event.class;}//是单例?//true:这个bean是单实例,在容器中保存一份//false:多实例,每次获取都会创建一个新的bean;
    @Overridepublic boolean isSingleton(){return true;}
}

3、修改配置类,注意下面bean注解下面的代码

package com.yefengyu.annotation.config;import com.yefengyu.annotation.EventFactoryBean;
import com.yefengyu.annotation.MyImportBeanDefinitionRegistrar;
import com.yefengyu.annotation.MyImportSelector;
import com.yefengyu.annotation.bean.Person;
import org.springframework.context.annotation.*;@Configuration
@Import({Person.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
public class MainConfig
{@Beanpublic EventFactoryBean eventFactoryBean(){return new EventFactoryBean();}
}

4、修改测试代码如下:

package com.yefengyu.annotation;import com.yefengyu.annotation.bean.Person;
import com.yefengyu.annotation.config.MainConfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class Main
{public static void main(String[] args){ApplicationContext ctx= new AnnotationConfigApplicationContext(MainConfig.class);String[] names = ctx.getBeanDefinitionNames();for (String name : names){System.out.println(name);}//测试EventFactoryBeanObject eventFactoryBean = ctx.getBean("eventFactoryBean");System.out.println("bean 的类型为:" + eventFactoryBean.getClass());Object factoryBean = ctx.getBean("&eventFactoryBean");System.out.println("bean 的类型为:" + factoryBean.getClass());}
}

5、结果如下:

mainConfig
com.yefengyu.annotation.bean.Person
com.yefengyu.annotation.bean.Car
eventFactoryBean
alarm

总结:

  • 默认获取到的是工厂bean调用getObject创建的对象

ctx.getBean("eventFactoryBean");

  • 要获取工厂Bean本身,我们需要给id前面加一个&

ctx.getBean("&eventFactoryBean");

转载于:https://www.cnblogs.com/ye-feng-yu/p/11080522.html

spring注解开发:容器中注册组件方式相关推荐

  1. 给容器中注册组件 || @Scope -- @Lazy -- @Conditional({Condition}) -- @Import--使用Spring提供的 FactoryBean

    * @Scope:调整作用域    * prototype:多实例的:ioc容器启动并不会去调用方法创建对象放在容器中.       *              每次获取的时候才会调用方法创建对象: ...

  2. 2、组件注册-@Configuration@Bean给容器中注册组件

    2.组件注册-@Configuration&@Bean给容器中注册组件 2.1 创建maven项目 spring-annotation pom.xml文件添加 spring-context 依 ...

  3. Spring容器中导入组件方式

    1.  componentscan包扫描+组件注解(@controller @service @ component ) 2.  在方法上添加@Bean    id默认为方法名 3.  @import ...

  4. Spring注解开发系列Ⅰ--- 组件注册(上)

    传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文 ...

  5. 往IOC 容器中添加组件的方式

    通过@CompentScan +@Controller @Service @Respository @compent 适用场景: 针对我们自己写的组件可以通过该方式来进行加载到容器中. 通过@Bean ...

  6. Spring注解开发【源码分析】

    一.注册组件 @ComponentScan 扫描指定包下的组件. String[] value():扫描基础包范围 Filter[] includeFilters():扫描并获取符合过滤规则的组件 F ...

  7. Spring注解驱动开发第11讲——面试官让我说说:如何使用FactoryBean向Spring容器中注册bean?

    写在前面 经过前面的学习,我们知道可以通过多种方式向Spring容器中注册bean.可以使用@Configuration注解结合@Bean注解向Spring容器中注册bean:可以按照条件向Sprin ...

  8. Spring注解驱动开发第10讲——在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean

    写在前面 在前面的文章中,我们学习了如何使用@Import注解向Spring容器中导入bean,不仅可以使用@Import注解快速向容器中导入bean,也可以在@Import注解中使用ImportSe ...

  9. Spring注解驱动开发第7讲——如何按照条件向Spring容器中注册bean?这次我懂了!!

    写在前面 当bean是单实例,并且没有设置懒加载时,Spring容器启动时,就会实例化bean,并将bean注册到IOC容器中,以后每次从IOC容器中获取bean时,直接返回IOC容器中的bean,而 ...

最新文章

  1. Jenkins使用Publish Over FTP Plugin插件上传FTP详解
  2. 主要的窗体控件的概述
  3. cmd锁定计算机病毒,反病毒常用CMD命令大全
  4. linux java top_linux top命令 监测系统性能
  5. TypeError系列之:TypeError: conv2d(): argument 'input' (position 1) must be Tensor, not NoneType
  6. 叨叨20220304
  7. 双时隙的工作原理_双作用叶片泵工作原理是怎样的?作为8年工程师都没了解这么深...
  8. 探寻 JavaScript 逻辑运算符(与、或)的真谛
  9. python2.0安装教程_Python2.7 【安装教程】
  10. 计算机毕业设计Java文档资料管理系统(源码+系统+mysql数据库+Lw文档)
  11. 数学建模 matlab MATLAB机器学习 分类方法 支持向量机分类 乳腺癌的诊断
  12. B.DongDong认亲戚
  13. easyui datagrid deleteRow(删除行)的BUG
  14. React---什么是受控组件、非受控组件
  15. 信号与系统2-连续离散系统时域分析
  16. 关于anaconda的使用和Python库的安装、卸载
  17. Linux下c语言的图形编程
  18. linux开机自动启动浏览器,Ubuntu 14.04 LTS 开机自动打开浏览器、vlc播放器等
  19. 声学测试软件手机版_清华31岁教授将手机天线尺寸缩小100倍,未来有望植入人体|专访...
  20. 商业智能平台BI 商业智能分析平台 如何选择合适的商业智能平台BI

热门文章

  1. java 二维数组_Java中二维数组和异常的内容及应用
  2. docker安装redis(最新)
  3. ios 修复 内存泄露_iOS 内存泄漏如何解决
  4. java 运行环境变量_java 环境变量配置与第一个程序运行
  5. html文件嵌入到reportlab,Reportlab的Code128条形码作为HTML图像标签,在Python中使用数据URI方案...
  6. java 可变长度参数/动态参数...
  7. mysql5.6 忘记root密码后,如何找回密码?
  8. cd协议属于计算机网络的应用层,计算机网络 题库 必考 期末 期终 考试 复习 考研 必备...
  9. linux下日志管理系统,Linux管理日志系统详解
  10. java query api_ElasticSearch(十二) Bool Query JAVA API