2016-07-22 109 views
0

我对如何与上述方案去春混乱(依赖注入上下文)春天依赖注入方案

class Login { 
    String username; 
    String password; 
    UserAuthService userAuth; 

    /* 
     assume getter and setter 
     methods for above private 
     properties here 
    */ 

} 

UserAuthService是有一个布尔方法验证一个接口(字符串username,字符串密码);

它由BasicAuthService,LDAPAuthService,MockBasicAuthService,MockLDAPAuthService实现; 另外假设BasicAuthServie具有属性serverAddress,作为具有认证服务器IP地址的字符串, 与LDAPAuthService相同。

语境下我的问题是依赖注入和Spring,

我了解,基于beanconfig文件春天(的IOC)将注入的具体实施 UserAuthService之一。

1。在beanconfig文件中,我们只能配置一个ref say() 场景:假设在UI用户有一个下拉菜单来选择BasicAuth/LDAPAuth。用户选择了LDAPAuth,如何在春季处理这种情况? ,因为我们在beanconfig文件中有硬连线ref =“beanIdBasicAuthService”)。有没有办法动态地改变参考?

2。稍微复杂一些(假设IT管理员等等),UI现在提供选项来选择认证服务器的地址(这是基本/ LDAP认证服务类中的一个属性) 再次在beanconfig文件中,我们已经硬连接了这些属性。如何在春季改变它的动态? (除了明确获取注入bean和调用setterMethod)

这些场景对我来说有点混乱。有人可以解释这个吗?

回答

0

回答这两个问题:改为注入工厂类。 例如在你的例子中:

class Login { 
    String username; 
    String password; 
    UserAuthServiceFactory userAuthFactory; 

    /* 
     assume getter and setter 
     methods for above private 
     properties here 
    */ 
} 

class UserAuthServiceFactory { 
    UserAuthService createUserAuth(String type, String remoteHost, ...) {...} 
} 
0

Spring提供了一些白魔法,但你真的需要黑魔法:-)。

更严重的是,你是正确的一方:Spring只能在bean创建时间上配置一个bean,并且只能创建bean。顺便说一句,这里还有一个范围的问题:一个Singleton bean只会被创建一次,并且在整个应用程序中将使用同一个对象,而对于bean作用域,当从应用程序上下文请求时会构造一个新对象。

但是,一旦你有一个bean,你可以自由使用它并改变Spring初始化的值。

这就是第二个问题的方法:在UI中注入AuthService(s),并简单地通过UI更改服务器地址(有点同步...):新地址将是从那时起使用。

对于第一个问题,我首先会说在像Login类这样的类中注入身份验证服务是不常见的。首先它迫使你通过对应用程序上下文的请求来创建任何Login对象,这会不必要地将你的应用程序绑定到Spring类。恕我直言,更好的设计将有一个主身份验证类注入一个具体的身份验证对象的容器,并委托实际身份验证。这是Spring Security用AuthenticationManager将AuthenticationProviders的实际身份验证委托给的。