当前位置: 首页 > 知识库问答 >
问题:

将xml bean自动导入@Configuration类

云何平
2023-03-14

在我的Spring项目中,我通常使用以下三个文件下的xml配置:

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());
    }
}
<!--        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配置。

共有1个答案

戚峻
2023-03-14

我找到了一种使用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 
}

我读到,如果我们使用这种技术,这意味着我们做错了什么,我将继续寻找一个适当的解决方案。

 类似资料:
  • 这可能是一个很新手的问题,但是我搜索过,要么是我的理解有很大的差距,要么是在做一些我想不通的错误的事情。 在我的上下文文件中,这里有一个节选 现在我在myBeanOne中: 当我试图在调用setDataSource的行上执行该命令时,我会得到以下错误: 行中: 我尝试了十种不同的配置来使其工作,但我似乎做不到。感谢任何协助,谢谢。 我知道这是一个非常基本的问题,但我正在与之斗争。 谢谢你的耐心。

  • 我正在从Webstorm转换到Visual Studio代码。在Webstorm中的表现是糟糕透顶的。 Visual studio代码对于查找所需的依赖项并导入它们没有很大帮助。到目前为止,我一直在手动操作,但老实说,我宁愿等15秒webstorm找到并添加我的导入,这些导入必须手动查找。 我使用的是@minko-gechev https://github.com/mgechev/angular2

  • 我正在尝试在Configuration类中自动生成一个类,如下所示: [编辑]在我的日志中没有例外,因为如果该对象为空,将不会使用该对象。下面是我在日志文件中看到的日志条目: [编辑]这里是主类--

  • 在eclipse中,它是ctrl-shift-o,自动导入所有内容。但我怎么能在Xamarin做到这一点?我不记得每个包,也没有那些灯泡,它们在Eclipse中可以帮助我“快速修复”问题。 那么,有没有什么捷径可以自动导入所有内容或其他方式来自动导入内容呢?

  • 您可以将自定义、ASP.NET、JSP、JRun 标签导入 Dreamweaver 中,使其成为创作环境的组成部分。 您可以将自定义标签导入 Dreamweaver 中,使其成为创作环境的组成部分。例如,当您在“代码”视图中开始键入导入的自定义标签时,就会出现代码提示菜单,列出该标签的属性供您选择。 从 XML 文件导入标签 您可以从 XML 文档类型定义 (DTD) 文件或架构导入标签。 打开标

  • 我有一个SoapUI项目和一个外部自定义Java实用程序库,这些实用程序库是我为在Groovy脚本中使用而编写的。 在Java库中,我有一个特定的实用程序类,它具有用于在groovy脚本上下文中更改属性值的实用程序方法。使用此类,我可以在groovy脚本文件中执行以下操作: > 但是,我希望能够在不使用import语句的情况下编写该脚本。有没有一种方法可以设置我的SoapUI项目来自动将这个类导入