您的位置:首页 > 编程语言 > Java开发

怎么在类中调用spring web容器中定义得bean

2008-09-27 15:26 246 查看
最近使用spring web框架作项目,很是喜欢spring web优雅得框架风格。

如果你得bo类全部是在controller中调用,一切都很简单,唯一需要补充得是象struts得AbstractMultiActionFormController简单得多请求得controller,也可能是我用struts用得太习惯了,还没有转变思想,不过这样得好处是防止controller类得扩散。

今天准备写个简化得portal应用,这样再页面展示portlet模块时,准备采用tag来加载数据,tag中要调用bo中得方法,bo又调用dao得方法,这样就脱离了spring web得DispatcherServlet得体系。

记得以前看过spring得资料,它得DI容器,是有层次关系得,常识告诉我们,它一定会在DispatcherServlet启动得时候,把这个di类加载到servletContext中,于是按照网上流行得做法

ApplicationContext ctx = null;
if (ctx == null)
{
ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(servlet.getServletContext());
}
return ctx.getBean(name);

发现那不到在*-servlet.xml中定义得bean ,猜想肯定这种写法只能到到最顶级得di中定义得bean,也就是applicationContext.xml中定义得bean,为了拿到spring web中di得bean ,没办法,看代码,找到DispatcherServlet类,由于我是用记事本看代码,猜想肯定是放到了servletContext中,并且肯定是ApplicationContext 得对象,这种事情,肯定是在init方法里作得了,首先看这个方法。并没有看到想看到得代码,但是看到initStrategies(ApplicationContext context)使作为参数传进来得,于是看它得父类FrameworkServlet

也使看init得方法initServletBean

发现String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);得代码,可以看出关键字是org.springframework.web.servlet.FrameworkServlet.CONTEXT.加servlet得名字,在我这里是wingsite

哦~这下可以测试了

WebApplicationContext wac = (WebApplicationContext)pageContext.getServletContext().getAttribute("org.springframework.web.servlet.FrameworkServlet.CONTEXT.wingsite");
net.wingsite.sysadmin.service.UserManager userManager = (net.wingsite.sysadmin.service.UserManager)wac.getBean("userManager");

成功获得想要得bean,为了防止下次重复看代码,记录下来,

当然还有更简单得方式

ClassPathResource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource); 但是这样就自己构造了factroy对象,虽然能达到目的,但是浪费了很多资源,而且同一个项目维护了2个体系得spring DI
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: