【问题标题】:How to autowire a bean into a 2 different controllers (Spring)如何将 bean 自动装配到 2 个不同的控制器中(Spring)
【发布时间】:2020-01-30 11:38:23
【问题描述】:

我正在学习 spring,但我遇到了一个不知道如何解决的问题。

@Service
@Transactional
public class SchoolService {

   @Autowired
   private CourseDao courseDao;
   @Autowired
   private EducationDao educationDao;
   @Autowired
   private StudentDao studentDao;
   @Autowired
   private TeacherDao teacherDao;
   @Autowired
   private StatisticsDao statisticsDao;


............
}

这段代码将我的 DAOS 注入到这个服务类中,但是我需要将上面的类注入到两个控制器中。 我尝试过的一种方法是使用此代码,但这不起作用。

    @Autowired
    SchoolService sm;

我如何将它注入我的控制器类。我尝试将控制器类设为 @Component 但似乎没有任何效果。

ClassPathXmlApplicationContext container = new ClassPathXmlApplicationContext("application.xml");

SchoolService sm = container.getBean(SchoolService.class);

这种方式可行,但我不想每次想要获取该 bean 时都创建一个新的应用程序上下文。

是的,我现在正在使用 xml,请不要开枪:D 谢谢。

【问题讨论】:

  • 只需在 SchoolService sm 之前设置@Autowired;你完成了吗?
  • 我试过了,但我的 SchoolService 类只是空,我不知道为什么我的 DAOS 自动连接到我的 SchoolService 类但我的控制器类没有自动连接 SchoolService

标签: java spring dependency-injection


【解决方案1】:

尝试在 application.xml 文件中创建控制器 bean,而不是注释控制器。

【讨论】:

  • 我会试试的!谢谢。
【解决方案2】:

由于这显然是一个教育问题,所以我会尽力提供非常详细的答案:

曾经关于 spring 的基本事情是,所有的自动装配魔法只发生在由 spring 管理的 bean 上。

所以:

  • 您的控制器必须由 spring 管理
  • 你的服务必须由 spring 管理
  • 您的 DAO 必须由 spring 管理

否则,自动装配不起作用,我不能再强调了。

现在,将应用程序上下文视为所有 bean 的一个全局注册表。默认情况下,bean 是单例(spring 中的单例范围),这意味着在应用程序上下文中“保留”了该 bean 的一个对象(实例)。

自动装配的行为基本上意味着 bean(由 spring 管理) - 在您的情况下,控制器具有 spring 可以通过查看全局注册表、获取匹配的 bean 并设置到 @987654321 所在的数据字段来注入的依赖项@注解被调用。

所以,如果你有两个控制器(同样,都是由 spring 管理的),你可以:

@Controller
public class ControllerA {
   @Autowired
   private SchoolService sm;
}


@Controller
public class ControllerB {
   @Autowired
   private SchoolService sm;
}

在这种情况下,学校服务的同一个实例将被注入到两个不同的控制器中,所以你应该好好去。

【讨论】:

    猜你喜欢
    • 2015-12-23
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多