在没有弹簧实例化的类中支持自动装配(3)

Ryt*_*mic 3 java spring autowired

我意识到这应该是非常基本的,但我还没有在Helloworld之后找到第二步

所以我拥有的是:

spring config xml名为spring-beans.xml:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">

    <context:annotation-config />
    <context:component-scan base-package="org" />

</beans>
Run Code Online (Sandbox Code Playgroud)

弹簧上下文初始化类:

public static void main(String[] args) {
    // initialize Spring
    ApplicationContext context = new ClassPathXmlApplicationContext("META-INF/spring-beans.xml");

    App app = (App) context.getBean("app");
    app.run();
}
Run Code Online (Sandbox Code Playgroud)

AppImpl类的相关细节:

@Component("app")
public final class AppImpl implements App{    

    // focus of question: This autowiring works
    @Autowired
    private DAO1 dao1;


    public void run() {
        //focus of question: This works as daoclass is instantiated properly                   
        obj1s = dao1.myFind();            

        badJobs = runJobs(obj1s);
    }

    private List<Obj1> runJobs(final List<Obj1> obj1s) {        
        List<Obj1> jobsGoneBad = new ArrayList<Obj1>();
        for (Obj1 next : obj1s) {

            // focus of question: usage of new keyword, thus not spring container managed?
            Job job = new JobImpl(next);
            job.run();

        }
        return jobsGoneBad;
    }    
}
Run Code Online (Sandbox Code Playgroud)

JobImpl的相关细节:

public class JobImpl implements Job {

    private Obj1 obj1;

    // focus of question: can't autowire
    @Autowired
    private DAO2 dao2;

    @Override
    public void run() {
        //focus of question: opDAO == null - not initialized by @Autowired
        Obj2 obj2 = dao2.myFind();        
    }

}
Run Code Online (Sandbox Code Playgroud)

DAO1的相关细节:

@Repository("DAO1") //Focus of question: DAO1 is a repository stereotype
public class DAO1 {

    myfind() { ...}
}
Run Code Online (Sandbox Code Playgroud)

DAO2的相关细节:

@Repository("DAO2") //Focus of question: DAO2 is a repository stereotype
public class DAO2 {        

    myfind() { ...}
}
Run Code Online (Sandbox Code Playgroud)

是的,所以我通过springcontext调用初始化App,然后通过使用@Autowired成功实例化DAO1实例.

然后我创建一个非托管的Job实例,并希望通过使用@Autowired在该类中注入"singeltonish"依赖项

两个Dao类都是春天的刻板印象,扫描仪发现它们很好.

所以我的问题基本上是,如何实例化作业实例以便我可以在其中使用@Autowired概念?

如果我需要一个全局可访问的applicationcontext,我该如何最好地介绍它?

Ral*_*lph 5

您可以使用Spring Bean功能,例如仅在Spring托管bean中注入!

但是您可以使用@ConfigurableAnnotation,但这需要您使用REAL AspectJ.如果一个类被注释@Configurable(并且你使用AspectJ),那么你可以使用Springs Injection Annotations,即使这个类是由法线创建的new.

@看到