spring 如何动态的获取bean
2012-05-16 11:07
218 查看
一般项目中如果配置了多个数据源那就需要动态的去得到别的数据源(不知道还有没有更好的办法)
先说下静态的方法
下面是动态的获取方法:
通过Spring提供的工具类获取ApplicationContext对象
上面两个工具方式的区别是,前者在获取失败时抛出异常,后者返回null。
通过Spring提供的工具类获取ApplicationContext对象 都需要一个ServletContext
我们通过ServletContextListener 来获取(当然它还有很多别的用处),它会监听Servlet容器,当应用开始的时候它会调用contextInitialized()方法;
当应用关闭的时候,它同样会调用contextDestroyed()方法.
还有要使用ServletContextListener 那么在wen.xml中必须要加listener
然后我们就可以得到ApplicationContext了
我这里是为了得到数据源 那就新建一个DBConnection类
然后在Dao层就可以得到Connection了
先说下静态的方法
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(); }
相关文章推荐
- Spring中如何获取和重置一个BeanFactory对象?或者说,如何动态修改Hibernate Configuration?
- Spring动态获取Bean
- spring接口 BeanFactoryAware,动态获取IOC容器里面的对象(多例)
- Spring动态获取IoC容器中管理的Bean
- Spring Boot如何动态创建Bean示例代码
- 如何在线程中获取spring 管理的bean
- 如何获取spring中存放的各个bean及设置某个bean的自动启动方法
- Spring中如何动态注入Bean实例教程
- @SpringContext通过实现ApplicationContextAware接口动态获取bean
- spring注解时,如何手工获取bean
- spring:如何用代码动态向容器中添加或移除Bean ?
- Spring中如何动态注入Bean实例教程
- spring利用扫描方式对bean的处理(对任何版本如何获取xml配置信息的处理)
- 如何手动获取Spring容器中的bean(ApplicationContextAware 接口)
- 解析Java中如何获取Spring中配置的bean
- [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间
- 如何在线程中获取spring 管理的bean
- Java中如何获取Spring中配置的bean
- 解析Java中如何获取Spring中配置的bean
- Spring+Servlet整合(如何向Servlet注入属性(转),servlet获取spring容器中的bean)