在Spring MVC中从Controller访问服务层的最佳方法是什么?我正在为SpringMVC使用注释。
之前我曾经通过在控制器的每个方法中调用ClassPathXMLApplicationContext(spring-bean-name.xml)来每次从bean工厂获取bean。
从问题Accessing Service Layer from custom Controller in Spring MVC的解决方案我明白服务bean必须自动装配。
但是假设控制器访问多个服务,我们是否必须注入多个bean?但这不是一个好的做法,因为我们只需要在控制器中的1-2个方法中使用特定的服务,并且不能使它成为类变量而不是函数变量。
答案 0 :(得分:3)
你是对的,你需要自动装配你想要使用的服务。不要担心类变量与局部(函数)变量,这就是DI模式的实现方式。
在最严格的OO设计意义上,您有一个观点,即您不应该在类级别声明变量,除非它们参与描述对象的状态。但是,DI(依赖注入)是一种非常成熟的模式,没有开发人员会将服务bean视为自动装配的类成员,无论实际使用该服务的方法有多少。
另一方面,在每种方法中执行new ClassPathXMLApplicationContext("spring-bean-name.xml")
绝对是100%错误的方法。这涉及到每次执行该方法时创建一个新的bean-factory和bean-context ,这是一个很大的开销,完全没必要。 bean工厂应该创建一次(如果你在servlet引擎环境中,使用DispatcherServlet或ContextLoaderListener)。
答案 1 :(得分:0)
你可以有一个静态类来实例化bean工厂,然后使用这个静态类的自定义静态getBean方法
static class SpringConfig()
{
private static ApplicationContext ctx = null;
static
{
ctx=new ClassPathXmlApplicationContext("context.xml");
}
public static Object getBean(String beanName)
{
return ctx.getBean(beanName);
}
}
答案 2 :(得分:0)
这就是为什么你必须尝试将所有使用相同依赖关系的方法保持在一起的原因,这是低耦合。不好的做法是不将依赖项注入全局变量。不好的做法是不对您的方法进行分组,以使您的课程更少耦合。