Bean扫描
一般的扫描包路径 需要使用xml标签或者是@ComponentScan(basePackages = “xxx.xxx”) ,但是在SpringBoot中不需要。
在springBoot 项目的启动类中有一个注解:@SpringBootApplication,这个注解包含以下注解:
但是ComponentScan并没有指明包路径,它能够扫描到service和controller层是因为:如果不指定扫描包的路径,那他默认去扫描添加了该注解的类所在的包及其子包。
比如:以下是一个项目的结构
SpringBootApplication(其中包含ComponentScan注解)是添加在com.dome.study包下面的,那么扫描到的包应该是com.dome.study下面的包及其子包(如com.dome.study.service.impl)
Bean注册
如果要注册的Bean来自第三方(不是自己自定义的),是无法用@Component 及衍生注解声明Bean的
但springBoot提供以下注解解决了以上问题:
@Bean
@Import
@Bean
可以在启动类里面去声明一个方法 并使用@Bean,这个方法只创建一个对象就可以了。
启动类里面的run方法会把一个初始化的一个容器返回来,需要用一个ApplicationContext 对象去接受这个容器,然后调用getBean方法 就可以使用这个对象了。
SpringApplication.run(DemoApplication.class, args);
但是不建议在启动类里面去进行Bean注册。建议在配置类里面集中去注册
@Configuration //如果想让该类变成注册类,需要加上这个注解。
public String CommonConfig(){
}
在注入第三方的时候 对象默认的名字是方法名
要修改对象的名字可以用@Bean(“aaa”)的方式,此时getBean的入参为“aa”(getBean(“aaa”))
依赖:
如果注入的bean对象需要依赖于(使用到)ioc容器中已经存在的bean对象,需要在方法中声明即可,Spring会自动的注入:
@Import
书写格式:
1.@Import(Xxx.class) 其中Xxx可以是任何类。
2.如果需要注入很多类,可以采用数组的方式书写。@import({Xxx.class},{Xxx.class},{Xxx.class},{Xxx.class})
但是如果使用数组的方式,代码就会显得特别臃肿,这个时候需要用另外一种方法,需要导入@ImportSelector接口实现类
- 首先需要先定义一个类去实现这个接口,然后重写selectImports方法,只需要返回一个字符串数组.
spring boot 会自动调用selectImports方法。
完成上述过程之后 在使用@Import,
Bean 注册条件
当@Value注解没有找到路径的时候 ,代码可能会这报错,于是SpringBoot提供了设置注册生效条件的注解@Conditional
该注解有用起来较为麻烦 于是衍生出来各种注解,其中有三种注解较为常见:
@ConditionalOnClass主要是判断是否存在这个类文件,如果有这个文件就相当于满足条件,然后可以注入到容器当中。
@ConditionalOnProperty注解可以通过配置文件中的属性值,来判定configuration是否被注入
@ConditionalOnMissingBean它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个。