Bean扫描
Spring中使用标签扫描或者注解
Springboot中没有使用标签或者注解它是怎么扫描的我的controlelr,service等等
核心在于springboot启动类中的@SpringBootApplication注解
此注解其实是一个组合注解
它组合了一个@ComponentScan注解,相当于在启动类也添加了这个注解,所以不需要我们手动添加也可以扫描
但是我们没有设置它的扫描范围它是怎么扫描的呢,那是因为,它的默认扫描范围是添加了该注解的类所在的包及其子包
如果想要扫描到启动类所在包之外的包,需要手动在启动类中配置@ComponentScan
Bean注册
如果要注册的bean对象来自第三方(不是自定义的),是无法用@Component及衍生注解声明bean的
使用Maven命名将第三方jar安装到本地仓库
然后win + R-->cmd输入脚本
在pom.xml中引入依赖
@Bean
- 在启动类中创建一个方法,次方法只需要返回一个对象就行(不推荐使用)
测试
如果想要通过名字来获取直接写方法名
对象默认的的名字就是:方法名
自定义名字@Bean(“自己取名字”)
- 创建一个配置类,在配置类里面集中注册
使用@ Configuration来标识当前类是一个配置类
配置类也需要放到启动类所在的包或子包下才会被扫描
在配置类中添加一模一样的方法
注入多个第三方对象,在配置中继续写方法
如果方法的内部需要使用到ioc容器中已经存在的bean对象,那么只需要在方式上声明,以参数的形式传入,spring会自动注入
@Import
在启动类上使用@Import(xxx.class),导入一个其他类,spring会自动把xxx类注入到ioc容器中,这里的xxx类可以是任意类(普通类,配置类)
常用的类
导入配置类
导入ImportSelector接口实现类
配置类
@Import(配置类.class)
一旦用了@Import相当于我在手动扫描这个类,没有用自动扫描,所以当配置类没有在启动类的包或子包下也能扫描到
注入多个配置类
不推荐,建议使用导入ImportSelector接口实现类
@Import({配置类.class ,配置类.class ,配置类.class ,配置类.class })
ImportSelector接口实现类
定义一个类去实现ImportSelector接口,重写selectImports()方法
Springboot会自动调用selectImports()方法,得到全限定名的数组,然后把这些类的bean对象自动注入到ioc容器中
为了防止硬编码,这些全限定名一般写入文件中,然后从文件中读取出来
文件中的一个全限定名写一行
优化@Import注解
在启动类上使用@Import(CommonImportSelector.class),感觉不好看,
能不能像@SpringBootApplication这样
自定义一个注解
需要复制
@Target({ElementType.TYPE}) //可以在类上使用
@Retention(RetentionPolicy.RUNTIME) //可以保留在运行时阶段
在添加上一个ImportSelector接口实现类
@Import(CommonImportSelector.class)
优化后
Bean注册条件
给第三方bean对象注入值的方式
方式一
在方法中手动赋值(不推荐使用)
方法二
从文件中读取
使用@Value来获取值
当我们将配置文件中的数据注释了在使用@Value获取,在注入到对象时就会报错,有没有一种方法,当我们配置文件有数据时注入对象,没有数据时就不注入对象。
这时候就要用到bean的注册条件了
SpringBoot提供了设置注册生效条件的注解@Conditional,此数据使用很麻烦,所以它提供了很多的衍生注解。
三个常用注解
@ConditionalOnProperty(prefix = “前缀”,name = “指定键名(方法参数名)”)
@ConditionalOnMissingBean(xxx.class)
@ConditionalOnProperty(name = “指定类的全限定名”)