装修公司 网站模板,求人做网站的网站,杭州网站制作工具,哪个网站可以做前端项目Spring底层核心组件
BeanDefinition
BeanDefinition表示Bean定义#xff0c;有很多属性用来描述Bean的特点#xff1a; class#xff0c;表示Bean类型 scope#xff0c;表示Bean作用域#xff0c;单例或原型等 lazyInit#xff1a;表示Bean是否是懒加载 initMethod…Spring底层核心组件
BeanDefinition
BeanDefinition表示Bean定义有很多属性用来描述Bean的特点 class表示Bean类型 scope表示Bean作用域单例或原型等 lazyInit表示Bean是否是懒加载 initMethodName表示Bean初始化时要执行的方法 destroyMethodName表示Bean销毁时要执行的方法 还有很多... 定义Bean的方式主要分为两种 申明式定义 1、bean/
2、Bean
3、Component(Service,Controller) 编程式定义 AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);// 生成一个BeanDefinition对象并设置beanClass为User.class并注册到ApplicationContext中
AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
beanDefinition.setScope(prototype); // 设置作用域
beanDefinition.setInitMethodName(init); // 设置初始化方法
beanDefinition.setLazyInit(true); // 设置懒加载context.registerBeanDefinition(user, beanDefinition);
System.out.println(context.getBean(user));
BeanDefinitionReader
BeanDefinition读取器虽然开发中用的很少但是源码中用得很多
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));
可以解析的注解Conditional、Scope、Lazy、Primary、DependsOn、 Role、Description
XmlBeanDefinitionReader
解析bean/标签
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);
XmlBeanDefinitionReader xmlBeanDefinitionReader new XmlBeanDefinitionReader(context);
int i xmlBeanDefinitionReader.loadBeanDefinitions(spring.xml);
System.out.println(context.getBean(user));
ClassPathBeanDefinitionScanner
扫描器可以进行扫描扫描某个包路径对扫描到的类进行解析
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext();
context.refresh();
ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(context);
scanner.scan(com.gax);
System.out.println(context.getBean(userService));
BeanFactory
Bean工厂负责创建Bean并且提供获取Bean的 API
ApplicationContext就是BeanFactory的一种
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory,
HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...
}HierarchicalBeanFactory: 支持父子Bean工厂子Bean工厂获取不到时可以到父Bean工厂去获取
ListableBeanFactory: 展示Bean的名字、展示Bean的数量、统计的信息、拿某一个类型的Bean类似列表的功能
EnvironmentCapable: 获取环境变量的功能
ApplicationEventPublisher: 事件发布的功能
MessageSource: 国际化的功能
ResourcePatternResolver: 获取某些资源、解析某些资源的功能
Spring源码中BeanFactory接口非常重要的实现类 DefaultListableBeanFactory
ApplicationContext.getBean() 调用的就是 DefaultListableBeanFactory 的getBean()方法
DefaultListableBeanFactory 可以单独使用
DefaultListableBeanFactory beanFactory new DefaultListableBeanFactory();
AbstractBeanDefinition beanDefinition BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
beanFactory.registerBeanDefinition(user, beanDefinition);
System.out.println(beanFactory.getBean(user));
ApplicationContext
ApplicationContext是个接口实际上也是一个BeanFactory不过比BeanFactory 更加强大
1、HierarchicalBeanFactory拥有获取父BeanFactory的功能
2、ListableBeanFactory拥有获取beanNames的功能
3、ResourcePatternResolver资源加载器可以一次性获取多个资源文件资源等等
4、EnvironmentCapable可以获取运行时环境没有设置运行时环境功能
5、ApplicationEventPublisher拥有广播事件的功能没有添加事件监听器的功能
6、MessageSource拥有国际化功能
ApplicationContext两个重要的实现类
1、AnnotationConfigApplicationContext
2、ClassPathXmlApplicationContext
国际化
定义一个MessageSource
Bean
public MessageSource messageSource() {ResourceBundleMessageSource messageSource new ResourceBundleMessageSource();messageSource.setBasename(messages);return messageSource;
}
ApplicationContext拥有国际化的功能可以直接用
context.getMessage(test, null, new Locale(en_CN))
资源加载
可以利用ApplicationContext获取某个文件的内容
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);Resource resource context.getResource(file://D:\\UserService.java);
System.out.println(resource.contentLength());
System.out.println(resource.getFilename());Resource resource1 context.getResource(https://www.baidu.com);
System.out.println(resource1.contentLength());
System.out.println(resource1.getURL());Resource resource2 context.getResource(classpath:spring.xml);
System.out.println(resource2.contentLength());
System.out.println(resource2.getURL());Resource[] resources context.getResources(classpath:com/gax/*.class);
for (Resource resource : resources) {System.out.println(resource.contentLength());System.out.println(resource.getFilename());
}
获取运行时环境
AnnotationConfigApplicationContext context new AnnotationConfigApplicationContext(AppConfig.class);MapString, Object systemEnvironment context.getEnvironment().getSystemEnvironment();
System.out.println(systemEnvironment); //操作系统层面的环境变量MapString, Object systemProperties context.getEnvironment().getSystemProperties();
System.out.println(systemProperties); //运行java通过-D指定的环境变量MutablePropertySources propertySources context.getEnvironment().getPropertySources();
System.out.println(propertySources); //最强大的包含上面两种和PropertySources注解的变量System.out.println(context.getEnvironment().getProperty(NO_PROXY)); //操作系统
System.out.println(context.getEnvironment().getProperty(sun.jnu.encoding)); //jvm -D指定
System.out.println(context.getEnvironment().getProperty(gax)); //property里面的
事件发布
定义一个事件监听器
Bean
public ApplicationListener applicationListener() {return new ApplicationListener() {Overridepublic void onApplicationEvent(ApplicationEvent event) {System.out.println(接收到了一个事件);}};
}
发布一个事件
context.publishEvent(yeah);