反射
Java Bean
- Class信息
- 构造器
Constructor
- 方法
Method
- 字段
Field
- 构造器
内省
Java BeanInfo
- Bean描述符:
BeanDescriptor
- 方法描述符:
MethodDescriptor
- 字段描述符:
FieldDescriptor
rcf 6749
引文
…
1.1 角色
javax.naming.Context
lookup(String name):Object
lookup(Name name):Object
BeanFactory#getBean(String):Object
BeanFactory#getBean(Class<T>):T
ListableBeanFactory#getBeansWithAnnotation(Class<? extends Annotation>):Map<String, Object>
FactoryBean
查找:FactoryBean#getObject():T
ObjectBean
查找:ObjectFactory#getObject():T
@Autowired
@Resource
@Inject
Essentially, this is the standard Observer design pattern.
核心,观察者模式
ApplicationEvent
ApplicationListener
SimpleApplicationEventMulticaster
1 | @Override |
java.net.URL#getProtocol
:HTTP,FTP,HTTPS,File…java.lang.ClassLoader#getResource:URL
java.lang.ClassLoader#getResources:Enumeration<URL>
InputStream
:java.lang.ClassLoader#getResourceAsStream
资源定位:classpath:/META-INF/xxx.properties
多资源定位:classpath*:/META-INF/xxx.properties
Resouce
接口URL
,File
)InputStream
)ClassPathResource
getURL
-> ClassLoader#getResource:URL
getInputStream
-> ClassLoader#getResourceAsStream
ResourceLoader
Resource
:org.springframework.core.io.ResourceLoader#getResource(String)
org.springframework.core.io.DefaultResourceLoader
ClassPathResource
FileUrlResource
或UrlResource
ProtocolResolver
resolve(String location, ResourceLoader resourceLoader)
ResourceBundle
ResourceBundle.Control
ResourceBundleControlProvider
java.util.ServiceLoader
SPIMessageSource
java.text.MessageFormat
hello,{0}->"word"->hello,word
ResourceBundleMessageSource
这是一个复合注解1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
...
}
这也是一个复合注解1
2
3
4
5
6@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}
实质就是@Configuration 一般用于快速配置ioc容器
流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图。通过使用流,我们可以说明想要完成什么任务,而不是说明如何去实现它。我们将操作的调度留给具体实现去解决。
1 | public class Person{ |
需求:在一个List
在Java8以前,我们通常是用foreach遍历实现这样的需求
但在Java8中,我们可以这样写1
2
3
4persons.stream()
.filter(Person:getGender)
.map(Person:getName)
.forEach(a->System.out.println(a));
这个工作流是操作流时的典型流程。
1 | Stream<Stream> words = Stream.of("hello,stream".split("")); |
of
方法具有可变长的参数,因此我们可以构建具有任意数量引员的流1
Stream<Stream> coderWords = Stream.of("java","python","c","scala");
使用
ArrayS.stream(array,from,to)
可以从数组中位于from
(包括)和to
(不包括)的元素中创建一个流
Collection
有 stream()
和parallelStream()
,意味着所有实现Collection的集合都可以使用这两个方法来创建一个流,见演示
- 自己创建流
- 创建不包含任何元素的流
1 Stream<String> silence = Stream.empty();
+ `genetate`产生无限流
1
2
Stream<String> echos = Stream.generate(()->"Echo");//常量值流
Stream<Double> randoms = Stream.generate(Math::random);//随机数流
+ `iterate`产生无限流
1
Stream<BigInteger> integers = Stream.iterate(BigInteger.ZERO,n->n.add(BigInteger.ONE));//迭代增加,产生0 1 2 3 ...
filter过滤流,很形象贴切
1
2List<String> wordList = ...;
Stream<String> words = wordList.stream().filter(w->w.length()>12);
按照某种方式转换流
1
2Stream<String> lowerCaseWords =
words.stream().map(String::toLowerCase);
获取摊平的流
1
2
3
4Stream<Stream<String>> result =
words.stream().map(a->letters(a));
Stream<String> flatResult =
words.stream().flatMap(a->letters(a));
limit
,skip
,concat
,distinct
,sorted
,peek
。。。
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。