Spring中注册Bean的方式,springboot获取容器中的Bean

  Spring中注册Bean的方式,springboot获取容器中的Bean

  

目录

简介法1:@组件法2:@配置@Bean法3:@导入等法4:工厂豆

 

  

简介

本文用示例介绍跳羚如何向容器注册豆子(即:将对象加入容器)。

 

  

法1:@Component

(@控制器/@服务/@储存库也可以,因为它里边包含@组件)

 

  默认是加载和应用类所在同一个目录下的所有类,包括所有子目录下的类。

  当启动类和@组件分开时,如果启动类在某个包下,需要在启动类中增加注解@ComponentScan,配置需要扫描的包名。例如:

  @ spring boot应用程序(scanbase packages= com。测试。第四章’)

  此注解其实是@ComponentScan的基础包,通过查看扫描基础包即可得知。

  @SpringBootApplication只会扫描@SpringBootApplication注解标记类包下及其子包的类,将这些类纳入到弹簧容器,只要类有@组件注解即可。

  有的注解的定义中已加入@组件,所以这些注解也会被扫描到:@控制器、@服务、@配置、@豆

  @ComponentScan+@Configuration+@Component

  DemoConfig在扫描路径之内

  @ Configuration @ components可以(基础包={ com。举例。演示。我的豆子 })公共类演示配置{ }我的Bean1在com.example.demo.mybeans下

  @Componentpublic class MyBean1{}

  

法2:@Configuration+@Bean

使用场景:将没有成分等注解的类导入。例如:第三方包里面的组件、将其他冲突包中的类。

 

  公共类用户{ //@Value(Tom )公共字符串用户名;公共用户(字符串s){这个。用户名=s;} } @配置公共类导入配置{ @ Bean public User User(){ return new User( Lily );}} @RestControllerpublic类导入演示控制器{ @ auto wired private User用户;@RequestMapping(/importDemo )公共字符串演示()引发异常{ String s=user . username return import demo @ spring boot s;}}

  

法3:@Import等

简介

 

  @导入(要导入到容器中的组件);容器会自动注册这个组件,id默认是全类名.(@导入是弹簧的注解。)

  导入选择器:返回需要导入的组件的全类名数组;

  导入bean定义注册器:手动注册豆到容器中

  @Import方式

  @Target(ElementType .TYPE)@ Retention(保留策略.运行时)@ Import({ ImportDemoConfig。class })public @ interface EnableImportDemo { } public class ImportDemoConfig { @ Bean public User User(){ return new User( Lily );} } @ EnableImportDemo @ spring boot applicat

  ionpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }} @RestControllerpublic class ImportDemoController { @Autowired private User user; @RequestMapping("/importDemo") public String demo() { String s = user.getName(); return "user.getName():" + s; }}ImportSelector方式

  

//自定义逻辑返回需要导入的组件public class MyImportSelector implements ImportSelector { //返回值,就是到导入到容器中的组件全类名 //AnnotationMetadata:当前标注@Import注解的类的所有注解信息 @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { //当前类的所有注解 Set<String> annotationTypes = importingClassMetadata.getAnnotationTypes(); System.out.println("当前配置类的注解信息:"+annotationTypes); //注意不能返回null,不然会报NullPointException return new String[]{"com.paopaoedu.springboot.bean.user01","com.paopaoedu.springboot.bean.user02"}; }} public class User01 {public String username; public User01() { System.out.println("user01...constructor"); }} public class User02 { public String username; public User02() { System.out.println("user02...constructor"); }} @Configuration@Import({ImportDemo.class, MyImportSelector.class})public class ImportConfig { @Bean public User user(){ return new User("Lily"); }} @RestControllerpublic class ImportDemoController { @Autowired private User user; @Autowired private ImportDemo importDemo; @Autowired private User01 user01; @RequestMapping("/importDemo") public String demo() throws Exception { importDemo.doSomething(); user01.username = "user01"; String s = user.username; String s1 = user01.username; return "ImportDemo@SpringBoot " + s + " " + s1; }}

ImportBeanDefinitionRegistrar方式

 

  

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { /** * AnnotationMetadata:当前类的注解信息 * BeanDefinitionRegistry:BeanDefinition注册类; * 把所有需要添加到容器中的bean;调用 * BeanDefinitionRegistry.registerBeanDefinition手工注册进来 */ @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean definition = registry.containsBeanDefinition("com.paopaoedu.springboot.bean.User01"); boolean definition2 = registry.containsBeanDefinition("com.paopaoedu.springboot.bean.User02"); if(definition && definition2){ //指定Bean定义信息作用域都可以在这里定义;(Bean的类型,Bean。。。) RootBeanDefinition beanDefinition = new RootBeanDefinition(User03.class); //注册一个Bean,指定bean名 registry.registerBeanDefinition("User03", beanDefinition); } }}
public class User03 { public String username; public User03() { System.out.println("user03...constructor"); }}

使用上和前面的类似就不举例了。

 

  

 

  

法4:FactoryBean

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

 

  要获取工厂Bean本身,我们需要给id前面加一个&。例如:&xxxFactoryBean 注意类名是X,这里就是小写的x

  

public class UserFactoryBean implements FactoryBean<User04> { @Override public User04 getObject() throws Exception { // TODO Auto-generated method stub System.out.println("UserFactoryBean...getObject..."); return new User04("User04"); } @Override public Class<?> getObjectType() { // TODO Auto-generated method stub return User04.class; } //是否单例? //true:这个bean是单实例,在容器中保存一份 //false:多实例,每次获取都会创建一个新的bean; @Override public boolean isSingleton() { return true; }} public class User04 { public String username; public User04(String s) { String nowtime= DateUtil.now(); username=s+" "+nowtime; }} @Configuration@Import({ImportDemo.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})public class ImportConfig { // 要获取工厂Bean本身,需要给id前面加一个&,&userFactoryBean @Bean public UserFactoryBean userFactoryBean(){ return new UserFactoryBean(); } @Bean public User user(){ return new User("Lily"); }} @RestControllerpublic class ImportDemoController { @Autowired private User user; @Autowired private ImportDemo importDemo; @Autowired private User01 user01; @Autowired private UserFactoryBean userFactoryBean; @RequestMapping("/importDemo") public String demo() throws Exception { importDemo.doSomething(); user01.username = "user01"; String s = user.username; String s1 = user01.username; String s4 = userFactoryBean.getObject().username; return "ImportDemo@SpringBoot " + s + " " + s1 + " " + s4; }} @SpringBootApplicationpublic class SpringBootLearningApplication { public static void main(String[] args) { SpringApplication.run(SpringBootLearningApplication.class, args); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext("com.paopaoedu.springboot.config"); ImportDemo importDemo = context.getBean(ImportDemo.class); importDemo.doSomething(); printClassName(context); Object bean1 = context.getBean("userFactoryBean"); Object bean2 = context.getBean("userFactoryBean"); System.out.println(bean1 == bean2); } private static void printClassName(AnnotationConfigApplicationContext annotationConfigApplicationContext){ String[] beanDefinitionNames = annotationConfigApplicationContext.getBeanDefinitionNames(); for (int i = 0; i < beanDefinitionNames.length; i++) { System.out.println("匹配的类"+beanDefinitionNames[i]); } }}

测试结果

 

  

 

  

 

  以上就是SpringBoot向容器注册bean的方法详解的详细内容,更多关于SpringBoot注册bean的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: