spring源码中经常看到这种写法
public interface SecurityConfigurer<O, B extends SecurityBuilder<O>> {
初一看这种声明,感觉很晕,但凡是不确定的东西,最好的方式就是猜想+实践
猜:O没啥限制
B应该是SecurityBuilder<O>这咱类型的子类,即是实现它的接口或者extend
试着定义这种类型的子类
public class test implements SecurityConfigurer<O,B> {
@Override
public void init(B builder) throws Exception {
}
@Override
public void configure(B builder) throws Exception {
}
}
创建O,B
package com.imooc.web.controller;
public class O {
}
class B {}
这个时候仍然报错,提示B需要实现SecurityBuilder<O>
class B implements SecurityBuilder<O> {
@Override
public O build() throws Exception {
return null;
}
}
至此问题编译错误解决。
当然如果O是一个接口,上面仍然是编译通过的。
看几个spring中子类的实现
1.WebSecurityConfigurer
//1.声明
public interface SecurityConfigurer<O, B extends SecurityBuilder<O>>
//2.子类声明,这里仅仅是把O替换成Filter,B替换成T
public interface WebSecurityConfigurer<T extends SecurityBuilder<Filter>> extends
SecurityConfigurer<Filter, T>
//3. 2的子类,这里的WebSecurity就相当于2中的T
public abstract class WebSecurityConfigurerAdapter implements
WebSecurityConfigurer<WebSecurity>
//WebSecurity extends SecurityBuilder<Filter>
public final class WebSecurity extends
AbstractConfiguredSecurityBuilder<Filter, WebSecurity> implements
SecurityBuilder<Filter>, ApplicationContextAware {
这里的Filter就是声明中的O,T就是上面的B,两者的关系就是声明中的
T extends SecurityBuilder<Filter>
2.SecurityConfigurerAdapter
定义:
1. 总接口SecurityConfigurer
public interface SecurityConfigurer<O, B extends SecurityBuilder<O>>
1.1 子类1:SecurityConfigurerAdapter
public abstract class SecurityConfigurerAdapter<O, B extends SecurityBuilder<O>>
implements SecurityConfigurer<O, B>
B应该继承SecurityBuilder<O>
1.1.1 查看一个比较简单的泛型子类:SmsCodeAuthenticationSecurityConfig
public class SmsCodeAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
通过上面的声明,可以猜到:HttpSecurity应该是**SecurityBuilder<DefaultSecurityFilterChain>**的子类或实现这个接口
public final class HttpSecurity extends
AbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain, HttpSecurity>
implements SecurityBuilder<DefaultSecurityFilterChain>,
HttpSecurityBuilder<HttpSecurity>
1.1.2 查看一个较为复杂的泛型子类:ClientDetailsServiceConfigurer
public class ClientDetailsServiceConfigurer extends
SecurityConfigurerAdapter<ClientDetailsService, ClientDetailsServiceBuilder<?>>
- 按照SecurityConfigurerAdapter的定义,应该有 ClientDetailsServiceBuilder implements SecurityBuilder<ClientDetailsService<?>>
public class ClientDetailsServiceBuilder<B extends ClientDetailsServiceBuilder<B>> extends
SecurityConfigurerAdapter<ClientDetailsService, B> implements SecurityBuilder<ClientDetailsService> {
- 同时ClientDetailsServiceBuilder可以传递一个任意类型的泛型,这里传递的是B,使用 这种方式定义,则他所有的子类都可以任意指定一个任意的泛型类型
public class ClientDetailsServiceBuilder<B extends ClientDetailsServiceBuilder<B>>
如下面
public class JdbcClientDetailsServiceBuilder extends ClientDetailsServiceBuilder<JdbcClientDetailsServiceBuilder>
public class InMemoryClientDetailsServiceBuilder extends
ClientDetailsServiceBuilder<InMemoryClientDetailsServiceBuilder>
- 同时这处类也继承了SecurityConfigurerAdapter
所以B 应该是SecurityBuilder<ClientDetailsService>的子类或实现这个接口
由于限定了B是ClientDetailsServiceBuilder的子类型,由于ClientDetailsServiceBuilder实现了Security这个接口,因此它的B的子类肯定能满足这一条件
1.1.3 再看一个更为复杂的泛型子类:UserDetailsAwareConfigurer
public abstract class UserDetailsAwareConfigurer<B extends ProviderManagerBuilder<B>, U extends UserDetailsService>
extends SecurityConfigurerAdapter<AuthenticationManager, B> {
应该有
B implements SecurityBuilder<AuthenticationManager>>
并未看到,但是看B的定义
B extends ProviderManagerBuilder
查看ProviderManagerBuilder满足上述要求
1.2 WebSecurityConfigurer
public interface WebSecurityConfigurer<T extends SecurityBuilder<Filter>> extends
SecurityConfigurer<Filter, T>
按照定义,应该有
T extends SecurityBuilder<Filter>
WebSecurity这个类的定义是能满足上面要求的
public abstract class WebSecurityConfigurerAdapter implements
WebSecurityConfigurer<WebSecurity>
1.3GlobalAuthenticationConfigurerAdapter
public abstract class GlobalAuthenticationConfigurerAdapter implements
SecurityConfigurer<AuthenticationManager, AuthenticationManagerBuilder> {
同理应该有AuthenticationManagerBuilder extends SecurityBuilder<AuthenticationManager>
只有implements ProviderManagerBuilder<AuthenticationManagerBuilder>
但是ProviderManagerBuilder是SecurityBuilder的子接口,因此也没问题
public class AuthenticationManagerBuilder
extends
AbstractConfiguredSecurityBuilder<AuthenticationManager, AuthenticationManagerBuilder>
implements ProviderManagerBuilder<AuthenticationManagerBuilder>