【问题标题】:Better way to define a beans in class in spring在春季类中定义 bean 的更好方法
【发布时间】:2016-03-02 12:13:32
【问题描述】:

在 spring 4 应用程序中,我创建了两个 bean,如下所示:

    <!-- schemaFactory-->
    <bean id="schemaFact" class="javax.xml.validation.SchemaFactory"
        factory-method="newInstance">
        <constructor-arg value="http://www.w3.org/2001/XMLSchema" />
    </bean>

  <!-- schema -->
    <bean id="schema" class="javax.xml.validation.Schema"
        factory-bean="schemaFact" factory-method="newSchema">
        <constructor-arg value="classpath:/configs/sample.xsd" />
    </bean>

一个生成模式工厂,另一个使用工厂(针对 xsd 验证 xml)。

在代码中:

public class example {

    @Inject
    private Schema aschema;
    ......

   private validate(){
       Validator validator = aschema.newValidator();
       validator.validate(xmlFile); 
 }

}

这很好用,但我想知道是否可以以我们不需要单独定义工厂 bean 的方式编写这个 spring.xml(并且最后有一个更简单的 spring.xml)。如您所见,我只需要将schema bean 注入到我的example 类中,而schemaFact 则根本不需要。

【问题讨论】:

  • 为什么不使用 Java 配置并删除 XML?

标签: java spring javabeans spring-4


【解决方案1】:

无论您是否直接使用它们,注入良好的依赖项都必须对 spring bean 进行。

因此,即使您没有直接在代码中使用SchemaFactory,而是将其作为依赖项注入另一个 Spring bean,两者都必须是 Spring 托管 bean

你可以考虑使用注解然后你根本不需要spring文件。

