Spring创建bean的方法及使用场景是什么


本篇内容介绍了“Spring创建bean的方法及使用场景是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!创建bean,也可以叫组件注册,就是把单例bean放到spring容器中。我们定义如下工程结构:在bean包下面定义Person类,用于演示另外再定义一个打印spring容器中bean名称的方法,在单元测试中会使用。首先我们先说下@Configuration这个注解,在springboot应用中,经常可以看到引用的各类jar包中定义的类中用到了这个注解。该注解只能作用于类上,在一个类上面加@Configuration注解,就说明该类是一个配置类,该配置类也会作为一个bean被存放到spring容器中,bean的名称就是类的名称(首字母小写)。如下所示,MyConfig是个配置类,spring容器中就拥有了一个bean名称为myConfig的bean。我们编写一个单元测试,来打印下spring容器中bean的名称。执行testMyConfig单元测试,得到结果如下:—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-myConfig前面几个bean,是spring内置的bean,最后一个bean就是我们定义的这个配置类,bean名称为myConfig.@Bean作用于配置类的方法上,要求该方法有返回值,返回的值就是spring容器中的bean,bean名称默认就是取方法的名称。比如下面的代码说明创建一个名称为onePerson的bean。我们再次执行上面的testMyConfig单元测试,会得到如下结果:—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-myConfig —-onePerson可以看到,相比于第1步中的结果,spring容器中多了一个叫onePerson的bean,而onePerson也就是方法onePerson的方法名称。@Import注解只能作用于类上面,可以导入标记有@Configuration的配置类、ImportSelector和ImportBeanDefinitionRegistrar的实现类,还能导入普通的类(不含spring注解),所谓导入,就是将类的实例注册到spring容器中。该注解必须和@Configuration注解结合使用,而且正常情况下,只有当某个组件不会被spring自动注册时(比如当我们使用ComponentScan指定了某个包扫描路径),才会使用该注解。spring-boot-autoconfigure.jar包大量使用了该注解,感兴趣的可以去参考下。通过@Import注解导入配置类,会把该配置类中定义的bean都注册到spring容器中,同时spring也会该该配置类创建一个bean,bean的名称就是该类的全路径名。我们定义一个ImportConfig配置类,内容如下:我们在配置类上通过@Import注解导入另外的配置类MyConfig,会把MyConfig配置类以及在MyConfig类中定义(注册)的bean都导入到spring容器中。我们编写一个单元测试,来打印下spring容器中bean的名称。—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-importConfig —-com.xk.spring.config.MyConfig —-onePerson注意,此时容器中不仅有importConfig这个bean,也有MyConfig配置类中定义的onePerson这个bean。而导入的MyConfig配置类在spring容器中对应的bean名称是MyConfig类的全路径名com.xk.spring.config.MyConfig。特别提醒,由于MyConfig本身是个配置类,如果spring本身能自动扫描注册该类(比如配置了@ComponentScan包含config包路径),那么我们再通过@Import这种方式导入MyConfig,MyConfig在spring容器中对应的名称就变成了myConfig,也就是bean的名称是类名(首字母小写)。当然,正如前面所说,如果我们的配置类能被spring自动扫描注册,我们就不会使用@Import这种方式导入配置类。另外,需要格外注意的是,我们通过@Import导入的类本身会被当做配置类,所以即使此处MyConfig类没有加@Configuration注解,通过配置@Import({Myconfig.class}),也会把MyConfig类里面定义的bean注册到spring容器,此时MyConfig类对应的bean名称就是类的全路径名。但我们一般不这么做,如果一个类中定义了bean,我们很自然会为该类加上@Configuration注解。ImportSelector是个接口,它的定义如下:我们定义一个MyImportSelector类,实现该接口,内容如下:然后我们修改下我们的ImportConfig类,通过@Import导入MyImportSelector类,内容如下:最后我们执行上面的testImportConfig单元测试,可以得到下面的结果:—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-importConfig —-com.xk.spring.bean.Person可以看到,通过导入MyImportSelector类,spring自动帮我们生成了Person的bean实例,而Person对应的bean的名称就是Person类的全路径名。ImportBeanDefinitionRegistrar也是个接口,它的定义如下:我们定义一个MyImportBeanDefinitionRegistrar类,实现ImportBeanDefinitionRegistrar接口,定义如下:然后我们修改下我们的ImportConfig配置类,使用@Import导入MyImportBeanDefinitionRegistrar类,内容如下:最后我们执行testImportConfig单元测试,会得到如下的结果:—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.免费云主机域名annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-importConfig —-myPerson可以看到,我们通过这种方式成功的导入Person类对应的bean,而且bean的名称就是我们自定义的myPerson。我们还可以通过@Import导入普通类到spring容器,导入之后的bean的名称就是类名的全路径。这些普通类可以什么注解都不加,比如没有@Component注解,也没有@Configuration注解。就拿我们的Person类来说,我们可以通过@Import({Person.class})的方式直接将其导入spring容器,。修改ImportConfig配置类,内容如下:最后执行testImportConfig单元测试,会得出如下结果:—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-importConfig —-com.xk.spring.bean.Person可以看到,Person类被导入到spring容器,并且对应的bean名称是Person类的全路径名。传统的spring项目通过使用xml配置文件来定义bean信息,然后在web.xml中声明我们的spring的xml配置文件。现在我们换种方式,我们可以通过使用@ImportResource注解,将整个的xml配置文件导入到配置类,进而由spring替我们生成对应的bean。我们在工程的resources资源目录下创建application-beans.xml文件(文件名随便起),内容如下:然后我们修改ImportConfig配置类,内容如下:最后执行testImportResource单元测试,得出结果如下:—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-importConfig —-person可以看到,通过@ImportResource的方式,我们把在xml配置文件中定义的person这个bean注册到了spring容器中。@ComponentScan注解可以让spring方便地识别标记了@Component注解的组件,需要和@Configuration注解一起使用。我们在web开发时,经常会使用@Service、@Repository、@Controller、@Configuration、@Component等注解,用来表示MVC不同层次的组件bean。其实前面四种注解的元注解上面都标记了@Component,说明被这四种注解标记的类通过配置@ComponentScan指令,就可以被注册到spring容器中,而它们对应的bean的名称就是类名(首字母小写)。我们拿@Service为例,在service包下面创建PersonService类,内容如下:内容很简单,就简单的通过@Service将该类标记为一个组件。接下来我们修改MyConfig类,在它上面加上@ComponentScan注解,内容如下:最后我们执行下先前定义的testMyConfig单元测试,得到结果如下:—-org.springframework.context.annotation.internalConfigurationAnnotationProcessor —-org.springframework.context.annotation.internalAutowiredAnnotationProcessor —-org.springframework.context.annotation.internalCommonAnnotationProcessor —-org.springframework.context.event.internalEventListenerProcessor —-org.springframework.context.event.internalEventListenerFactory —-myConfig —-personService —-onePerson可以看到,容器中多了一个personService的bean,而该bean就是对应被我们标记了@Service注解的PersonService。虽然我们config包下面的ImportConfig类也加了@Configuration注解,但由于它不在包扫描的范围,所以spring无法将其自动注册到容器中。“Spring创建bean的方法及使用场景是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注百云主机网站,小编将为大家输出更多高质量的实用文章!

相关推荐: 将HTML转换为纯文本的方法有哪些

这篇文章主要讲解了“将HTML转换为纯文本的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“将HTML转换为纯文本的方法有哪些”吧! 使用Python的BeautifulSoup库BeautifulSo…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 07/09 12:42
Next 07/09 12:42

相关推荐