SpringBoot默认的包扫描(比如说扫描注解)
主程序所在包下的所有子包,包括和主程序同一级别的。
里面的组件都会被默认扫描进来。直接看图片结构,体会体会什么叫一目了然
指定包扫描范围(我是尚硅谷忠实粉丝)
在@ComponentScan()指定包扫描范围
或者把一个@SpringBootApplication注解做一个拆分(他本身就是一个合成注解)
当然了还会给我们自动配置好springmvc常用功能,配置好web常用的功能,比如字符编码(不能识别中文),
以前给spring容器添加组件,是写xml配置。如下图:
SpringBoot中是写一个配置类,在里面写方法。 其中有俩个重要注解如下·:
@Configuration 作用是告诉Springboot这是一个配置类,配置类本身也是组件,会放在容器里
@Bean 作用就是给容器中添加组件,方法名会作为组件的id,return 返回的实例就是组件在容器中的实例
如果你不想让方法名作为组件名,也可以这样@Bean("自定义的组件名")
那么问题来了,配置类本身是组件,可以从容器中拿到。那我用这个配置类组件去调用组件注册的方法(如user01)那么每次调用返回的user对象是不是一样的呢?
这就涉及到另一个细节点了,@Configuration(proxyBeanMethtrue=true),默认为true,默认---单实例。为true时外部无论对配置类的这个组件注册方法调用多少次都是之前注册容器的单实例对象。
那么怎么观察容器里现在有哪些组件呢?
在SpringBoot主程序里这么写:通过IOC容器查看容器里的组件
run.getBeanDefinitionNames();//获取所有组件,还要循环遍历输出
当然也可以通过名字获取单个组件
run.getBean("tom",Pet.class)//获取tom这个组件,@Bean('tom')起了别名
在下图中可以看到,获取了俩次tom这个组件,tom1和tom2他俩是一样的。也就是默认单实例
当然还可以批量注册组件用@Import({User.class,DBHelper.class})
此时默认引入的组件名就是全类名,如User.class对应com.atguigu.boot.bean.User
@Import可以添加在@SpringBootApplication(启动类)、@Configuration(配置类)、@Component(组件类)对应的类上。
ImportResource("classpath:beans.xml")导入spring的配置文件(spring中注册组件的方式直接迁移)
不得不说想的真是周全,这样就不用再在@Configuration 标注的配置类里写@Bean,进行注册组件了,省事。
这时候测试一下,beans.xml的组件到底有没有注册到容器中呢?(下面是通过浏览器访问测试)
@RestController
public class HelloController{
@Autowired
Car car; //完成自动装配
@RequestMapping
public Car car(){
return car; //从容器中拿取
}
}
@ConfigurationProperties(prefix="mycar")结合配置文件application.properties起作用,被标注的类会使用外部文件给bean注入属性,可以访问配置文件内容。
1.这个prefix="mycar",通过指定的前缀,绑定配置文件application.properties中的配置。让这个Javabean(Car)和配置文件属性一 一绑定。
2.要是光写@ConfigurationProperties(prefix="mycar"),而没有把组件注册到容器中,是错误的。用老师的话来说,只有容器中的组件,才会拥有SpringBoot提供的强大功能。
@Component
@ConfigurationProperties(prefix="mycar")
public class Car{
private String brand;
private Integer price;
}
@EnableConfigurationProperties(Car.class)写在配置类上,也就是和@Configuration作用于同一个类。
1》@EnableConfigurationProperties 注解的作用是:让使用了 @ConfigurationProperties 注解的类生效,并且将该类注入到 IOC 容器中,交由 IOC 容器进行管理
2》@ConfigurationProperties注解和@EnableConfigurationProperties配合使用,也就是此时并没有使用@Component注册Car组件
3》 如果要使 xxx.properties 配置文件与 Java Bean 动态绑定,那么就必须将这个 Java Bean 加入到容器中,并且需要在该类上使用 @ConfigurationProperties 注解
条件装配组件用@ConditionalBean
比如,pet是user类里的一个属性,那么pet类要是没有注册到容器的话,我们得user类也不能注册到容器里怎么写呢
public class User{
private String name;
private Interger age;
private Pet pet;
}
User zhangsan=new User('zhangsan',18)
zhangsan.setPet(tomcatPet());
额外的冷知识lombok:我理解就是来写javaBean的神器
@Data 帮你写set,get方法的
@NoArgsConstructor 帮你写无参构造器
@AllArgsConstructor 帮你写全参构造器
@ToString 帮你重写tostring