1.Spring常用标签
1 | 把一个类作为一个IoC容器,它的某个方法头上如果注册了 ,就会作为这个Spring容器中的Bean。 |
当一个接口有两个不同的实现方法时,Spring在注入的时候会由于不知道该注入那个一个实现而报错。可以通过@Primary告诉spring在犹豫的时候优先选择哪一个具体的实现。
场景:
定义接口:
1 | public interface Singer { |
有下面的两个实现类:
1 | // 加注解,让spring识别 |
注意,这里没有注解
1 | public class OperaSinger implements Singer { |
1 |
|
在注入Singer对象时,会报错误:I am singing with DIO voice: song lyrics.
原因很简单,就是OperaSinger这个类上面根本没有加上注解@Copmonent或者@Service,所以spring注入的时候,只能找到MetalSinger这个实现类.所以才有这个结果。
但是如果一旦 OperaSinger 这个类加上了@Copmonent 或者 @Service 注解,有趣的事情就会发生,你会发现一个错误的结果或异常:
1 | org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [main.service.Singer] is defined: expected single matching bean but found 2: metalSinger,operaSinger |
第一种解决办法:提示很明确了,spring 根据类型无法选择到底注入哪一个。这个时候@Primay 可以闪亮登场了。
1 |
|
如果代码改成这样,再次运行,结果如下:I am singing in Bocelli voice: song lyrics
, 用@Primary 告诉spring在犹豫的时候优先选择哪一个具体的实现。
第二种解决办法:用@Qualifier这个注解来解决问题,将上面的两个类改为如下:
1 | // 加注解,让spring识别 |
然后在调用的方法上面使用@Qualifier标签,@Qualifier限定哪个bean应该被自动注入。当Spring无法判断出哪个bean应该被注入时,@Qualifier注解有助于消除歧义bean的自动注入。
1 |
|
2.Spring自定义Bean
springboot的标签生成bean方式,bean的名称是与方法名称相匹配的:
1 |
|
上面的bean的名称为wxBindService
.也可在@Bean(””)指定生成bean的名称,比如:@Bean("wxAuthService")
注意点:
① @Bean用在方法上,@Component用在类上,用了这2个注解就可以将自定的bean就放入ioc了。注意:有@Bean的方法的类,必须加上@Configuration,表明这个是个配置类,相当于xml文件的作用。不然,你加上@Bean没有用啊!!
② @ConfigurationProperties作用是绑定配置文件中的值和类的成员变量,使得new出的对象是有初始值的。但是,用了这个注解后,类并没有到容器中。必须要加@Component,放入容器。
1 | import org.springframework.boot.context.properties.ConfigurationProperties; |
通过@ConfigurationProperties标签,在创建MinioProperties对象的时候,会自动设置MinioProperties对象中的字段的初始值为配置文件中设置的值。
③ 如果不用Component,那么需要注入上面这个对象的类,必须加上@EnableConfigurationProperties。这样,使用了@EnableConfigurationProperties这个注解后,IOC容器中也会有了。那么你就可以在这个类中使用@AutoWired 等注解来注入上述组件。
1 | import io.minio.MinioClient; |
3.开发常见标签
1 | :用在请求的方法上,表示一组参数说明 |