支持在春季未实例化的类中自动启动的自动化



我意识到这应该是基本的,但是我还没有找到helloworld之后的第二步示例

所以我拥有的是:

春季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>

春季上下文初始化类:

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();
}

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;
    }    
}

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();        
    }
}

dao1的相关细节:

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

dao2的相关细节:

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

对,所以我通过SpringContext调用初始化了该应用程序,然后通过使用@Autowired来成功实例化DAO1实例。

然后我创建了一个不受管理的作业实例,并想通过使用@Autowied

在该类中注入" Singeltonish"依赖项

两个dao类都是春季刻板印象,扫描仪可以很好地发现它们。

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

如果我需要全球可访问的应用程序context,我该如何最好地介绍?

您只能在弹簧托管豆中使用弹簧豆功能!

但是您可以使用@Configurable注释,但这要求您使用真实的expactj。如果@Configurable注释一类(并且您使用extackJ),则可以使用SPRINGS注入注释,即使该类是由普通new创建的。

@See

  • 春季参考:第8.8.1章使用aptivej用spring
  • 的依赖项注入域对象
  • 使用@configurable
  • 使用春季自动释放

默认情况下,弹簧豆是单例。但是,您需要多个实例,最重要的是,多个实例创建了运行时。

一种可能性是为此使用方法注入。您将创建一个容器意识到的作业工厂,该工厂将从容器中请求新实例。

(我认为您需要在运行时实例中注入DAO参考...我可能会尝试重新考虑逻辑。例如,或完全从其他地方使用它。您可以在DAO中使用一种可以接受工作实例的方法,或者在Jobimpl中使用runwith(dao2 dao)的东西,可以满足其他地方注入的类,或者JobProcessor将注入DAO的服务,并会询问Jobs实例的相关信息...)

@Autowired不起作用,因为您的Jobimpl对象没有在春季管理,因此它永远没有机会注入它。弹簧托管的豆是在组件扫描或XML定义中创建实例的那些。在您的情况下,Jobimpl正在将其实例化为普通的Java对象。

一种解决方案是在春季上下文中用手动查找替换自动线。

private DAO2 dao2 = SpringApplicationContext.getApplicationContext ().getBean (DAO2.class);

@Autowired在@Appimpl工作,因为它被注释为@component。此标志将在其类Path扫描期间为Spring上升,在该扫描中将创建此类实例并执行任何自动/注射。

添加@Component注释到您的JobImpl类。在XML中添加此类的组件扫描,并且您的自动启动将适用于dao2(提供getter-setter方法)。

最新更新