2014-04-17 93 views
0

比方說,我有以下spring.xml(SomeBean由Spring管理)編程創建的對象可以通過註釋訪問spring上下文嗎?

<bean id="some_bean" class="SomeBean" /> 

和類(這個人是不是管理)

public class MyClass { 
    @<some magic or something else?> 
    private SomeBean sb; 
} 

和我的主要

public class Main { 
    public static void main(String[] args) { 
     new MyClass().getSB(); 
    } 
} 

如何通過創建新類(使用new關鍵字)來創建MyClass實例可以訪問id =「some_bean」的bean?

+1

調查AspectJ。否則,如果您無法訪問ApplicationContext,則不可能。 –

+0

你必須讓Spring MyClass可用。但你可以在運行時設置它:http://stackoverflow.com/questions/15328904/dynamically-declare-beans-at-runtime-in-spring – zenbeni

回答

1

您可以直接注入some_bean到您現有的預MyClass,如果你使用Spring AOP和與@Configurable標註爲:

@Configurable 
public class MyClass { 
    @Autowired 
    private SomeBean sb; 
} 

上面的代碼將被注入型。如果你碰巧有一個以上的SomeBean S,然後按名稱注:

@Configurable 
public class MyClass { 
     @Autowired 
     @Qualifier("some_bean") 
     private SomeBean sb; 
    } 
+0

嗯,我試過。但沒有發生(NPE除外)。我嘗試挖掘一點點以找到可能的一些配置,但沒有找到任何對第一次使用'AspectJ'有用的東西。它說我可能需要3個罐子('aspectjrt','aspectjtools'和'aspectjweaver'),所以我將它們添加到依賴項中。還嘗試添加類似''但沒有真正發生的事情。我錯過了什麼? – abc

+0

好的。我在加載時使用-javaagent:path_to_agent.jar來設法解決它。 – abc

1

如果你有機會到應用程序上下文,那麼你可以把它作爲:

public class MyClass { 
     @Autowire 
     private SomeBean sb; 
    } 

    public class Main { 
     public static void main(String[] args) { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); 
     MyClass myClass = new MyClass(); 
     ctx.getAutowireCapableBeanFactory().autowireBeanProperties(myClass, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, true); 
    } 
+0

相當醜陋的方式,AspectJ一個看起來不錯,但如果我不能設置這個東西,我可能會這樣做。謝謝。 – abc

0

一個選擇,如果你不」像AOP/AspectJ一樣,創建一個MyClassFactory bean,負責創建MyClass的新實例,並向它們中注入SomeBean引用(通過構造函數注入或方法注入),例如

@Service 
public class MyClassFactory { 
    @Autowired 
    private SomeBean sb; 

    public MyClass createMyClassWithSomeBean() { 
     MyClass myClass = new MyClass(); 
     myClass.setSomeBean(sb); 
     return myClass; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml"); 
     MyClassFactory factory = ctx.getBean(MyClassFactory.class); 
     MyClass myClass = factory.createMyClassWithSomeBean(); 
    } 
} 
相關問題