【发布时间】:2014-08-13 10:38:45
【问题描述】:
我想要做的就是在 NotesPanel 类中自动装配字段 backgroundGray,但我得到的只是下面的异常。
那么,问题是,如何正确地自动接线?这真的让我发疯,因为这可能是我做错了什么非常愚蠢的事情......
感谢您的帮助! 托尔斯滕
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'notepad' defined in class path resource [Beans.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [notepad.Notepad]: Constructor threw exception; nested exception is java.lang.NullPointerException
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [notepad.Notepad]: Constructor threw exception; nested exception is java.lang.NullPointerException
Caused by: java.lang.NullPointerException
at notepad.NotesPanel.<init>(NotesPanel.java:23)
at notepad.Notepad.<init>(Notepad.java:18)
课堂记事本:
package notepad;
import java.awt.BorderLayout;
import java.awt.Dimension;
import javax.swing.JFrame;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Notepad
{
public Notepad()
{
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(new NotesPanel(), BorderLayout.CENTER);
frame.setPreferredSize(new Dimension(1024, 768));
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
frame.setLocationRelativeTo(null);
}
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
context.getBean("notepad");
}
}
课堂笔记:
package notepad;
import java.awt.BorderLayout;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import org.springframework.beans.factory.annotation.Autowired;
public class NotesPanel
extends JPanel
{
JTextPane tPane = new JTextPane();
@Autowired
private BackgroundGray backgroundgray;
public NotesPanel()
{
// backgroundgray = new BackgroundGray();
// backgroundgray.setGray("200");
setLayout(new BorderLayout());
tPane.setBackground(backgroundgray.getGrayObject());
add(tPane, BorderLayout.CENTER);
tPane.setText("Fill me with notes... ");
}
}
类背景灰色:
package notepad;
import java.awt.Color;
public class BackgroundGray
{
String gray;
public BackgroundGray()
{
System.out.println("Background Gray Constructor.");
}
public String getGray()
{
return gray;
}
public void setGray(String gray)
{
this.gray = gray;
}
public Color getGrayObject()
{
int val = Integer.parseInt(gray);
return new Color(val, val, val);
}
}
Beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<context:annotation-config />
<bean id="notepad" class="notepad.Notepad"/>
<bean id="backgroundgray" class="notepad.BackgroundGray" autowire="byName">
<property name="gray" value="120"></property>
</bean>
</beans>
【问题讨论】:
-
为了让 Spring 能够执行自动装配,您的实例必须由 Spring 管理。您也可以自动装配 NotesPanel。
-
new打破了DI和IoC的概念,使用bean factory 获取bean 实例,一切都应该没问题。