SpringSecurity中泛型的定义与声明

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<?>> 
  1. 按照SecurityConfigurerAdapter的定义,应该有 ClientDetailsServiceBuilder implements SecurityBuilder<ClientDetailsService<?>>
public class ClientDetailsServiceBuilder<B extends ClientDetailsServiceBuilder<B>> extends
		SecurityConfigurerAdapter<ClientDetailsService, B> implements SecurityBuilder<ClientDetailsService> {
  1. 同时ClientDetailsServiceBuilder可以传递一个任意类型的泛型,这里传递的是B,使用 这种方式定义,则他所有的子类都可以任意指定一个任意的泛型类型
public class ClientDetailsServiceBuilder<B extends ClientDetailsServiceBuilder<B>>

如下面

public class JdbcClientDetailsServiceBuilder extends ClientDetailsServiceBuilder<JdbcClientDetailsServiceBuilder> 
public class InMemoryClientDetailsServiceBuilder extends
		ClientDetailsServiceBuilder<InMemoryClientDetailsServiceBuilder> 
  1. 同时这处类也继承了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> 

猜你喜欢

转载自blog.csdn.net/mingtiandexia/article/details/88940456