如何在Spring Application Context之外创建Spring Bean

时间:2011-11-08 23:13:17

标签: java spring java-ee

我正在开发一种应该由外部Java应用程序调用的插件。 我的插件正在使用Spring,因为我试图简化我的操作:

让我们考虑一下这是3D派对应用程序,并且它在其主要功能中调用我的插件。

public class ThirdPartyClass {

    public static void main(String[] args) {
        GeneralPlugin plugin  = new MyPlugin();
        plugin.init();
        //calling ext. plugin functionality.
        plugin.method1();
    } 
}

现在这是我的插件

package com.vanilla.spring;

@Component 
    public class MyPlugin implements GeneralPlugin{

        @Autowired
        Dao mydao;

        public void init(){
            //some initiation logic goes here...
        }

        public void method1(){
            dao.delete();
        }
    }

现在我的Dao

package com.vanilla.spring;

Component(value="dao")
public class MyDao {

    public void delete(){
//SOME DATABASE LOGIC GOES HERE!!!  
}
}

现在我的XML:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
<context:annotation-config />
<context:component-scan base-package="com.vanilla.spring"></context:component-scan>
</beans>

我的问题是我的dao为null,我在访问dao对象时得到NullPointerException

我 我相信它发生是因为我是应用程序上下文中的启动bean,因此我的自动装配不起作用。

还有其他方法可以让自动装配工作吗?

1 个答案:

答案 0 :(得分:3)

“Spring beans”就是这样:Java bean。除了通过继承或对象实例化给予它们之外,它们没有内在的能力。

Spring Application Context负责创建bean并“连接”它,这是在上下文中创建其他bean并调用bean的setter(和构造函数)以及配置它们的结果的过程。要做到这一点,请使用XML配置文件和注释来决定创建什么以及放置它的位置。

如果您不打算使用实际的应用程序上下文,那么您必须自己手动完成所有这些工作。也就是说,使用适当的数据源创建DAO,创建插件bean,并在插件bean上设置DAO。

在这个具体的例子中,由于第三方应用程序控制了插件bean的实例化,你可能需要a)在插件构造函数中创建DAO(这是你在第一次使用Spring时要避免的) (或者b)在插件构造函数中创建一个Application Context,并通过查询上下文来引用插件所需的bean。这不像让上下文执行所有操作那么有用,但至少您不必配置应用程序手动使用的其余bean(使用用户名,连接URL等)。

如果你去第二个路径,那么你需要在类路径中的某个地方使用Spring配置文件,或者以其他方式在插件bean中引用它。