35838


SpringのAutowiredで困っているのでご教示ください。  
HogeClassはmainメソッドでnewを利用してインスタンス生成されます。この仕組みは変更できません。  
HogeClassではAutowiredを利用してサービスなどをDIしたいのですが、可能なのでしょうか。

main

[code]

    static void main(String...args) {
        HogeClass hoge = new HogeClass();
        hoge.execute()
    }
    
[/code]

HogeClass

[code]

    @Component
    public class HogeClass {
        @Autowired
        HogeService hogeService;
    
        public void execute() {
            hogeService.hogeMethod();
        }
    }
    
[/code]


CC BY-SA 3.0
2017-06-19T07:30:20.717
35705
2017-06-23T13:00:33.473
15316
question
java eclipse spring spring-boot
newしたインスタンスに含まれるAutowiredを解決したい


`@Component` の代わりに `@Configurable` を使ってみてはどうでしょうか。Configurable は new でも DI
管理下になると思います。


CC BY-SA 3.0
2017-06-19T10:17:41.160
35714
2017-06-19T10:17:41.160
440
35705
answer


SpringContextにオブジェクトを管理してもらわないと、DIが使えないはずですが。  
このサイトで掲載した方法で変更できないでしょうか。  
<http://d.hatena.ne.jp/tomotaro1065/20120505/1336191887>

要はMainメソッドに以下のように変更

[code]

    ApplicationContext appContext = 
                    new ClassPathXmlApplicationContext("classpath:./META-INF/spring/app-context.xml");
    HogeClass main = appContext.getBean(HogeClass.class);
    
[/code]


CC BY-SA 3.0
2017-06-22T01:37:17.623
35792
2017-06-22T01:37:17.623
23688
35705
answer


HogeClass を修正できるのであれば、HogeClass 内で ApplicationContext を作成し、その中で DI
済みのオブジェクトを作ってはどうでしょうか。例えば次のような形です。

[code]

    public class HogeClass {
        public void execute() {
            try (ApplicatoinContext ctx = ...) {
                HogeComponent hoge = ctx.getBean(HogeComponent.class);
                hoge.execute();
            }
        }
    }
    
    @Component
    public class HogeComponent {
        @Autowired
        HogeService hogeService;
    
        public void execute() {
            hogeService.hogeMethod();
        }
    }
    
[/code]


CC BY-SA 3.0
2017-06-23T13:00:33.473
35838
2017-06-23T13:00:33.473
23978
35705
answer