2009-09-03 1 views
1

나는 다음 개체가 :봄 RegisterSingleton

public class TestObject 
{ 
    public String Something { get; set; } 
} 

을하고 다음 개체가 파일 : 내가하고 싶은 무엇

<?xml version="1.0" encoding="utf-8" ?> 
<objects xmlns="http://www.springframework.net" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.net http://www.springframework.net/xsd/spring-objects.xsd"> 

    <object id="TestObject" type="SpringTest.TestObject" autowire="byName"/> 
</objects> 

는 싱글을 등록하고 TestObject를 얻는 것입니다. 나는 이렇게 이렇게하고있다 :

IConfigurableApplicationContext context = new XmlApplicationContext("objects.xml"); 
context.ObjectFactory.RegisterSingleton("Something", "something to test"); 
object obj = context.GetObject("TestObject"); 

그러나 물건 속성은 항상 null이다. 이게 효과가 있다고 생각합니까? 아니면 제가 잘못하고있는 것 같습니까?

감사합니다.

답변

0

응용 프로그램 컨텍스트가 인스턴스화 될 때 싱글 톤이 인스턴스화되기 때문에 Something 속성이 설정되지 않습니다. RegisterSingleton을 호출하면 TestObject가 이미 만들어졌습니다. bean 연결은 bean이 작성 될 때만 수행됩니다.

싱글 톤 인스턴스를 늦추어이 문제를 해결할 수 있습니다. 그렇게하면 처음 요청 될 때까지 인스턴스화되지 않습니다. 다행히도, 필요한 다른 싱글 톤을 등록한 후입니다.

정확히 무엇을 성취하려고하는지 모르지만 콩을 인식하지 못하게 런타임시 일부 싱글 톤 빈 사이의 배선을 변경하려면 일부 래퍼 객체를 도입 할 것입니다. 각 래퍼는 인터페이스를 구현 한 다음 모든 메소드를 현재 대상 빈에 위임합니다. 배선을 변경하려면 래퍼 대상을 변경하면됩니다.

업데이트 : Spring.NET은 런타임에 빈의 구현을 교환 할 수 hot-swappable target sources있다yawn suggested한다. 이 같은 문서 모양에

HotSwappableTargetSource swapper = 
    (HotSwappableTargetSource) objectFactory.GetObject("swapper"); 
object oldTarget = swapper.swap(newTarget); 

는 XML 정의 :

<object id="initialTarget" type="MyCompany.OldTarget, MyCompany"> 
</object> 

<object id="swapper" 
    type="Spring.Aop.Target.HotSwappableTargetSource, Spring.Aop"> 
    <constructor-arg><ref local="initialTarget"/></constructor-arg> 
</object> 

<object id="swappable" 
    type="Spring.Aop.Framework.ProxyFactoryObject, Spring.Aop"> 
    <property name="targetSource"> 
     <ref local="swapper"/> 
    </property> 
</object> 
+0

흠 맞아요, 게으른 인스턴스 생성은 물론 도움이되었습니다.내가하고 싶은 일을 해소 시키자. 나는 여러 고객을 위해 여러 가지 배경 정보를 가지고있다. 컨텍스트에서 객체를 가져올 때 끌어온 객체 (서비스) 및 끌어온 객체에서 참조하는 다른 모든 서비스에 고객 "id"(간단한 nhibernate 객체)를 추가하려고합니다. – rrejc

+0

미안하지만, 아직도 당신이하려는 것을 정말로 이해하지 못합니다. 어떤 객체가 싱글 톤인지 그리고 객체간에 필요한 참조가 무엇인지 구체적으로 살펴보십시오. 메소드 삽입이 도움이 될 수 있습니다. 이것은 다양한 범위의 객체 사이의 경계를 부드럽게 처리하도록 설계되었습니다. 문서는 다음과 같습니다. http://www.springframework.net/docs/1.3.0-RC1/reference/html/objects.html#objects-method-injection –

0

싱글 톤을 원한다면 왜 scope="singleton"을 사용하지 않습니까?

+0

그게 무슨 뜻이야? 이렇게 정의 반대 할 = "단일"범위를 추가하려면 <오브젝트 ID = "TestObject"TYPE = "SpringTest.TestObject"자동으로 묶어 = "요소 별명"범위 = "단일"/> 이 불가능을 (스코프 수 응용 프로그램, 세션 또는 요청 만 가능). singleton = "true"를 의미하는 경우 이것이 기본 동작 AFAIK이므로 지정하지 않아도됩니다. 것은 하나의 식별자를 공장에서 생성 된 모든 서비스에 할당하려고합니다. – rrejc

+0

scope = "singleton"이 유효합니다. Spring 설명서를 확인하십시오. http://static.springsource.org/spring/docs/2.0.x/reference/beans.html#beans-factory-scopes –

+0

죄송합니다. 명시 적으로 말하지 않았지만 봄을 사용하고 있습니다. .net (여기서 말하는이 값은 유효한 값이 아닙니다.) – rrejc

1

나는 문제 설명이 무엇인지 확실하지 않다 다음은 빈 구현을 교환하는 방법을 보여줍니다 문서에서 몇 가지 예제 코드는 정확히 (.NET 용 Spring은 사용하지 않았습니다.) 그러나 돈 커키 (Don Kirkby)가 제안하는 것이 원할 경우 참조 문서에서 TargetSources를 찾아야합니다 (.NET 구현에도이 문서가 있다고 가정).

+0

감사합니다. 이전에 대상 소스에서 실행되지 않았습니다. 그게 원래의 포스터를 도울 지 모르겠지만 정보에 감사드립니다. –