文章目录
SpringIoC&DI
- Spring的两大核心:IoC,AOP
- 五大注解只能加在类上,并且只能加在自己的代码上
使用五大注解,从五大注解中取对象,得到的对象都是同一个对象
@Bean
-
@Bean可以解决上述问题,@Bean必须搭配五大注解来使用
-
使用@Bean注解时,bean的名称是方法名
五大注解,bean name:
(1) 首字母大写
(2) 如果前两个字母都为大写,beanName为类名
-
出现的问题:使用类名进行获取bean,有两个方法都是UserInfo的类型,不知道找哪一个了
所以换一种方法,使用名称进行获取bean

- 出现上面的有多个bean的时候,就有两种获取userInfo的方法
IocApplication.java
java
// @Bean演示
UserInfo userInfo = (UserInfo) context.getBean("userInfo");
System.out.println(userInfo);
UserInfo userInfo1 = context.getBean("userInfo",UserInfo.class);
System.out.println(userInfo1);
UserConfig.java
java
package com.example.ioc.demos.config;
import lombok.Data;
// @Data自动帮我们写了toString方法
@Data
public class UserInfo {
private Integer id;
private String name;
private Integer age;
}
BeanConfig.java
java
package com.example.ioc.demos.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 跟配置相关的使用@Controller或者是@Component
@Configuration
public class BeanConfig {
@Bean
public UserInfo userInfo(){
UserInfo userInfo = new UserInfo();
userInfo.setId(1);
userInfo.setName("张三");
userInfo.setAge(12);
return userInfo;
}
@Bean
public UserInfo userInfo1(){
UserInfo userInfo = new UserInfo();
userInfo.setId(2);
userInfo.setName("李四");
userInfo.setAge(13);
return userInfo;
}
}
-
如何使用@Bean的时候进行传参??
@Bean传递参数:
(1) 如果需要的Bean的类型,对应的参数只有一个时,就直接赋值(直接拿那一个相同类型的)
(2) 如果有多个相同类型的参数时,根据名称去匹配
-
SpringBoot特点:约定大于配置 ,每次创建一个项目,都有一个启动类DemoApplication,默认扫描这个路径下的所有包和类
SpringBoot的扫描路径:
@Bean的应用场景:
(1) 同样的一个类需要有多个不同对象的时候
(2) 还有一个就是针对第三方的类,使用注解
加了注解的这些,都使用了单例模式
DI
- 比如userService就是依赖,userService也可以认为是UserController的一个属性
- DI 依赖注入/属性装配/依赖装配(三种名字是翻译问题)
- 有三种注入方式:
属性注入
构造方法注入
Setter方法注入
属性注入,构造方法注入,Setter方法注入
-
使用@Autowired进行属性注入,构造方法注入,Setter方法注入
-
属性注入存在的问题:
如果一个类型存在多个对象时,优先名称匹配,如果名称都匹配不上,就会报错
-
属性注入无法注入一个Final修饰的属性
原因:
(1) 定义时就进行赋值
(2) 构造方法中进行赋值
-
三种注入优缺点分析:
-
当程序中同一个类型有多个对象时,使用@AutoWired会报错(属性名和需要使用的对象名不一致的情况下)
解决方法:
(1) 属性名和你需要使用的对象名保持一致
(2) 使用@Primary注解标识默认要使用的对象
(3) 使用@Qualifier,指定使用的对象,这个和第一种方法思路是一样的
使用@Qualifier指定bean
(4) 使用@Resource注解
(3) 和 (4) 使用率比较高
- 一个经典的面试题:

-
存在同一个对象(可以存在多个构造方法),也可以通过@Bean的方式取别名(u1和u2)
-
下面就是重命名Bean的方式:
属性注入针对的是对象
总结
-
可以进行端口号的修改:
-
端口号我们能够使用的范围:0 ~ 65535
0 ~ 1024 被一些协议所占用,8080被Tomcat所占用,3306被mysql所占用,其它端口号,我们都可以使用
-
五大注解实现的类是预加载的(先全部加载出这些类)
-
Bean的存
可以自己对Bean的名称进行命名:
一个Bean可以命名多个名称:
-
Bean的取
6. 常见的面试题: