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

spring 如何动态的获取bean

2012-05-16 11:07 218 查看
一般项目中如果配置了多个数据源那就需要动态的去得到别的数据源(不知道还有没有更好的办法)

先说下静态的方法

ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");
BasicDataSource bds = (BasicDataSource) cxt.getBean("dataSource");
System.out.println(bds.getConnection());
这个是静态的去得到bean!

下面是动态的获取方法:

通过Spring提供的工具类获取ApplicationContext对象

import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)
ac1.getBean("beanId");
ac2.getBean("beanId");


上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
通过Spring提供的工具类获取ApplicationContext对象 都需要一个ServletContext

我们通过ServletContextListener 来获取(当然它还有很多别的用处),它会监听Servlet容器,当应用开始的时候它会调用contextInitialized()方法;

当应用关闭的时候,它同样会调用contextDestroyed()方法.

package com.yeshun.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

public class StartupListener implements ServletContextListener {
protected final Log logger = LogFactory.getLog(this.getClass());

public void contextDestroyed(ServletContextEvent arg0) {

}

private static ApplicationContext springContext = null;

public static ApplicationContext getContext(){
return springContext;
}

public void contextInitialized(ServletContextEvent arg0) {
ServletContext context = arg0.getServletContext();

springContext = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext());
if(springContext==null){
logger.error("......Get SpringContext Result Is Null......");
}else{
//you can do something
System.out.println("========:"+context.getRealPath("/"));
}

}
}


还有要使用ServletContextListener 那么在wen.xml中必须要加listener
<!-- 处理Web应用的 servlet上下文(context)的变化的通知 -->
<listener>
<listener-class>com.yeshun.listener.StartupListener</listener-class>
</listener>


然后我们就可以得到ApplicationContext了
ApplicationContext applicationContext  =  StartupListener.getContext();


我这里是为了得到数据源 那就新建一个DBConnection类

package com.yeshun.util;

import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.yeshun.listener.StartupListener;

public class DBConnection {

public Connection getConnection(String dataSoure) throws SQLException {
ApplicationContext applicationContext  =  StartupListener.getContext();
BasicDataSource bds = (BasicDataSource) applicationContext.getBean(dataSoure);
return bds.getConnection();
}

public static void main(String[] args) throws SQLException {
//              注意在main方法中这样是得不到的
//		DBConnection dbcennect = new DBConnection();
//		Connection conn =  dbcennect.getConnection("dataSource") ;
//		System.out.println(conn);

ApplicationContext cxt = new ClassPathXmlApplicationContext("applicationContext.xml");
BasicDataSource bds = (BasicDataSource) cxt.getBean("dataSource");
System.out.println(bds.getConnection());
}
}


然后在Dao层就可以得到Connection了
DBConnection db = new DBConnection();
try {
Connection cn = db.getConnection("dataSource");
System.out.println(cn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