手写Spring ioc
1. 什么是ioc?
2. ioc工作原理
3. 实现ioc
什么是ioc?
解决对象管理和对象依赖的问题
本来是我们手动new出的对象,现在交给Spring的IOC容器管理,IOC容器可以理解为一个对象工厂,我们把该对象交给工厂,工厂管理这些对象的创建以及依赖关系。当我们需要用对象的时候,直接从工厂里拿即可。
控制反转 依赖注入
控制反转:本来是我们手动new出的对象,现在交给Spring的IOC容器管理(设计)
依赖注入:对象无需创建和管理它的依赖关系,依赖关系将被自动注入到需要对象当中去(实现)
主要好处:将对象集中统一管理 降低耦合度
ioc工作原理
主要分为几个步骤
- 扫描包组件
- 获得原材料组件
- 获得BeanDefination集合
- 根据原材料动态创建Bean
- 实现Bean的自动装入
实现ioc
新建一个maven项目,因为自己实现Spring ioc,所以什么依赖都不用导入
我们通过注解注入
先创建注解@Component
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Component {
String value() default "";
}
创建注解@Autowired
@Target({
ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
}
由于@Autowired是通过类型注入的,但依赖注入也可能通过name注入,所以创建注解@Qualifier
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Qualifier {
String value() default "";
}
创建@Value注解为字段赋值
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Value {
String value();
}
我们创建两个实体类作为bean
@Component("teacher") //声明注解,作为Bean
public class Teacher {
@Value("001")
private Integer teacherId;
@Value("Tom")
private String teacherName;
@Autowired //自动装配user bean
private User user;
public Integer getTeacherId() {
return teacherId;
}
public void setTeacherId(Integer teacherId) {
this.teacherId = teacherId;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
@Override
public String toString() {
return "Teacher{" +
"teacherId=" + teacherId +
", teacherName='" + teacherName + '\'' +
", user=" + user +
'}';
}
}
@Component("user")
public class User {
@Value("001")
private Integer id;
@Value("jack")
private String name;
@Value("20")
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
创建BeanDefinition类,作为原材料类
public class BeanDefinition {