技术沉思录


  • Home

  • About

  • Tags

  • Categories

  • Archives

Java Beans 内省机制以及在Srping中的应用

Posted on 2019-08-04 | Post modified: 2019-08-04 | In java

反射

Java Bean

  • Class信息
    • 构造器Constructor
    • 方法Method
    • 字段Field

内省

Java BeanInfo

  • Bean描述符:BeanDescriptor
  • 方法描述符:MethodDescriptor
  • 字段描述符:FieldDescriptor

The OAuth 2.0 Authorization Framework

Posted on 2019-08-01 | Post modified: 2019-08-01 | In translation

rcf 6749

  1. 引文

    …

    1.1 角色

Spring technology stack

Posted on 2019-07-24 | Post modified: 2019-07-28 | In frame

Spring Framework 核心特性

IoC Container

IoC

  • java bean
  • Java Beans
  • 应该用不关心依赖组件来源,通过一定DI方式查找

DI

  • java ee:JNDI(Java Naming and Directory Interface)
    • javax.naming.Context
      • 名称
        • lookup(String name):Object
        • lookup(Name name):Object
  • 依赖查找(Dependency Lookup)
    • ID、别名、名称查找:
      • 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
  • 依赖注入(Dependency Injection)
    • 手段
      • spring@Autowired
      • java@Resource
      • javax@Inject
    • 途径
      • 字段(field)
      • 属性(setter)
      • 方法(method)
      • 构造器(constructor)

Events

Essentially, this is the standard Observer design pattern.
核心,观察者模式

spring事件:

  • ApplicationEvent

spring 事件监听器:

  • ApplicationListener

spring事件广播器:

  • SimpleApplicationEventMulticaster
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      @Override
    public void multicastEvent(final ApplicationEvent event, @Nullable ResolvableType eventType) {
    ResolvableType type = (eventType != null ? eventType : resolveDefaultEventType(event));
    Executor executor = getTaskExecutor();
    for (ApplicationListener<?> listener : getApplicationListeners(event, type)) {
    if (executor != null) {
    executor.execute(() -> invokeListener(listener, event));
    }
    else {
    invokeListener(listener, event);
    }
    }
    }

Resources

java资源管理

url资源管理
  • 协议:
    • java.net.URL#getProtocol:HTTP,FTP,HTTPS,File…
ClassLoader(Class Path)管理
  • 资源
    • 获取当前ClassLoader资源:java.lang.ClassLoader#getResource:URL
    • 获取当前ClassLoader所有资源:java.lang.ClassLoader#getResources:Enumeration<URL>
    • 获取当前ClassLoader资源的InputStream:java.lang.ClassLoader#getResourceAsStream

spring资源管理

资源定位: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
        • 前缀=”classpath:”->ClassPathResource
        • 否则->FileUrlResource或UrlResource
  • 协议扩展
    • ProtocolResolver
      • resolve(String location, ResourceLoader resourceLoader)

i18n

java i18n

  • java标准接口ResourceBundle
    • ResourceBundle.Control
    • ResourceBundleControlProvider
      • java 1.6 java.util.ServiceLoader SPI

spring MessageSource

  • java.text.MessageFormat
    • hello,{0}->"word"->hello,word
  • 实现类
    • ResourceBundleMessageSource

Validation

Java Bean Validation(JSR-308)

Srring Validator

Data Binding

Type Conversion

SpEL

AOP

Spring Boot 实际场景

Spring Cloud 应该怎么学

spring

Posted on 2019-07-14 | Post modified: 2019-07-15

Spring 简化开发的四个基本策略

基于POJO的轻量级和最小侵入性编程
通过依赖注入和面向接口松耦合
基于切面和惯性进行申明式编程
通过切面和模板减少样版式代码

Spring5模块结构

  1. Beans
  2. Core
  3. Context
  4. Expression

    Spring IOC

    BeanFactory

    BeanDefinition

    BeanDefinitionReader

Jenkins

Posted on 2019-07-14 | Post modified: 2019-07-14 | In Continuous Integration

认识jenkins

Continuous Integeration

Continuous Delivery

Java based

安装jenkins

下载

SpringBoot 自动装配原理详解

Posted on 2019-07-09 | Post modified: 2019-07-09 | In Spring

从@SpringBootApplication开始

这是一个复合注解

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 {
...
}

@SpringBootConfiguration

这也是一个复合注解

1
2
3
4
5
6
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
}

实质就是@Configuration 一般用于快速配置ioc容器

Java8 stream 流的基本操作

Posted on 2019-07-09 | Post modified: 2019-07-13 | In java-core

  流提供了一种让我们可以在比集合更高的概念级别上指定计算的数据视图。通过使用流,我们可以说明想要完成什么任务,而不是说明如何去实现它。我们将操作的调度留给具体实现去解决。

演示类(The demo class)

1
2
3
4
5
6
7
8
9
10
11
public class Person{
private final String name;
private final boolean gender;

public Person(String name,boolean gender){
this.name = name;
this.gender = gender;
}
//getters and setters
//...
}

需求:在一个List persons 中找出所有的男性,并打印其姓名

在Java8以前,我们通常是用foreach遍历实现这样的需求

但在Java8中,我们可以这样写

1
2
3
4
persons.stream()
.filter(Person:getGender)
.map(Person:getName)
.forEach(a->System.out.println(a));

流的使用

  这个工作流是操作流时的典型流程。

  • 创建一个流
  • 指定将初始流转换为其他流的中间操作,可能包含多个步骤
  • 应用终止操作,从而产生结果。这个操作会强制执行之前的惰性操作。从此之后,这个流就在也不能使用了(mark:一个流只能使用一次)

    流的创建

    从数组创建
    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

filter过滤流,很形象贴切

1
2
List<String> wordList = ...;
Stream<String> words = wordList.stream().filter(w->w.length()>12);

map

按照某种方式转换流

1
2
Stream<String> lowerCaseWords =
words.stream().map(String::toLowerCase);

flatMap

获取摊平的流

1
2
3
4
Stream<Stream<String>> result =
words.stream().map(a->letters(a));
Stream<String> flatResult =
words.stream().flatMap(a->letters(a));

limit,skip,concat,distinct,sorted,peek
终结操作(约简)

。。。

GPHomeWorkSingleton

Posted on 2019-04-19 | Post modified: 2019-04-19 | In JavaArchitect, GPHomeWork

Singleton

1、熟练掌握单例模式的常见写法。

Watson’s Github: designPattern

2、总结每种单例写法的优、缺点。

3 、思考破坏单例模式的方式有哪些?并且归纳总结。

破坏单例模式的方式:反射、序列化和反序列化

4 、梳理内部类的执行逻辑,并画出时序图。

woops

designPatternSimpleFacotry

Posted on 2019-02-21 | Post modified: 2019-02-21 | In OOAD

to be continued…

Design-Pattern-Observation

Posted on 2019-02-08 | Post modified: 2019-02-08 | In OOAD

观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

123

Silent Watson

27 posts
12 categories
20 tags
GitHub E-Mail
© 2018 — 2019 Silent Watson