我正在开发一种应该由外部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,因此我的自动装配不起作用。
还有其他方法可以让自动装配工作吗?
答案 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中引用它。