1.方法注解@bean
在以下情况需要用到方法注解:
1.第三方的类需要交给IoC管理
2.同一个类,需要多个对象(类注解默认这个类是单例模式)
Bean需要搭配类注解使用
1.第三方的类


如果注释掉@Bean,就会报错

2.同一个类,需要多个对象



如果再创建一个实例,再根据类的类型获取getBean就会报错:

解决方法:
1.@Qualifier
2.@Primary
3.按名字getBean
@Bean:方法名就是bean的name


4.给Bean重命名
2.bean的name重命名
1.类注解的重命名



2.方法注解的重命名



或者多个重命名


Bean注解的源代码:

name属性可省略

3.扫描路径
有下列方法注解:

把启动类挪到controller包下:



1.问题:实践可知:把启动类 放在 除了Configuration的包下,其余都会报同样的错误。为什么?

2.Spring的默认扫描路径:
扫描是干啥的?
Spring扫描,就是Spring去指定的包里面,找到了添加注解的类,把他们变成Bean放到IoC容器里。
扫描路径是啥?
扫描路径就是Spring去指定的包下往IoC里添加类 的路径
为啥不扫描整个项目的全部文件?
1.浪费性能。项目里的很多文件(普通实体类、工具类、测试类)都不需要交给Spring管理,如果全项目扫描,Spring要遍历全部的文件、解析注解,项目启动会非常慢。
2.同一类型多个Bean冲突。有可能某个第三方类写了@Component,就会出现NoUniqueBeanDefinitionException异常
默认扫描路径是啥?
启动类所在的包及其全部子包
3.结论
所以就可以解释上述代码为啥只有把启动类放在Configuration包下能正常运行了。因为启动类在
Configuration包下,Spring会扫描这个包及其子包,

所以这两个Bean会被添加进IoC里,后续就可以取出来。
4.修改启动类的扫描路径@ComponentScan("")


4.DI详解
依赖注入是一个过程,指在Io容器在创建Bean时,去提供运行时所依赖的资源
Spring提供了三种属性注入的方式:
1.属性注入:@Autowired



2.构造方法注入
1.只有一个有参构造方法

1.问:这个参数是咋传进来的?
Spring在创建UserController这个Bean时:
Spring看到UserController只有这一个构造方法------》
它去看这个方法需要的参数------》
Spring直接去IoC里找UserService类型的Bean------》
找到之后,自动把这个Bean传进构造方法,赋值给参数userService------》
执行this.userService=userService
2.无参+一个有参
如果加上无参构造方法,就会报错


因为如果有 无参构造方法,默认执行的就是 无参构造方法
解决方法:@Autowired指定执行有参构造方法


3.无无参构造方法,有多个有参构造方法时,直接报错

可以通过@Autowired指定构造方法
3.Setter注入

4.三种注入方式对比
属性注入:不能注入一个被final修饰的属性。必须写@Autowired
构造方法注入:能注入一个被final修饰的属性。Spring4.3之后,只有一个构造方法时,可以不写@Autowired
setter注入:不能注入一个被final修饰的属性。set方法上必须写@Autowired
5.@Autowired存在的问题

当属性添加@Autowired注解后,就会从容器中获取对象,并把对象赋值给userRepository
同一个类型存在多个bean时,使用@Autowired会存在问题



1.使用@Primary注解指定

2.使用@Qualifier注解指定

3.使用@Resource注解指定

6.Spring Framework、Spring家族、Spring Boot、Spring Web MVC
Spring家族包括Spring Boot、Spring Framework等
Spring Framework包括spring-core,spring-beans,spring-aop。IoC、DI也属于Spring Framework

SpringBoot是Spring Framework的一个脚手架