【讨论】:

    【解决方案2】:

    这是一些在 java 类中创建 bean 的示例代码。可以在这里创建任何 bean 并在相关类中自动连接。

    这个注释给了我们很大的支持ex- @Configuration

    import java.util.Properties;
    import javax.persistence.SharedCacheMode;
    
    import........
    
    @Configuration
    @ComponentScan(basePackages = {"<package>"})
    @EnableTransactionManagement
    @PropertySources(value = {@PropertySource(value = {"<property file path>"})})
    public class ModulesConfig {
    
        private static final Logger log = LoggerFactory.getLogger(ModulesConfig.class);
    
        @Autowired
        private Environment environment;
    
        @Bean(destroyMethod = "close")
        public BoneCPDataSource getDataSource() {
            BoneCPDataSource dataSource = new BoneCPDataSource();
            dataSource.setDriverClass(environment.getProperty("database.driver"));
            dataSource.setJdbcUrl(environment.getProperty("database.url"));
            dataSource.setUsername(environment.getProperty("database.username"));
            dataSource.setPassword(environment.getProperty("database.password"));
            dataSource.setIdleConnectionTestPeriodInMinutes(30);
            dataSource.setMaxConnectionsPerPartition(5);
            dataSource.setMinConnectionsPerPartition(2);
            dataSource.setPartitionCount(3);
            dataSource.setAcquireIncrement(2);
            dataSource.setStatementsCacheSize(100);
    
            return dataSource;
        }
    
        @Bean
        @Primary
        public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    
            Properties jpaProperties = new Properties();
            jpaProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");
            jpaProperties.setProperty("hibernate.showSql", "false");
    
            LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
            em.setDataSource(getDataSource());
            em.setPersistenceUnitName("entityManagerFactory");
            em.setPackagesToScan("<packages>");
            em.setJpaVendorAdapter(vendorAdapter);
            em.setJpaProperties(jpaProperties);
            em.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
    
            return em;
        }
    
        @Bean(name = "transactionManager1")
        @Primary
        public JpaTransactionManager getTransactionManager() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    
            return transactionManager;
        }
    
        @Bean(name = "transactionManager2")
        public JpaTransactionManager getTransactionManager2() {
            JpaTransactionManager transactionManager = new JpaTransactionManager();
            transactionManager.setEntityManagerFactory(entityManagerFactory2().getObject());
    
            return transactionManager;
        }
    
        @Bean
        @Qualifier("VoucherServiceMarshaller")
        public Jaxb2Marshaller getVoucherServiceMarshaller() {
            Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
            marshaller.setContextPath(environment.getProperty("voucher.service.marshaller.contextPath"));
    
            return marshaller;
        }
    
        @Bean
        @Qualifier("VoucherServiceTemplate")
        public WebServiceTemplate getVoucherServiceTemplate() {
            WebServiceTemplate template = new WebServiceTemplate(getVoucherServiceMarshaller());
            template.setDefaultUri(environment.getProperty("voucher.service.defaultUri"));
    
            return template;
        }
    
        @Bean
        public VoucherServiceProxy getVoucherServiceProxy() {
            VoucherServiceProxy voucherServiceProxy = new VoucherServiceProxy();
    
            return voucherServiceProxy;
        }
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
            messageSource.setBasename("classpath:messages");
            messageSource.setDefaultEncoding("UTF-8");
    
            return messageSource;
        }
    
        @Bean
            public JavaMailSender javaMailSender() {
                JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
                Properties mailProperties = new Properties();
    
                mailProperties.put("mail.smtp.host", environment.getProperty("mail.smtp.host"));
                mailProperties.put("mail.smtp.socketFactory.port", environment.getProperty("mail.smtp.socketFactory.port"));
                mailProperties.put("mail.smtp.socketFactory.class", environment.getProperty("mail.smtp.socketFactory.class"));
                mailProperties.put("mail.smtp.auth", environment.getProperty("mail.smtp.auth"));
    
                mailSender.setJavaMailProperties(mailProperties);
    
                mailSender.setUsername(environment.getProperty("mail.username"));
                mailSender.setPassword(environment.getProperty("mail.password"));
    
                return mailSender;
            }
    
    
        @Bean
        public ChargingGatewayServiceProxy getChargingGatewayServiceProxy() {
            ChargingGatewayServiceProxy chargingGatewayServiceProxy = new ChargingGatewayServiceProxy();
    
            return chargingGatewayServiceProxy;
        }
    
        @Bean
        @Qualifier("ChargingGatewayServiceMarshaller")
        public Jaxb2Marshaller getChargingGatewayServiceMarshaller() {
            Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
            marshaller.setContextPath(environment.getProperty("cg.service.marshaller.contextPath1"));
    
            return marshaller;
        }
    
        @Bean
        @Qualifier("ChargingGatewayServiceTemplate")
        public WebServiceTemplate getChargingGatewayServiceTemplate() {
            WebServiceTemplate template = new WebServiceTemplate(getChargingGatewayServiceMarshaller());
            template.setDefaultUri(environment.getProperty("cg.service.url"));
            template.setMessageSender(getMessageSender());
    
            return template;
        }
    
        @Bean
        public HttpComponentsMessageSender getMessageSender() {
            HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
            httpComponentsMessageSender.setConnectionTimeout(Integer.parseInt(environment.getProperty("cg.connection.timeout")));
            httpComponentsMessageSender.setReadTimeout(Integer.parseInt(environment.getProperty("cg.read.timeout")));
    
            return  httpComponentsMessageSender;
        }
    
        @Bean
        public RestTemplate restTemplate() {
            return new RestTemplate(clientHttpRequestFactory());
        }
    
        private ClientHttpRequestFactory clientHttpRequestFactory() {
            HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
            factory.setReadTimeout(50000);
            factory.setConnectTimeout(50000);
            return factory;
        }
    
        @Bean
        public Cache cacheTemp() {
            net.sf.ehcache.CacheManager cm = net.sf.ehcache.CacheManager.create().getInstance();
    
            cm.addCache("cacheTemp");
            Cache cache = cm.getCache("cacheTemp");
    
            return cache;
        }
    
        @Bean
        public Cache cacheActive() {
            net.sf.ehcache.CacheManager cm = net.sf.ehcache.CacheManager.create().getInstance();
    
            cm.addCache("cacheActive");
            Cache cache = cm.getCache("cacheActive");
    
            return cache;
        }
    
        @Bean
        public Cache cache() {
            net.sf.ehcache.CacheManager cm = net.sf.ehcache.CacheManager.create().getInstance();
    
            cm.addCache("cache");
            Cache cache = cm.getCache("cache");
    
            return cache;
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2013-11-29
      相关资源
      最近更新 更多