杭州建設(shè)網(wǎng) 執(zhí)法人員名單seo營銷名詞解釋
Spring底層核心組件
BeanDefinition
BeanDefinition表示Bean定義,有很多屬性用來描述Bean的特點:
-
class,表示Bean類型
-
scope,表示Bean作用域,單例或原型等
-
lazyInit:表示Bean是否是懶加載
-
initMethodName:表示Bean初始化時要執(zhí)行的方法
-
destroyMethodName:表示Bean銷毀時要執(zhí)行的方法
-
還有很多...
定義Bean的方式主要分為兩種:
-
申明式定義
1、<bean/> 2、@Bean 3、@Component(@Service,@Controller)
-
編程式定義
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 生成一個BeanDefinition對象,并設(shè)置beanClass為User.class,并注冊到ApplicationContext中 AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition(); beanDefinition.setBeanClass(User.class); beanDefinition.setScope("prototype"); // 設(shè)置作用域 beanDefinition.setInitMethodName("init"); // 設(shè)置初始化方法 beanDefinition.setLazyInit(true); // 設(shè)置懶加載context.registerBeanDefinition("user", beanDefinition); System.out.println(context.getBean("user"));
BeanDefinitionReader
BeanDefinition讀取器,雖然開發(fā)中用的很少,但是源碼中用得很多
AnnotatedBeanDefinitionReader
把某個類轉(zhuǎn)換為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工廠,負責創(chuàng)建Bean,并且提供獲取Bean的 API
ApplicationContext就是BeanFactory的一種
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory,
HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...
}HierarchicalBeanFactory: 支持父子Bean工廠,子Bean工廠獲取不到時,可以到父Bean工廠去獲取
ListableBeanFactory: 展示Bean的名字、展示Bean的數(shù)量、統(tǒng)計的信息、拿某一個類型的Bean,類似列表的功能
EnvironmentCapable: 獲取環(huán)境變量的功能
ApplicationEventPublisher: 事件發(fā)布的功能
MessageSource: 國際化的功能
ResourcePatternResolver: 獲取某些資源、解析某些資源的功能
Spring源碼中,BeanFactory接口非常重要的實現(xiàn)類: DefaultListableBeanFactory
ApplicationContext.getBean() 調(diào)用的就是 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:可以獲取運行時環(huán)境(沒有設(shè)置運行時環(huán)境功能)
5、ApplicationEventPublisher:擁有廣播事件的功能(沒有添加事件監(jiān)聽器的功能)
6、MessageSource:擁有國際化功能
ApplicationContext兩個重要的實現(xiàn)類:
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獲取某個文件的內(nèi)容
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());
}
獲取運行時環(huán)境
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);Map<String, Object> systemEnvironment = context.getEnvironment().getSystemEnvironment();
System.out.println(systemEnvironment); //操作系統(tǒng)層面的環(huán)境變量Map<String, Object> systemProperties = context.getEnvironment().getSystemProperties();
System.out.println(systemProperties); //運行java通過-D指定的環(huán)境變量MutablePropertySources propertySources = context.getEnvironment().getPropertySources();
System.out.println(propertySources); //最強大的,包含上面兩種和PropertySources注解的變量System.out.println(context.getEnvironment().getProperty("NO_PROXY")); //操作系統(tǒng)
System.out.println(context.getEnvironment().getProperty("sun.jnu.encoding")); //jvm -D指定
System.out.println(context.getEnvironment().getProperty("gax")); //property里面的
事件發(fā)布
定義一個事件監(jiān)聽器
@Bean
public ApplicationListener applicationListener() {return new ApplicationListener() {@Overridepublic void onApplicationEvent(ApplicationEvent event) {System.out.println("接收到了一個事件");}};
}
發(fā)布一個事件
context.publishEvent("yeah");