Bean创建的生命周期

一、Bean创建的过程

UserServer.class--->无参构造方法(推断构造方法,判断传的值是什么)--->普通对象--->依赖注入(属性赋值)--->初始化前(@PostConstruct)--->初始化(InitializingBean接口)--->初始化后(AOP)--->(代理对象)--->Bean

先将.class文件编译成.java文件,调用类的无参构造方法或者根据有@Autowired注解的构造方法先创建一个对象,然后找到当前文件里面所有的字段进行遍历,看字段是否包含@Autowired依赖注入注解,如果有就进行调用里面的方法,初始化前把当前类里面所有方法进行一个遍历,判断方法上是否加入了@PostConstruct注解,如果有执行当前对象的方法,如果有参就传参,没有就不传,初始化时会判断该类是否实现InitializingBean接口,如果实现了InitializingBean接口,就去找里面重写的afterPropertiesSet方法,运行该方法,初始化后首先找出所有的切面Bean,然后进行遍历,遍历其中的方法,判断跟该类有关的方法放入缓存中,在执行切面的时候就可以直接拿出来,AOP之后生成代理对象(JDK动态代理和CGLIB动态代理),最后生成bean。

/**

* 简单的依赖注入伪代码 instanceof 测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。

* Car.class.getFields() = car.getClass().getFields()

* 根据当前这个类,取里面所有的字段,进行遍历

*/

for (Field field : car.getClass().getFields()) {

        //判断某个字段上面是否存在这个注解 @Autowired isAnnotationPresent判断注解

        if (field.isAnnotationPresent(Autowired.class)) {

                //如果有@Autowired执行当前方法

                //如果存在就给当前这个对象的当前这个属性去赋值

                field.set(car,???);

        }

}

/**

* 初始化前

* 循环遍历当前类里面的所有的方法,判断方法上是否包含@PostConstruct注解,如果有执行当前对象的方法

*/

for (Method method : car.getClass().getMethods()) {

        if(method.isAnnotationPresent(PostConstruct.class)){

                //如果有执行当前对象的方法,如果有参就传参,没有就不传

                method.invoke(car,???)

        }

}

@PostConstruct

public People a(){

        //初始化前

        //从mysql中查询出admin信息赋值给People对象再传给admin

        //mysql--->People--->admin

        return new People();

        }

}

/**

* 初始化

* 判断当前对象是否实现了InitializingBean接口

* instanceof 测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据。

* 如实现了,将当前对象强制转换 ((InitializingBean)对象).afterPropertiesSet()

*/

for(userService instanceof InitializingBean){

}

@Override

public void afterPropertiesSet() throws Exception {

        //初始化

        //afterPropertiesSet 属性设置后

        //从mysql中查询出admin信息赋值给People对象再传给admin

        //mysql--->People--->admin

}

spring内部先根据类型去容器里面找bean对象,如果只找到一个,就会把找到的bean对象直接拿来使用,如果找到多个bean对象,再根据名字去找,找到拿来直接用,没有找到就报错

public UserService (OrderService orderService){

        // Map<beanName,bean对象>

        this.orderService = orderService;

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值