1.@value
该注解用于读取application.properties文件中的值,而application.properties文件一般是用来存放配置参数的,那么实际上@value就是读取application.properties文件中的配置信息:
2.@ConfigurationProperties
该注解和上面的@Value类似,只不过@Value只能读取1个属性,而@ConfigurationProperties可以读取多个属性值然后封装成对象
所以我们新建一个配置类:
然后,因为这个配置类已经添加到了IOC容器中,所以我们可以在任何地方获取到这个配置类,比如controller中:
3.@Bean注解+@Configuration注解(这两个注解一般同时使用):
这个@Bean注解类似于spring框架的@Component @Service @Controller @Repository 这4个注解,都是把一个类添加到spring的IOC容器中;但是区别的作用对象不一样,@Bean作用于方法而后者那4个作用于类;但是@Bean注解更加自由,为什么这么说?我们看下面的图:
这是一个伪代码示例,如果使用@Bean作用于该方法,那么该方法随便返回的任意一种类型都可以直接添加到IOC容器中;但是如果使用@Component 等注解就做不到这样的事情;
那么问题是即使这样而 @Bean注解又有什么用?
这个我们给把我前面讲的两个注解(@value和@ConfigurationProperties)串联起来,前面两个注解是从配置文件中读取配置参数的;那么我们就要思考一下在一个项目中为什么要读取这些配置参数?又为什么要往配置文件中放入一些自定义的配置参数?答案有很多,但我这里来说一种答案:为你的项目添加新的功能,或者更准确的说为你的项目添加新的组件(但是添加新的组件往往是因为需要添加新的功能)。组件的添加可以通过引入依赖来完成…但是如果这个依赖的组件需要一些必须的参数配置?那么该怎么办?没错…把配置参数写到boot的配置文件application.properties中!那么确实是这样没错,但是我完全可以用@value和@ConfigurationProperties+@Component来完成,为什么就一定要用@Bean了?…这个问题,现在我无法回答也许以后会明白;
而@Configuration注解的用处 我在下面的例子中说明:
那么接下来,我来一个例子来讲一下@Bean注解和@Configuration注解的使用和使用场景:
现在我们有一个springboot项目,该项目需要添加1个自定义组件moduleA
首先我们要把所有的配置参数写到 中:
而相应的我们的配置类里面,就要有这些参数的属性映射,并且需要把这个配置类放到IOC容器中:
上面的两步是一种非常好的方式,当我们需要修改或添加配置参数时只需要改 application.properties文件中的参数就好了,主配置类config会帮我们自动读取新的内容;
然后我们看一下组件A:
现在我们需要在一个地方调用组件A的静态方法生成组件A实例,这个方法你可以写在config中;反正config中有所有参数…但这里选择写在了一个自定义的组件工厂类中;
那么,这时我们的@Configuration注解就是必要的,它的意思准确的说是 (配置构建) ,我理解为它告诉编译器我们这个类需要扫描;所以被添加了@Bean注解的方法会自动运行;而与此同时加了@Configuration的factory类也会被放到IOC容器中;但是@Configuration注解还有一个很重要的用途我们在后面说,我们先进行一个小小的测试:
然后我们的启动类不主动调用组件工厂的任何方法,也不主动获取生成组件工厂对象,只启动这个项目:
那把这里启动类main方法运行:
然后,我们就来从IOC容器中获取组件A的代理对象:
运行结果:
可以看到我们成功的获取到了组件A实例;那么现在来说@Configuration注解的另一个作用:
我们知道IOC容器默然是单实例;而这个@Configuration注解就可以控制我们创建的组件A是单例还是多例模式;但是这个单例和多例并不是字面上的意思:
单例:IOC容器默认就有一个存在的实例对象A;不管谁去用这个对象A,getBean()方法得到A对象后,都是一个对象它的地址是一样的;(IOC容器会检查如果有实例对象A就不会在创建新的对象A)
多例:每次getBean()方法获取A对象时,直接创建A对象给你,所以多人获取A对象这个对象的地址是不一样的;(IOC容器不会检查是否有对象A实例)
@Configuration(proxyBeanMethods = true)
@Configuration(proxyBeanMethods = false)
4.@Import注解
这个注解时干什么的?我就这样说吧,前面我学的@Bean注解+@Configuration注解是把那些需要必要参数的组件对象添加到IOC中去;那么我有一个问题:如果某个组件无需要任何参数就可以生成那么我们还需要用上面的方式吗?那不是很麻烦?所以这时我们需要用到@Import它可以把组件对象直接添加到IOC容器中;但是前提是这个组件对象必须要有无参构造。
那么下面我来以一个例子讲解: 结果如下:
现在我们加上这个@Import注解再试一试:
@Import注解的补充说明:
1.@Import注解在使用时,还可以直接把多个类型放入IOC容器中,因为它的()里面是个数组参数:如下图:
2.@Import注解可以使用在任何地方,启动类,config类,等等都可以只要你需要用可以在任何复合规则的地方加上这个注解:
3.@Import注解似乎并不能控制单例和多例模式(默认是单例);至少@Configuration(proxyBeanMethods = false)对它无效;具体能不能控制网上查不到,先放在这里吧
5.@ImportResource注解:
这个注解的作用是,比如说你的项目中有一些组件还是在使用xml文件,来进行Bean管理;而你想把这个xml中配置的所有bean都添加到IOC容器中,那么就给使用这个注解;如果不使用这个注解,也不做其他读取操作的的话在springboot中默认是不会读取这个xml中的Bean的;也就是说这些Bean所管理的对象默认就不在IOC容器中,你用不了;所以这时使用.@ImportResource注解是一个比较好的办法
这个注解相对来说比较简单,一个图就可以说清:
6.其他待补充的注解:
参考资料:B站雷神的springboot视频,本教程主要供本人作为记录复习查看,但如果有错误和需要补充的也希望多多指正
|