spring 在web环境 中 加载 bean 配置文件方式的选择

bluechant 发布于 2011/05/12 19:16
阅读 3K+
收藏 4

【华为云1024程序员节·向云而生】预约直播 抽14件华为电子产品礼包!>>>

spring在web环境中,java代码里需要得到ApplicationContext; 根据前期配置的不同,有两种方式:

(1)spring加载放到web.xml中配置:

     <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    则得到ApplicationContext用如下方式:

    ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(Servlet Context);

    java代码中调用 ctx.getBean(String beanId);

(2) 直接声明:

public class BeanManager {
    private static ApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml") ;

    public static Object getBean(String beanId) {
        return context.getBean(beanId);
    }
}

 在web.xml中写一个servlet,自动启动,init方法中调用一下BeanManager

  init()  throws ServletException {

       BeanManager bm = new BeanManager();//可选的,为的是在web应用启动的时候就让spring加载bean配置。

    // 否则会在第一次调用BeanManager的时候加载,影响一次速度。

}

  在java代码中使用 BeanManager.getBean(String beanId); 来获得bean实例。

  优缺点分析:

  第一种方式不利于需要在web容器下进行,不利于测试;

  第二种方法与web容器无关,单元测试方便;

 问题:

    请问各位在项目中,更多应用那一种方式在创建 spring 容器。原因是什么,有时间的仁兄麻烦给分析一下优缺点。

加载中
0
programtic
programtic

用第一种配置spring 容器,用注解的方式配置bean。

0
bluechant
bluechant

给详细论论呗。

0
puras
puras

用的是直接Listener加载Bean的配置文件实例化类,但是获取ApplicationContext的时候,方式不太一样。

0
DreamWorker
DreamWorker

其实我更喜欢用Annotation。如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:/spring-core.xml")
public class UserServiceTest{
    @Resource
    UserService service;
   
    /**
     * 保存测试
     */
    @Test
    public void testSave(){
        User user = new User();
        service.save(user);
    }

}

0
lxbzmy
lxbzmy

用第一种,再用5楼的方法做测试。

0
bluechant
bluechant

受教了。那请问,为何倾向使用第一种方式,有何原因么?第二种方式有何缺陷?

0
DreamWorker
DreamWorker

如果是测试与serverlet无关的功能就没必要启动web容器了吧,也就不需要自己再配一个serverlet。 看你的具体需求来定,不是一陈不变的

0
bluechant
bluechant

引用来自#8楼“DreamWorker”的帖子

如果是测试与serverlet无关的功能就没必要启动web容器了吧,也就不需要自己再配一个serverlet。 看你的具体需求来定,不是一陈不变的

如果是第二种方法实现,那么就不需要启动web容器了,但如果用第一种listener方式,那么要获得spring ioc容器的引用,就必须启动web容器(spring2.5x),没用过5楼所说的那种基于注解的测试驱动方式。回头研究一下。

要测试的内容很可能需要spring ioc 的支持。故与你说的servlet没有直接关系。

0
DreamWorker
DreamWorker

引用来自#9楼“bluechant”的帖子

引用来自#8楼“DreamWorker”的帖子

如果是测试与serverlet无关的功能就没必要启动web容器了吧,也就不需要自己再配一个serverlet。 看你的具体需求来定,不是一陈不变的

如果是第二种方法实现,那么就不需要启动web容器了,但如果用第一种listener方式,那么要获得spring ioc容器的引用,就必须启动web容器(spring2.5x),没用过5楼所说的那种基于注解的测试驱动方式。回头研究一下。

要测试的内容很可能需要spring ioc 的支持。故与你说的servlet没有直接关系。

Spring可以不用和WEB集成的,我没说要用第一种方式注册Listener。只要一个spring的配置文件即可。

返回顶部
顶部