在Spring中,如何从自动装配的bean调用公共方法,其中该方法不是接口的一部分?

时间:2017-06-12 16:15:58

标签: spring methods interface autowired

我正在使用Spring 4.3.8.RELEASE。我定义了以下bean ...

import org.springframework.security.core.userdetails.UserDetailsService;
...
@Service
@Transactional(readOnly = true)
public class MyUserDetailsService implements UserDetailsService
{

    ...
    public SpringboardAuthenticationUser getSpringboardAuthenticationUser(final User domainUser)
    {
    ...

方法“getSpringboardAuthenticationUser”是我创建的方法,不是org.springframework.security.core.userdetails.UserDetailsS​​ervice接口的一部分。如何从其他地方访问此方法?例如,在我的代码的另一部分我有

@Autowired
private UserDetailsService m_myUserDetailsSvc;

但很明显,因为该方法不是UserDetailsS​​ervice接口的一部分,所以我无法调用它。那么我该如何调用这个公共方法呢?

3 个答案:

答案 0 :(得分:0)

从技术上讲,您可以将UserDetailsService转换为MyUserDetailsService并直接调用方法:

if (m_myUserDetailsSvc instanceof MyUserDetailsService) {
    final SpringboardAuthenticationUser user = MyUserDetailsService.class.cast(m_myUserDetailsSvc).getSpringboardAuthenticationUser();
}

但从设计角度来看,我建议重新考虑它。进行依赖注入的重点是降低组件之间的耦合,这样的操作/意图迫使你做相反的事情。

为什么不让getSpringboardAuthenticationUser()方法成为UserDetailsService界面的一部分?在这种情况下,它将成为一个合同,并且可以确保无论DI容器注入任何实现,它都将满足合同并能够为您检索该用户。

每条评论更新

如果您的bean被代理包裹,您可以拨打isAssignableFrom而不是instanceOf

if (m_myUserDetailsSvc.getClass().isAssignableFrom(MyUserDetailsService.class)) {
         MyUserDetailsService.class.cast(m_myUserDetailsSvc).getSpringboardAuthenticationUser();
}

答案 1 :(得分:0)

这是一个很好的问题。如果您对UserDetailsService的唯一实施是MyUserDetailsService,那么请修改界面,使其包含方法getSpringboardAuthenticationUser

如果您无法修改界面,则可以直接自动装配您要使用的课程@Autowired MyUserDetailsService m_myUserDetailsSvc,甚至可以将UserDetailsService投射到MyUserDetailsService。如果你想进行强制转换,那么我建议使用@Qualifier("MyUserDetailsService")强制Spring注入这种类型的bean。

答案 2 :(得分:0)

  
      
  1. 创建一个新的界面,扩展UserDetailsS​​ervice并添加所需的方法。
  2.   
renderer = new THREE.WebGLRenderer({antialiasing:true});
renderer.setPixelRatio( window.devicePixelRatio * 1.5 );
  
      
  1. 然后实现此界面。
  2.   
public class MyUserDetailsService extends UserDetailsService {
    ...
    public SpringboardAuthenticationUser getSpringboardAuthenticationUser(final User domainUser); 
    ... 
}
  
      
  1. 自动装配新界面。
  2.   
public class MyUserDetailsServiceImpl implements MyUserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    }

    @Override
    public SpringboardAuthenticationUser getSpringboardAuthenticationUser(final User domainUser){
        ... 
        //Your logic here.
    }
}