一、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;
}