菜鸡的Spring学习——零碎知识点

Bean和java对象的区别是什么

SpringBean是受Spring管理的对象  所有能受Spring容器管理的对象都可以成为SpringBean

Spring里面的bean是有自己特有的生命周期的,并且它的属性试衣镜有值的。

Bean的生命周期

class--- >BeanDefinition(在这里会设置Scope等)--->可以进行修改(使用BeanFactoryPostProcessor)--- >new UserService( )--->填充属性--- >Aware回调--- >初始化--- >A0P---- >单例池(Map<BeanName, 对象> ,也在bean工厂中)

如果开启了AOP,则放进去单例池的对象已经不是new UserService( ),而是代理对象

Aware回调,举例:

 

@Component
pub1ic class UserService implements BeanNameAware {// userservice 
@Autowired
private User user;
private String beanName;
@override
pub1ic void setBeanName (String name) {//获取beanName,即"userName";
this.beanName = name;
}

BeanFactoryPostProcessor—Bean工厂后置处理器

可以操作Bean工厂(BeanFactory),进行修改(如改类名、属性)

注意:如果在这里把UserService改成了User,则在后面一步创建的就不是UserService而是User,如下:

@Component
public class LubanBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        GenericBeanDefinition bd = (GenericBeanDefinition) beanFactory.getBeanDefinition("userService");
        Class<?> beanClass = bd.getBeanClass();
        System.out.println(beanClass);
        bd.setBeanClass(User.class);
    }
}
public class PSVMMain {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context =
                new AnnotationConfigApplicationContext ("appConfig.xml");
        // spring创建出来的,实例化(new userservice()--->填充属性)
        UserService userService = context.getBean("userService", UserService.class); // user
    }

}

这里输出会报错,说"userService"要的是User而不是UserService

Bean工厂组件完成

根据xml文件(或者其他方式)扫描到相关的类并生成BeanDefinition对象,放到Bean工厂的一个属性beanDefinitionMap,它的key就是beanName,value是BeanDefinition对象,并未生成bean对象,仅仅是BeanDefinition对象

BeanPostProcessor—Bean后置处理器

在bean对象实例完了之后使用;

属于bean工厂,为什么呢?因为需要在bean的创建过程中间调用

举例:@Autowired就是一个后置处理器:AutowiredAnnotationBeanPostProcessor,其实后面的步骤如初始化、AOP都是有相应的后置处理器进行处理

 

posted @ 2020-11-06 10:20  Mistolte  阅读(79)  评论(0)    收藏  举报