如何以编程方式创建 Spring 上下文?

2024-05-12

有谁知道是否有任何方法可以以编程方式创建 bean 上下文?

我希望能够做类似的事情:

ConfigurableApplicationContext c = new ConfigurableApplicationContext();
BeanDefinition bd = new BeanDefinition();
bd.setId("id");
bd.setClassName("classname");
bd.setProperty("propertyName", propertyValue");
...etc...

或者更好的是仍然能够将现成的 bean 注入到应用程序上下文中:

c.addBean("beanId", beanObject);

或者如果我使用注释:

c.setAnnotationAware(true);
c.setAnnotationScanBasePackage("packagename");

or

c.addAnnotatedSpringClass("classnamethatisannotated");

这样做的理由是,我希望能够出于测试目的覆盖 bean 定义 - 在我的测试中,我创建了这个新的应用程序上下文,并在测试中(而不是在 xml 中)配置了代码,然后使此测试应用程序上下文具有如下内容: SUT 应用程序上下文的父级。

我在 spring 库中没有找到任何可以执行此操作的代码。有人建造过这样的东西吗?有可能建造这样的东西吗?我知道前一种方法是可行的,我不能 100% 确定后一种方法会在没有条件的情况下起作用。


尝试以下任一方法:

  • Spring Java配置 http://static.springframework.org/spring-javaconfig/docs/1.0.0.M4/reference/html/
  • Grails BeanBuilder http://grails.org/Spring+Bean+Builder
  • new AtUnit http://atunit.googlecode.com/

JavaConfig 代码示例

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }
}

BeanBuilder 代码示例

def bb = new grails.spring.BeanBuilder()

bb.beans { 
  dataSource(BasicDataSource) { 
    driverClassName = "org.hsqldb.jdbcDriver" 
    url = "jdbc:hsqldb:mem:grailsDB" 
    username = "sa" 
    password = "" 
  } 

  sessionFactory(ConfigurableLocalSessionFactoryBean) { 
    dataSource = dataSource
    hibernateProperties = [ "hibernate.hbm2ddl.auto":"create-drop", "hibernate.show_sql":true ] 
  }   
}

AtUnit 代码示例

单元测试

@RunWith(AtUnit.class)
@Container(Container.Option.SPRING)
@MockFramework(MockFramework.Option.EASYMOCK)
public class ExampleSpringEasyMockTest {

    @Bean @Unit UserManagerImpl manager;
    @Bean("fred") User fred;
    @Bean("userDao") @Mock UserDao dao;
    @Bean("log") @Stub Logger log;

    @Test
    public void testGetUser() {
        expect(dao.load(1)).andReturn(fred);
        replay(dao);
        assertSame(fred, manager.getUser(1));
        verify(dao);
    }


}

上下文文件(测试专用)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

  <bean id="userManager" class="atunit.example.subjects.UserManagerImpl">
      <constructor-arg ref="log"/>
      <property name="userDao" ref="userDao"/>
  </bean>

  <bean id="fred" class="atunit.example.subjects.User">
      <property name="id" value="500"/>
      <property name="username" value="fred"/>
  </bean>

</beans>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式创建 Spring 上下文? 的相关文章

随机推荐