我在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配置。
答案 0 :(得分:0)
请将您的bean重命名为name="dataSource"
答案 1 :(得分:0)
我找到了一种使用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
}
我读到,如果我们使用这种技术,那意味着我们做错了事,我将继续寻找合适的解决方案。