从零开始,手写Spring IOC

手写Spring ioc

1. 什么是ioc?
2. ioc工作原理
3. 实现ioc
什么是ioc?

解决对象管理和对象依赖的问题

本来是我们手动new出的对象,现在交给Spring的IOC容器管理,IOC容器可以理解为一个对象工厂,我们把该对象交给工厂,工厂管理这些对象的创建以及依赖关系。当我们需要用对象的时候,直接从工厂里拿即可。

控制反转 依赖注入

控制反转:本来是我们手动new出的对象,现在交给Spring的IOC容器管理(设计)

依赖注入:对象无需创建和管理它的依赖关系,依赖关系将被自动注入到需要对象当中去(实现)

主要好处:将对象集中统一管理 降低耦合度

ioc工作原理

在这里插入图片描述
主要分为几个步骤

  1. 扫描包组件
  2. 获得原材料组件
  3. 获得BeanDefination集合
  4. 根据原材料动态创建Bean
  5. 实现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 {
   

    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值