Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 支持非spring实例化的类中的自动连接(3)_Java_Spring_Autowired - Fatal编程技术网

Java 支持非spring实例化的类中的自动连接(3)

Java 支持非spring实例化的类中的自动连接(3),java,spring,autowired,Java,Spring,Autowired,我意识到这应该是非常基本的,但我还没有找到继Helloworld之后的第二步示例 因此,我得到的是: 名为spring-beans.xml的spring配置xml: <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org

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

因此,我得到的是:

名为spring-beans.xml的spring配置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>
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;
    }    
}
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实例

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

两个Dao类都是spring原型,scanner发现它们很好

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


如果我需要一个全局可访问的应用程序上下文,如何最好地介绍它?

@Component
注释添加到您的
JobImpl
类中。在xml中为此类添加组件扫描,您的自动连接将适用于
dao2
(提供getter setter方法)。

默认情况下,SpringBean是单例的。然而,您需要的是多个实例,并且在运行时创建了多个实例

一种可能性是使用它。您将创建一个容器感知作业工厂,该工厂将从容器请求新实例


(我认为需要在这些运行时实例中注入DAO引用有点可疑……我可能会尝试重新思考逻辑。例如,为什么不能在构造函数参数中提供DAO引用,或者从其他地方使用它。在DAO中可以有一个接受作业实例或runWit的方法。)JobImpl中的h(DAO2 dao)内容,该内容将满足于在其他地方注入的类,或者JobProcessor服务,该服务将注入dao并从Jobs实例中询问相关信息……)@Autowired无法工作,因为您的JobImpl对象不是由spring管理的,因此它从来没有机会注入它。spring管理的bean是在组件扫描期间或XML定义中创建实例的bean。在您的例子中,JobImpl被实例化为普通Java对象

一种解决方案是在spring上下文中用手动查找代替自动布线

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

@Autowired在@AppImpl中工作,因为它被注释为@Component。这将在其类路径扫描期间为spring标记它,它将创建此类的实例并执行任何自动连接/注入。

您只能在spring托管Bean中使用spring Bean功能,如注入

但是您可以使用
@可配置的
注释,但这需要使用真正的AspectJ。
如果一个类由
@可配置的
(并且您使用AspectJ)注释,那么您可以使用Springs注入注释,即使这个类是由一个普通的
新的
创建的

@看

  • 弹簧参考:

我不认为这是问题所在-问题在于他正在运行时手动创建JobImpl类,绕过spring容器。我明白了,但正如您可能已经注意到的,JobImpl接收到一个Obj1构造函数参数,并打算处理数千个参数,这使得使用@Component的选项无效,因为它不是对象与singelton behavior有关。谢谢你的礼貌。:)你介意详细阐述一下“其他地方”的想法吗。这些信息与解决当前设计的问题有关,但我认为,按照另一篇文章的建议,重新设计可以更好地解决问题。显然值得投一票!谢谢你的意见。我知道它为什么不起作用。我更多地是在寻找最佳替代实现的投入,以使其发挥作用。我不认为每次运行到应用程序上下文时,我都需要像重新设计另一个答案那样解决它
@Repository("DAO2") //Focus of question: DAO2 is a repository stereotype
public class DAO2 {        

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