2015-06-25 89 views
0

下面的代碼看看:@Autowire使用單VS原型

@Controller 
public class HomeController 
{ 
    @Autowired 
    private FacadeRemote fr; 

// code omitted 
} 

|

@Component("user-details") 
public class CustomUserServiceDetails implements UserDetailsService 
{ 

    @Autowired 
    private FacadeRemote fr; 

    @Override 
    public UserDetails loadUserByUsername(String email) 
      throws UsernameNotFoundException 
    { 
     // omitted 
    } 

} 

配置:

<!-- JNDI Properties --> 
    <util:properties id="jndiProps"> 
     <beans:prop key="java.naming.factory.initial">org.jboss.naming.remote.client.InitialContextFactory</beans:prop> 
     <beans:prop key="java.naming.factory.url.pkgs">org.jboss.ejb.client.naming</beans:prop> 
     <beans:prop key="java.naming.provider.url">remote://127.0.0.1:4447</beans:prop> 
     <beans:prop key="java.naming.client.ejb.context">true</beans:prop> 
     <beans:prop key="boss.naming.client.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT">false</beans:prop> 
    </util:properties> 


    <!-- EJB look up --> 
    <jee:remote-slsb id="ns" jndi-name="Layer//myejb!com.uni.ag.FacadeRemote" 
     environment-ref="jndiProps" resource-ref="false" 
     business-interface="com.uni.ag.FacadeRemote" 
     lookup-home-on-startup="true"> 
    </jee:remote-slsb> 

在下面的例子中如何@Autowire工作:
是使用FacadeRemote的同一個實例的兩個班?
一般來說,我怎樣才能學習@線程安全相關的@Autowire行爲?

回答

1

@Autowired和線程安全之間幾乎沒有關係。 Spring IoC的唯一職責是注入聲明的依賴關係,並考慮它們的作用域等。確保所有bean在多線程應用程序中正常工作是您的責任。這意味着,例如對於單身bean所有的狀態,這個bean持有應該被同步。

關於你的第一個問題:將會注入一個代理FacadeRemote(例如允許將檢查異常RemoteException轉換爲未經檢查的異常)。根據Spring Spec裏面的這個代理將會是一個到FacadeRemote的遠程接口的緩存實例。

+0

因此默認情況下屬於兩個不同類的兩個實例變量將引用同一個對象(singleto策略)。如果我希望他們引用兩個不同的對象,我將不得不指定原型策略? – GionJh

+0

我不認爲Spring會允許你爲這種bean設置'prototype'策略。請記住,遠程EJB只是一個業務代表。 (請參閱:http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#ejb-introduction)。這裏(http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#beans-factory-scopes)你可以找到關於Spring範圍的所有信息。 – Arek