zoukankan      html  css  js  c++  java
  • 在Servlet中获取Spring注解的bean

    最近由于项目中出现了Servlet调用Spring的bean,由于整个项目中所有的bean均是注解方式完成,如@Service,@Repository,@Resource等,但是Spring的容器管理是不识别Servlet和filter的,所以无法使用注解方式引用,在网上查了资料后看到如下的代码:
    第一种方式:在Servlet的init方法中来完成bean的实例化,初始化后可以在servlet中调用bean中的方法

    WebApplicationContext cont = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); 
    ts=(TestService)cont.getBean("testService")//ts为已经声明的类变量,括号内的名字默认为bean的类名,第一个字母小写,也可以设置唯一名称,如@Service(value="testService")

    第二种方式:直接在Servlet的doPost方法中获取,代码如下

    WebApplicationContext cont = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());

    不过在我的项目中使用上面任何一种都无法得到任何bean,原因是上面的两种方式只对xml配置的bean有效,无法获取到注解的bean,最后在网上看到一篇关于“Spring对注解(Annotation)处理源码分析——扫描和读取Bean定义”的文章,才终于解决了这个问题,代码如下:
    代码1:Service接口

    package com.test.web.service;
    
    public interface ITestService {
    public void test();//测试方法
    }

    代码2:实现接口并使用注解方式

    package com.test.web.service.impl;
    
    import org.springframework.stereotype.Service;
    
    import com.taokejh.web.test.ITestService;
    //此处的注解部分可以给出唯一名称,如@Service(value="testServiceImpl"),等同于xml配置中bean的id
    @Service
    public class TestServiceImpl implements ITestService {
    
    @Override
    public void test() {
    System.out.println("测试打印");
    }
    
    }

    代码3:在Servlet中获取注解的bean并调用其测试方法

    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(); 
    ctx.scan("com.test.web.service.*"); 
    ctx.refresh(); 
    TestServiceImpl service = ctx.getBean(TestServiceImpl.class);//此处也可以使用ctx.getBean("testServiceImpl") 
    service.test();

    这样就可以在Servlet或者filter中调用Spring注解方式的bean,其实整个过程就是模拟了SpringMVC在初始化的时候扫描组件包后完成对所有bean的注册并存放至管理容器中。如果大家有更好的解决办法,希望不吝赐教!

  • 相关阅读:
    快速幂模板
    部分有关素数的题
    POJ 3624 Charm Bracelet (01背包)
    51Nod 1085 背包问题 (01背包)
    POJ 1789 Truck History (Kruskal 最小生成树)
    HDU 1996 汉诺塔VI
    HDU 2511 汉诺塔X
    HDU 2175 汉诺塔IX (递推)
    HDU 2077 汉诺塔IV (递推)
    HDU 2064 汉诺塔III (递推)
  • 原文地址:https://www.cnblogs.com/google4y/p/3396139.html
Copyright © 2011-2022 走看看