当前位置: 首页 > 知识库问答 >
问题:

将DAO自动连接到服务中

有耀
2023-03-14
@Autowired
Movie movieDao;

单靠它是行不通的,因为我认为会调用new方法,所以DAO不是由Spring管理的。下面的方法确实起作用,但是如果我必须将上下文配置复制并粘贴到每个方法中,那么看起来会很混乱

    @Autowired
    MovieDao movieDao;

    @Override
    public List<Movie> findAll() {
        GenericXmlApplicationContext context = new GenericXmlApplicationContext();
        context.load("classpath:app-context.xml");
        context.refresh();
        MovieDao movieDao = (MovieDao) context.getBean("movieDao", MovieDao.class);
        return movieDao.findAll();
    }

这段代码在我的服务类中。有没有更优雅的方法来确保我的DAO被正确初始化,而不是复制和粘贴那个方法的前4行到每个服务方法中?

共有1个答案

吕永寿
2023-03-14

我认为主要问题是您希望直接(使用new)实例化您的服务,而不是使用Spring:

MovieService movieService = new MovieServiceImpl();

当您执行此操作时,您的MovieServiceImpl实例将被构造,但未初始化(字段@Autowired MovieDaoNull)。

如果您想用字段注入正确地实例化您的对象,您需要使用Spring。正如文档中或本例中所解释的,您可以自动检测所有带注释的bean,并通过组件扫描在上下文中初始化它们。

<?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.xsd">

    <!-- Use component scanning to auto-discover your beans (by annotation) and initialize them -->
    <context:component-scan base-package="com.se325.a01" />

    <!-- No need to declare manually your beans, because beans are auto-discovered thanks to <context:component-scan/> -->

</beans>
package com.se325.a01;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.se325.a01.model.Movie;
import com.se325.a01.service.MovieService;

public class App {
    public static void main(String[] args) {
        // Let's create the Spring context based on your app-context.xml
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"app-context.xml"});
        // Now your context is ready. All beans are initialised.
        // You can retrieve and use your MovieService
        MovieService movieService = context.getBean("movieService");

        Movie matrixMovie = new Movie("Matrix");
        movieService.create(matrixMovie);
    }
}
    null
 类似资料:
  • 我正在使用C#开发简单的minecraft启动器。我想自动连接用户到我们的服务器使用IP地址和端口时,用户开始我的世界。

  • 我正试图通过AnyLogic 7.3.6连接到本地SQL数据库。我安装了SQL Server 2016 Developer,数据库采用混合身份验证(Windows) 网络错误IOException:连接被拒绝:连接 拒绝连接:连接 我的主机名为。我曾尝试将登录名和密码留空,希望Windows身份验证,并尝试将SQL用户(Test,Test)添加到服务器,两者的结果相同。我正在使用JDBC驱动程序,

  • 我已经在Ubuntu14.04上安装并启动了nginx服务器。我的目标是使用HLS(http live streaming)流媒体视频(live)。我遵循了本教程https://www.vultr.com/docs/setup-nginx-on-ubuntu-to-stream-live-hls-video,它推荐使用OBS-Studio。然而,我不知道如何从OBS-STUDIO流到Nginx,然

  • 我使用Sabre DAV在PHP中实现了一个webdav目录,用于我的网站(Application Server Webinterface)。 对于这个网站,我现在使用C#编写了一个TCP套接字,它运行在另一个服务器上(实际上它在同一个数据中心,但从理论上讲,它在另一个半球上)。 我想连接我的网络Dav到我的套接字的FTP服务器,这意味着文件监听,下载,上传。用户只能连接到一个服务。想象一下,我的

  • 我正在尝试为我的dao类自带一个sessionfactory,但它不起作用 这也是我的服务班 请在这方面提供一点帮助。我已经浪费了一整天的时间来寻找解决办法。提前致谢

  • 我正在尝试使用自定义身份验证提供程序配置Spring Security性。但是,我想在服务中自动装配以处理实际的数据库身份验证。我已经验证它在没有这个自动装配bean的情况下工作(只是在提供程序中硬编码)。我也在使用SpringMVC与hibernate结合使用。我目前正在使用根配置(hibernate等)和webMVC使用java注释和Spring使用xml进行混合方法。我知道这是不赞成的,但我