菜鸡的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都是有相应的后置处理器进行处理