簡體   English   中英

將xml bean自動裝配到@Configuration類中

[英]Autowiring xml bean into @Configuration Class

我在Spring項目中的以下三個文件中通常使用xml配置:

applicationContext.xml:此文件包含主要的xml配置:組件掃描,注釋配置,還包括其他兩個xml配置文件:

applicationContext-db.xml此文件包含所有數據庫Bean:dataSource,SessionFactory,...

applicationContext-security.xml此文件包含所有spring安全配置。

我還需要使用Spring Security ACL,為此我創建了一個配置類:

AclMethodSecurityConfiguration.java

package com.medkhelifi.tutorials.todolist.conf;

/**
/* all imports goes here.
**/

@Configuration
@ImportResource({"classpath*:conf/applicationContext-db.xml"})
@EnableGlobalMethodSecurity (prePostEnabled = true, securedEnabled = true)
public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {

    @Autowired
    DataSource dataSource;

    @Bean
    public MethodSecurityExpressionHandler defaultMethodSecurityExpressionHandler() {
        DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
        AclPermissionEvaluator permissionEvaluator = new AclPermissionEvaluator(aclService());
        expressionHandler.setPermissionEvaluator(permissionEvaluator);
        return expressionHandler;
    }


    @Bean
    public JdbcMutableAclService aclService() {
        return new JdbcMutableAclService(dataSource, lookupStrategy(), aclCache());
    }

    @Bean
    public AclAuthorizationStrategy aclAuthorizationStrategy() {
        return new AclAuthorizationStrategyImpl(new SimpleGrantedAuthority("ROLE_ADMIN"));
    }


    @Bean
    public PermissionGrantingStrategy permissionGrantingStrategy() {
        return new DefaultPermissionGrantingStrategy(new ConsoleAuditLogger());
    }


    @Bean
    public EhCacheBasedAclCache aclCache() {
        return new EhCacheBasedAclCache(
                    aclEhCacheFactoryBean().getObject(),
                    permissionGrantingStrategy(),
                    aclAuthorizationStrategy()
                    );
    }

    @Bean
    public EhCacheFactoryBean aclEhCacheFactoryBean() {
        EhCacheFactoryBean ehCacheFactoryBean = new EhCacheFactoryBean();
        ehCacheFactoryBean.setCacheManager(aclCacheManager().getObject());
        ehCacheFactoryBean.setCacheName("aclCache");
        return ehCacheFactoryBean;
    }

    @Bean
    public EhCacheManagerFactoryBean aclCacheManager() {
        return new EhCacheManagerFactoryBean();
    }

    @Bean
    public LookupStrategy lookupStrategy() {
        return new BasicLookupStrategy(
                    dataSource,
                    aclCache(),
                    aclAuthorizationStrategy(),
                    new ConsoleAuditLogger());
    }
}

我的問題是自動連接到配置文件的數據源為空,如果我錯過了什么,我不會知道。

我的XML文件都位於:src / main / resources / conf /

在applicationContext-db.xml中有我的數據源bean定義

<!--        DATASOURCE                      -->
<bean name="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${database.driver}"/>
    <property name="url" value="${database.url}"/>
    <property name="username" value="${database.username}"/>
    <property name="password" value="${database.password}"/>
</bean>

我已經將此bean用作同一applicationContext-db.xml文件中定義的Sessionfactory bean。

PS:當我刪除擴展類GlobalMethodSecurityConfiguration我的數據源已定義,但是我需要這個org.springframework.security.config.annotation.method.configuration類來設置我的Spring Security ACL配置。

請將您的bean重命名為name="dataSource"

我找到了一種使用BeanFactoryAware接口定義數據源bean的方法。 BeanFactoryAware用於注入BeanFactory對象。 這樣,我們就可以訪問創建對象的BeanFactory。

@EnableGlobalMethodSecurity (prePostEnabled = true, securedEnabled = true)
@Configuration
@ImportResource({"classpath:/conf/applicationContext-db.xml"})
public class AclMethodSecurityConfiguration extends GlobalMethodSecurityConfiguration implements BeanFactoryAware {

    DataSource dataSource;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.dataSource = beanFactory.getBean("dataSource", DataSource.class);
    }
    // rest of code goes here 
}

我讀到,如果我們使用這項技術,那意味着我們做錯了事,我將繼續尋找合適的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM