编程创建的对象可以通过注释访问spring上下文吗?

时间:2014-04-17 14:26:57

标签: java spring spring-mvc

假设我有以下spring.xml(SomeBean由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?

3 个答案:

答案 0 :(得分:1)

如果您使用Spring AOP并使用@Configurable对其进行注释,则可以将some_bean直接注入预先存在的MyClass

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

上面的代码将按类型注入。如果您碰巧有多个SomeBean s,则按名称注入:

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

答案 1 :(得分: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);
    }

答案 2 :(得分: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();
    }
}