目录
[🥝Bean Name的重命名](#🥝Bean Name的重命名)
我们知道Spring可以当一个容器,那么我们要如何学习这个容器呢?
🌴Spring五大注解
1.@Controller---控制器存储
2.@Service---服务存储
3.@Repository---仓库存储
4.@Component---组件存储--"父亲注解"
5.@Configuration---配置存储
应用分层:控制层Controller,业务逻辑层Service,数据访问层Dao,其对应Spring五大注解的前三个,控制层是与前端进行交互的,业务逻辑层是具体需求的逻辑处理,数据访问层就是调用数据库和访问某些实体类的,这三层层层解耦,层里面又高度内聚,最后呈现:低耦合,高内聚。这是规范,也是我们要值得注意的点。
ApplicationContext应用上下文,里面是Spring可以存储Bean和其他的,
而我们Spring启动类里

上面这个ApplicationContext context可以接收SpringApplication.run(SpringiocDiDemoApplication.class, args);的返回值,返回的context就是可以让我们去获取Bean。
添加@Controller注解把UserController交给Spring管理

最后启动项目,成功打印

🌴BeanName

这都是获取Bean的重载方法,其中有根据类型来获取的,还要根据BeanName来获取的,这个BeanName的名字是通过类名经过定义的规则所变化而来的。
🥝bean定义规则
1.默认 类名小驼峰写法
2.前两位字母都为大写,那么beanName就为类名本身
例如:
ADD--》ADD
Add--》add
AddMath--》addMath
ADDMath--》ADDMath

三种获取bean的写法,第二种按名称来拿,就需要将返回结果强转一下,
第3种,先名称再类型,不需要强转,大家了解一下。
🌴注解@NoArgsConstructor

我们知道,当我们只写了一个有参的构造方法时,那个无参的构造方法就会直接不生成,这时候注解@NoArgsConstructor就其作用了,他会生成一个无参构造方法
🌴注解@AllArgsConstructor
这个注解是生成一个全参的构造方法
🌴注解@Data
需要注意的是,这个注解它生成getter,setter,tostring,equals,hashcode方法,它可以理解为不生成构造方法,虽然它生成final修饰的构造方法,不过没啥用,忽略就行。
🌴@Bean注解
问题:五大注解,它只是把某个对象创建一次,然后交给Spring容器,它不会再次创建同样的对象,这就是我们接下来要解决的问题。

其中UserInfo是对象,我们通过@Bean注解,把它的这个返回值两个类型相同,但其内在的值不同UserInfo对象交给Spring容器管理,
需要注意的是,@Bean注解要配合五大注解来使用,不然会报错,不生效。
运行

然后我们发现,它出错了,提示里说,找到了3个类型相同的对象,然后需要注意的是,后面的名称,竟然是我们的方法名,也就是我们交给Spring管理的对象,的那个bean name变成了方法名,这是@Bean方法注解和五大注解的不同之处


我们把这3个返回值类型为同一个的对象都交给了Spring管理,所以按照类型名去取对象,三个相同你告诉我咋取?这就是问题的根源
然后我们就可以根据bean name和类型去拿

成功拿到了
根据bean name拿取

注意强转!
🥝Bean Name的重命名


结果

写法:Bean({"u1","u2"})
🌴spring启动类的扫描路径

同级关系下,我们的spring项目启动没问题,可是如果我们改成下面这样的关系呢

我们看到启动类和我们写的代码不在同一级目录下,我们试着运行一下,看看会发生啥
报错了,这说明启动类要放在合适的目录下才能运行!
🥝注解@ComponentScan

我们加上这个@ComponentScan注解就好了
🌴DI
🥝属性注入


那个UserInfo对象我们已经交给Spring管理了,然后我们使用@Autowired注解,让Spring来给我们进行相应的类型注入
!我想到一个点,如果我把上面的@Controller注解给去掉呢,反正现在貌似用不着,干脆去掉试试


直接编译都不通过,运行更运行不了
那是为什么呢?Spring到底是怎么执行逻辑的呢?
1.首先,Spring启动
2.扫描所有加了五大注解的类(@Controller,@Service)
3.把这些类创建成对象,放到容器中
4.扫描容器中的对象,发现有@Autowired的属性
5.从容器中找到对应的对象,赋值进去
哦,原来是这样的,我们把@Controller注解给去掉后,它都不在容器中,谈何@Autowired注入呢?
需要注意的是,@Autowired注解,不能对final修饰的变量进行属性注入,我们可以巧妙的用构造方法注入,去给final变量赋值!
🥝构造方法注入

我们spring创建对象后丢进容器中这一步里,创建对象,是不是要调用构造方法,就像我们上面写的,spring把已经创建好的对象UserInfo注入到了UserController对象的构造方法里了,需要注意的是,UserInfo要交给Spring管理,才能注入给UserController的构造方法,且UserController对象也要加上五大注解,交给Spring管理,才会给你构造方法注入。
还有一点就是,如果我们有两个构造方法,我们spring默认是执行那个无参的构造方法,如果在两个构造方法都存在的情况下,想给那个有参的构造方法进行注入,也是要加@Autowired注解,这里我就不演示了,大家有个印象就好了,用到的时候,能知道啥原因就行。
🥝Setter注入

与上面一样的,我们进行是setter方法有参时,也可以通过@Autowired注解进行setter注入!
🌴@Primary注解

这段代码的背景就是默认Bean的注入,@Primary结合@Bean注解,表示当有需要的bean的时候,这个类型的bean优先默认注入。
🌴@Qualifier注解

注解@Qualifier和@Autowired注解表示的是,从spring容器中取出类型相同的对象时,拿bean为
u1的进行注入。需要注意的是,这两个注解需要共同使用,才能发挥效果。
🌴@Resource注解

这个@Resource注解起的作用也是指定bean名称的注入,所以,关键点来了,@Qualifier和@Autowired才能相当于@Resource注解的作用,那么对于懒懒的你,会选择哪个呢?🙃
🌴注解总结
好了,本次的springioc和di就完结了,不过我们来把这五大注解和一些零散的注解给总结一下!


完结