杭州建設(shè)網(wǎng) 執(zhí)法人員名單seo營(yíng)銷名詞解釋
Spring底層核心組件
BeanDefinition
BeanDefinition表示Bean定義,有很多屬性用來(lái)描述Bean的特點(diǎn):
-
class,表示Bean類型
-
scope,表示Bean作用域,單例或原型等
-
lazyInit:表示Bean是否是懶加載
-
initMethodName:表示Bean初始化時(shí)要執(zhí)行的方法
-
destroyMethodName:表示Bean銷毀時(shí)要執(zhí)行的方法
-
還有很多...
定義Bean的方式主要分為兩種:
-
申明式定義
1、<bean/> 2、@Bean 3、@Component(@Service,@Controller)
-
編程式定義
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);// 生成一個(gè)BeanDefinition對(duì)象,并設(shè)置beanClass為User.class,并注冊(cè)到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讀取器,雖然開(kāi)發(fā)中用的很少,但是源碼中用得很多
AnnotatedBeanDefinitionReader
把某個(gè)類轉(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/>
標(biāo)簽
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
XmlBeanDefinitionReader xmlBeanDefinitionReader = new XmlBeanDefinitionReader(context);
int i = xmlBeanDefinitionReader.loadBeanDefinitions("spring.xml");
System.out.println(context.getBean("user"));
ClassPathBeanDefinitionScanner
掃描器,可以進(jìn)行掃描,掃描某個(gè)包路徑,對(duì)掃描到的類進(jìn)行解析
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.refresh();
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(context);
scanner.scan("com.gax");
System.out.println(context.getBean("userService"));
BeanFactory
Bean工廠,負(fù)責(zé)創(chuàng)建Bean,并且提供獲取Bean的 API
ApplicationContext就是BeanFactory的一種
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory,
HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver {
...
}HierarchicalBeanFactory: 支持父子Bean工廠,子Bean工廠獲取不到時(shí),可以到父Bean工廠去獲取
ListableBeanFactory: 展示Bean的名字、展示Bean的數(shù)量、統(tǒng)計(jì)的信息、拿某一個(gè)類型的Bean,類似列表的功能
EnvironmentCapable: 獲取環(huán)境變量的功能
ApplicationEventPublisher: 事件發(fā)布的功能
MessageSource: 國(guó)際化的功能
ResourcePatternResolver: 獲取某些資源、解析某些資源的功能
Spring源碼中,BeanFactory接口非常重要的實(shí)現(xiàn)類: DefaultListableBeanFactory
ApplicationContext.getBean() 調(diào)用的就是 DefaultListableBeanFactory 的getBean()方法
DefaultListableBeanFactory 可以單獨(dú)使用:
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是個(gè)接口,實(shí)際上也是一個(gè)BeanFactory,不過(guò)比BeanFactory 更加強(qiáng)大:
1、HierarchicalBeanFactory:擁有獲取父BeanFactory的功能
2、ListableBeanFactory:擁有獲取beanNames的功能
3、ResourcePatternResolver:資源加載器,可以一次性獲取多個(gè)資源(文件資源等等)
4、EnvironmentCapable:可以獲取運(yùn)行時(shí)環(huán)境(沒(méi)有設(shè)置運(yùn)行時(shí)環(huán)境功能)
5、ApplicationEventPublisher:擁有廣播事件的功能(沒(méi)有添加事件監(jiān)聽(tīng)器的功能)
6、MessageSource:擁有國(guó)際化功能
ApplicationContext兩個(gè)重要的實(shí)現(xiàn)類:
1、AnnotationConfigApplicationContext
2、ClassPathXmlApplicationContext
國(guó)際化
定義一個(gè)MessageSource
@Bean
public MessageSource messageSource() {ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();messageSource.setBasename("messages");return messageSource;
}
ApplicationContext擁有國(guó)際化的功能,可以直接用
context.getMessage("test", null, new Locale("en_CN"))
資源加載
可以利用ApplicationContext獲取某個(gè)文件的內(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());
}
獲取運(yùn)行時(shí)環(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); //運(yùn)行java通過(guò)-D指定的環(huán)境變量MutablePropertySources propertySources = context.getEnvironment().getPropertySources();
System.out.println(propertySources); //最強(qiáng)大的,包含上面兩種和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ā)布
定義一個(gè)事件監(jiān)聽(tīng)器
@Bean
public ApplicationListener applicationListener() {return new ApplicationListener() {@Overridepublic void onApplicationEvent(ApplicationEvent event) {System.out.println("接收到了一個(gè)事件");}};
}
發(fā)布一個(gè)事件
context.publishEvent("yeah");