在仅使用CDI的简单java程序中,我们总是需要一个beans.xml来进行依赖注入吗?我们是否需要构造一个bean来获取注入的对象???
以下是具有依赖注入::
的简单java项目的代码接口
public interface Hello
{
public void sayHello(String str);
}
类
public class HelloImpl1 implements Hello{
public void sayHello(String str){
System.out.println("Hello from 1st block")
}
}
类
public class HelloImpl2 implements hello{
public void sayHello(String str){
System.out.println("Hello from 2nd block")
}
}
类
public CallingHello(){
@Inject
Hello hello;
public void callHello(){
hello.sayHello("Hey");
}
}
类
public Test(){
public static void main(String[] args){
CallingHello hello=new CallingHello();
hello.callHello();
}
这就是我正在做的事情,并且在运行测试类时抛出nullpointerexception,而我在eclipse中制作简单的类没有bean,我是否正确?
答案 0 :(得分:2)
您可以使用自动装配,以便将依赖关系(并可能应用后处理器)注入不属于应用程序上下文的对象。
您可以使用带工厂方法的java配置类来配置ApplicationContext
:
@Configuration
public class AppConfig {
@Bean(name="HelloImpl1")
public HelloImpl1 helloImpl1() {
return new HelloImpl1();
}
@Bean(name="HelloImpl2")
public HelloImpl1 helloImpl2() {
return new HelloImpl2();
}
}
然后实例化:
ApplicationContext ctx =
new AnnotationConfigApplicationContext(AppConfig.class);
HelloImpl1 helloImpl1= (HelloImpl1)ctx.getBean("HelloImpl1");
helloImpl1.sayHello("#?*")
答案 1 :(得分:1)
如果使用Spring进行依赖注入,则始终需要配置文件。但它不需要命名为beans.xml。
是的,bean被注入其他beans。
答案 2 :(得分:1)
技术上没有你没有使用XML文件定义你的bean并注入依赖项。它取决于您使用的ApplicationContext的类型。但是,对于大多数实际应用程序,您将使用一个AbstractXMLContextApplication实例,它将加载XML文件以找出您的应用已声明的bean。该文件的名称不必是beans.xml。这是一个使用的约定,但你不必将它命名为。在构造AbstractXMLApplicationContext对象的实现时,可以覆盖它查找的文件。
您需要做的就是构造bean容器,它将加载bean,解析依赖关系,并启动程序(如果您使用的是init方法)。通常,我的Spring Container Java程序如下所示:
ApplicationContext context = null;
try {
context = new FileSystemXmlApplicationContext( new String[] { file } );
// pause until we want to shutdown or after something happens.
System.in.readLine();
} finally {
context.close(); // remember to clean up!
}
我让bean启动我的应用程序的init方法。