Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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 如何在其父类中处理@Autowire对象?_Java_Spring - Fatal编程技术网

Java 如何在其父类中处理@Autowire对象?

Java 如何在其父类中处理@Autowire对象?,java,spring,Java,Spring,我知道类似的问题以前在这里被问过很多次,但我仍然对这些机制感到困惑 这是我的问题。CategoryService中的CategoryDAO对象出现空指针异常 @服务 公共类类别服务{ @自动连线 私人分类道分类道; 公开名单(){ 列表类别=categoryDAO.List(); 用于(类别:类别){ List rs=recordDAO.List(category.getID()); 类别.setRecordNumber(rs.size()); } 退货类别; } 公共无效添加(字符串名称){

我知道类似的问题以前在这里被问过很多次,但我仍然对这些机制感到困惑

这是我的问题。
CategoryService
中的
CategoryDAO
对象出现空指针异常

@服务
公共类类别服务{
@自动连线
私人分类道分类道;
公开名单(){
列表类别=categoryDAO.List();
用于(类别:类别){
List rs=recordDAO.List(category.getID());
类别.setRecordNumber(rs.size());
}
退货类别;
}
公共无效添加(字符串名称){
类别newCategory=新类别();
newCategory.setName(名称);
categoryDAO.add(新类别);
}
}
@存储库
公共类{
@自动连线
私有SqlSessionFactory SqlSessionFactory;
公共int getTotal(){
SqlSession SqlSession=sqlSessionFactory.openSession();
列表类别=sqlSession.selectList(“category.selectAll”);
返回类别。大小();
}
}
在这个和中,两个最重要的答案都提到
最可取的选择是让Spring自动连接所有bean
。 这是否意味着一旦需要,我还必须在其他类中自动连接
类别服务
?这意味着如果类包含自动连线对象,我不能使用
new
操作符初始化该类? 如果是,你能解释一下原因吗

谢谢

更新

下面是一个关于使用autowired类
CategoryService
的示例:

public class RecordListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        RecordPanel panel = RecordPanel.getInstance();
        if (new CategoryService().list().size() == 0){
            JOptionPane.showMessageDialog(panel, "NO category is recorded, set category first");
            MainPanel.getInstance().getPanel().display(CategoryPanel.getInstance());
            return;
        }
}
CategoryService
用于
newcategoryservice().list().size()==0
。如果我在这里将其自动关联为该类的属性,那么一旦我需要它,该类也需要被注入。我想避免这种情况,这样事情就容易多了。如何实现这一点?

这是否意味着一旦需要,我还必须在其他类中自动连接CategoryService? 对

这意味着如果一个类包含自动连线对象,我不能使用new操作符初始化它? 对

@Autowire
注释允许您使用依赖项注入。这是一种技术(实际上是一种良好的实践),它使更改应用程序中用于接口的实现变得非常容易。您定义了bean/组件/服务,每当您在属性或构造函数参数上使用
@Autowire
注释时,这些bean/组件/服务将被注入。 您不必在所有代码中都使用
new
,只需声明哪个具体类应用于带有
@Autowire
注释的接口(或者可能是类本身)。 假设您创建了一个接口
RemoteAccess
和一个实现
FtpRemoteAccess
,然后每次需要时都编写
RemoteAccess RemoteAccess=new FtpRemoteAccess()
过一段时间,你可能会在几个地方看到这条线。现在,如果您需要将其更改为
HttpRemoteAccess
,因为您有了这个新的、更好的替代方案,那么您必须检查所有的代码库。相反,如果您使用依赖项注入,您只需更改bean(使用Spring有多种方法可以做到这一点)。 为了让所有这些都起作用,Spring必须能够注入bean的所有依赖项。如果您创建一个bean,它的所有属性也必须被注入,因为Spring将为您创建该对象

澄清:

在bean内部(即,您将被注入的类),您可以使用有意义的新对象创建对象,只要这些对象不是注入类型。您已经在
CategoryService::add()
中完成了这项工作,现在一切正常。依赖注入并不意味着您将永远不再编写
new
。对于将由Spring依赖项注入管理的对象,您只需避免它。 然后,还有其他一些好的实践不鼓励使用
new
,比如静态工厂方法,它建议在类中放置一个静态方法来构建完整的对象,并允许构造函数是私有的。但是你不需要一直应用所有的模式

更新:

对于
RecordListener
类,必须添加
CategoryService
属性,然后确保它已初始化。有两个选项:您可以在bean本身中转换
RecordListener
,并将其自动连接到需要的地方。通过这种方式,Spring将构造一个用于注入它的
RecordListener
对象,并将添加所需的任何其他bean(如
CategoryService


另一个选项是在当前创建
RecordListener
的类中插入
CategoryService
,然后将其作为构造函数参数传递。在这种情况下,
RecordListener
将不是一个bean。

谢谢您的解释。你能告诉我如何处理本地对象吗?因为@Autowire不能应用于局部变量,并且不能通过
new
操作符创建它们。我是否必须始终使用
ApplicationContext
?在上面添加了一个说明,因为它太长,无法进行评论。感谢您的额外说明。我尝试使用不同的模式来处理本地对象,但是
CategoryService
仍然被分配了null。你能看看我更新的内容并给我一些详细的建议吗?@chaos你的类
CategoryService
由Spring injection管理。记住不要在托管类上使用
new
。您不想编写
新CategoryService().list().size()
。相反,您必须添加一个
私有CategoryService CategoryService@Autowire
注释的code>属性。如果该类也是由Spring创建的,您可以提供
@Component
public class RecordListener implements ActionListener {

    @Autowire
    private CategoryService categoryService;

    @Override
    public void actionPerformed(ActionEvent e) {
        RecordPanel panel = RecordPanel.getInstance();
        if (categoryService.list().size() == 0) {
            JOptionPane.showMessageDialog(panel, "NO category is recorded, set category first");
            MainPanel.getInstance().getPanel().display(CategoryPanel.getInstance());
            return;
        }
    }
}