全国企业信用信息查询网站,泸州市网站建设,黄页 网站模板,wordpress阿里整理了一下Spring的核心概念BeanDefinitionBeanDefinition表示Bean定义#xff0c;BeanDefinition中存在很多属性用来描述一个Bean的特点。比如#xff1a;class#xff0c;表示Bean类型scope#xff0c;表示Bean作用域#xff0c;单例或原型等lazyInit#xff1a;表示Be…整理了一下Spring的核心概念BeanDefinitionBeanDefinition表示Bean定义BeanDefinition中存在很多属性用来描述一个Bean的特点。比如class表示Bean类型scope表示Bean作用域单例或原型等lazyInit表示Bean是否是懒加载initMethodName表示Bean初始化时要执行的方法destroyMethodName表示Bean销毁时要执行的方法还有很多…在Spring中我们经常会通过以下几种方式来定义BeanBeanComponent(Service,Controller)这些我们可以称之申明式定义Bean。我们还可以编程式定义Bean那就是直接通过BeanDefinition比如
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);// 生成一个BeanDefinition对象并设置beanClass为User.class并注册到ApplicationContext中
AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
context.registerBeanDefinition(user, beanDefinition);System.out.println(context.getBean(user));
我们还可以通过BeanDefinition设置一个Bean的其他属性
beanDefinition.setScope(prototype); // 设置作用域
beanDefinition.setInitMethodName(init); // 设置初始化方法
beanDefinition.setLazyInit(true); // 设置懒加载
和申明式事务、编程式事务类似通过BeanComponent等申明式方式所定义的Bean最终都会被Spring解析为对应的BeanDefinition对象并放入Spring容器中。
BeanDefinitionReader
接下来我们来介绍几种在Spring源码中所提供的BeanDefinition读取器BeanDefinitionReader这些BeanDefinitionReader在我们使用Spring时用得少但在Spring源码中用得多相当于Spring源码的基础设施。AnnotatedBeanDefinitionReader可以直接把某个类转换为BeanDefinition并且会解析该类上的注解比如
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);AnnotatedBeanDefinitionReader annotatedBeanDefinitionReader new AnnotatedBeanDefinitionReader(context);// 将User.class解析为BeanDefinition
annotatedBeanDefinitionReader.register(User.class);System.out.println(context.getBean(user));
注意它能解析的注解是ConditionalScope、Lazy、Primary、DependsOn、Role、Description
XmlBeanDefinitionReader
可以解析标签
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);XmlBeanDefinitionReader xmlBeanDefinitionReader new XmlBeanDefinitionReader(context);
int i xmlBeanDefinitionReader.loadBeanDefinitions(spring.xml);System.out.println(context.getBean(user));
ClassPathBeanDefinitionScannerClassPathBeanDefinitionScanner是扫描器但是它的作用和BeanDefinitionReader类似它可以进行扫描扫描某个包路径对扫描到的类进行解析比如扫描到的类上如果存在Component注解那么就会把这个类解析为一个BeanDefinition比如
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext();
context.refresh();ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(context);
scanner.scan(com.bethmeta);System.out.println(context.getBean(userService));
BeanFactory BeanFactory表示Bean工厂所以很明显BeanFactory会负责创建Bean并且提供获取Bean的API。
而ApplicationContext是BeanFactory的一种在Spring源码中是这么定义的
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,MessageSource, ApplicationEventPublisher, ResourcePatternResolver {...
}
作者约一夏萌宠屋 链接https://www.zhihu.com/question/438612354/answer/2663530822 来源知乎 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。
首先在Java中接口是可以多继承的我们发现ApplicationContext继承了ListableBeanFactory和HierarchicalBeanFactory而ListableBeanFactory和HierarchicalBeanFactory都继承至BeanFactory所以我们可以认为ApplicationContext继承了BeanFactory相当于苹果继承水果宝马继承汽车一样ApplicationContext也是BeanFactory的一种拥有BeanFactory支持的所有功能不过ApplicationContext比BeanFactory更加强大ApplicationContext还基础了其他接口也就表示ApplicationContext还拥有其他功能比如MessageSource表示国际化ApplicationEventPublisher表示事件发布EnvironmentCapable表示获取环境变量等等关于ApplicationContext后面再详细讨论。在Spring的源码实现中当我们new一个ApplicationContext时其底层会new一个BeanFactory出来当使用ApplicationContext的某些方法时比如getBean()底层调用的是BeanFactory的getBean()方法。在Spring源码中BeanFactory接口存在一个非常重要的实现类是**DefaultListableBeanFactory也是非常核心的。**具体重要性随着后续课程会感受更深。所以我们可以直接来使用DefaultListableBeanFactory而不用使用ApplicationContext的某个实现类比如
DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);beanFactory.registerBeanDefinition(user, beanDefinition);System.out.println(beanFactory.getBean(user));
DefaultListableBeanFactory是非常强大的支持很多功能可以通过查看DefaultListableBeanFactory的类继承实现结构来看 作者约一夏萌宠屋 链接https://www.zhihu.com/question/438612354/answer/2663530822 来源知乎 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。
这部分现在看不懂没关系源码熟悉一点后回来再来看都可以。它实现了很多接口表示它拥有很多功能AliasRegistry支持别名功能一个名字可以对应多个别名Bean DefinitionRegistry可以注册、保存、移除、获取某个Bean DefinitionBeanFactoryBean工厂可以根据某个bean的名字、或类型、或别名获取某个Bean对象 SingletonBeanRegistry可以直接注册、获取某个单例Bean SimpleAliasRegistry它是一个类实现了AliasRegistry接口中所定义的功能支持别名功能 ListableBeanFactory在BeanFactory的基础上增加了其他功能可以获取所有Bean Definition的beanNames可以根据某个类型获取对应的beanNames可以根据某个类型获取{类型对应的Bean}的映射关系 HierarchicalBeanFactory在BeanFactory的基础上添加了获取父BeanFactory的功能 DefaultSingletonBeanRegistry它是一个类实现了SingletonBeanRegistry接口拥有了直接注册、获取某个单例Bean的功能 ConfigurableBeanFactory在HierarchicalBeanFactory和SingletonBeanRegistry的基础上添加了设置父BeanFactory、类加载器表示可以指定某个类加载器进行类的加载、设置Spring EL表达式解析器表示该BeanFactory可以解析EL表达式、设置类型转化服务表示该BeanFactory可以进行类型转化、可以添加BeanPostProcessor表示该BeanFactory支持Bean的后置处理器可以合并BeanDefinition可以销毁某个Bean等等功能FactoryBeanRegistrySupport支持了FactoryBean的功能AutowireCapableBeanFactory是直接继承了BeanFactory在BeanFactory的基础上支持在创建Bean的过程中能对Bean进行自动装配AbstractBeanFactory实现了ConfigurableBeanFactory接口继承了FactoryBeanRegistrySupport这个BeanFactory的功能已经很全面了但是不能自动装配和获取beanNamesConfigurableListableBeanFactory继承了ListableBeanFactory、AutowireCapableBeanFactory、ConfigurableBeanFactoryAbstractAutowireCapableBeanFactory继承了AbstractBeanFactory实现了AutowireCapableBeanFactory拥有了自动装配的功能DefaultListableBeanFactory继承了AbstractAutowireCapableBeanFactory实现了ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口所以DefaultListableBeanFactory的功能很强大