Spring容器动态注入bean

来源:互联网 发布:it公司 编辑:程序博客网 时间:2024/06/06 03:13

以往向Spring中注入bean实例都是通过配置文件的方式,如果容器已经启动配置文件已经解析,那我们也只能手动的用代码方式来完成实例Bean的注入。

<bean id="xxxx" class="xxxxxxx.xxxxx"/>

Spring上下文对象的获取方式

//Spring上下文

ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());

//Spring mvc上下文

//ApplicationContext sac = RequestContextUtils.getWebApplicationContext(request);


实例操作

@RequestMapping(value="regbean.do")    public void regBean(HttpServletRequest request){        ApplicationContext ac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());        ConfigurableApplicationContext context = (ConfigurableApplicationContext) ac;         //Bean的实例工厂        DefaultListableBeanFactory dbf = (DefaultListableBeanFactory) context.getBeanFactory();        //Bean构建  BeanService.class 要创建的Bean的Class对象        BeanDefinitionBuilder dataSourceBuider = BeanDefinitionBuilder. genericBeanDefinition(BeanService.class);        //向里面的属性注入值,提供get set方法        dataSourceBuider.addPropertyValue("msg", "hello ");        //dataSourceBuider.setParentName("");  同配置 parent        //dataSourceBuider.setScope("");   同配置 scope        //将实例注册spring容器中   bs 等同于  id配置        dbf.registerBeanDefinition("bs", dataSourceBuider.getBeanDefinition());               //注要使用刚注册的 必须通过   getBean("xx")的方式        //这种方式还多用于在过滤器中获取容器对象,因为spring不能为过滤器注入任何属性    } BeanService.classpublic class BeanService  {    private String msg;    public String getMsg() {        return msg;    }    public void setMsg(String msg) {        this.msg = msg;    }    public void say(){        System.out.println("====="+msg);    }    }
============下面是注册多个DataSource SessionFactory的过程===========

//datasource注册。下面的一些配置可以持久化到别的地方,任意更具需求来。//在通过此方法就可以创建多个datasourc和sessionfactory然后动态切换。多个数据库之间必须启用全局事物配置 //创建的时候 先判断是否存在 ,ac1.containsBean("xx")  //<span style="font-family: Arial;">ComboPooledDataSource.class 这个是c3p0的datasource</span>        BeanDefinitionBuilder dataSourceBuider = BeanDefinitionBuilder .genericBeanDefinition(ComboPooledDataSource.class);        dataSourceBuider.addPropertyValue("driverClass", "oracle.jdbc.OracleDriver");        dataSourceBuider.addPropertyValue("jdbcUrl", "jdbc:oracle:thin:@192.168.1.95:1521:orcl");        dataSourceBuider.addPropertyValue("user","oracle");        dataSourceBuider.addPropertyValue("password","oracle");        dbf.registerBeanDefinition("datasource3", dataSourceBuider.getBeanDefinition());               //LocalSessionFactoryBean注册,注册时候在获取结果不再是它本身而是sessionFactory        BeanDefinitionBuilder llfb = BeanDefinitionBuilder .genericBeanDefinition(LocalSessionFactoryBean.class);        //这里的属性对应配置文件或者LocalSessionFactoryBean源码中的属性来,自己去看看就晓得        llfb.addPropertyValue("dataSource", (DataSource)ac1.getBean("datasource3"));        //mappingResources 是配置文件方式,下面的是注解的方式        llfb.addPropertyValue("annotatedClasses", new Class<?>[]{com.lwp.entity.T.class});        Properties p = new Properties();        p.setProperty("hibernate.show_sql", "true");        p.setProperty("hibernate.format_sql", "true");        p.setProperty("hibernate.dialect", "org.hibernate.dialect.OracleDialect");        llfb.addPropertyValue("hibernateProperties",p);        dbf.registerBeanDefinition("lsf", llfb.getBeanDefinition());

这里获取上面刚注册的LocalSessionFactoryBean,结果是SessionFactory类对象不再是它本身类型。会默认调用里面的getObject()

SessionFactory sf2 = (SessionFactory)ac1.getBean("lsf");



0 0
原创粉丝点击