Spring和手动创建的DAO如何重构以在这样的DAO对象上启用hasPermisions

时间:2013-05-27 14:05:49

标签: spring spring-security

我有像这样的Dao实施

public class EntityDao<T> {

    private Class clazz;
    private SessionFactory sessFactory;

    public EntityDao(Class clazz, SessionFactory sessFactory) {
        this.clazz = clazz;
        this.sessFactory = sessFactory;

    }
.... dao methods 
}

和工厂用于检索和存储特定的dao

EntityBeanDaoFactory {

private HashMap<EntityDaoType, EntityDao> daoMap = new HashMap<EntityDaoType, EntityDao>();
// return dao from daoMap if exists a if not create it and put it in the map then return dao
public EntityDao createDao(EntityDaoType entityType)  {
 switch (entityType) {
        case mySpecialDaoTYPE:
            if (!daoMap.containsKey(entityType)) {
                    EntityDao<Type> mySpecialDao = new EntityDao(Type.class, sessFactory);
                    daoMap.put(entityType, mySpecialDao);
                }
                 return daoMap.get(entityType);
}

}

现在我想使用@PreAuthorize(“hasPermission()”)注释dao方法但是spring不知道以这种方式创建的daos并且我无法立即重构整个项目因此我创建了dao,on the wich我需要在aplicationContectxt.xml

中使用注释
<bean id="mySpecialDao" class="..EntityDao" >
    <constructor-arg>
        <value>myClass</value> 
    </constructor-arg>
    <constructor-arg ref="sessionFactory" />
</bean>
在工厂里面,我有像这样创建这个特殊dao的改变行为

     if (!daoMap.containsKey(entityType)) {
         EntityDao<Class> dao = (EntityDao<Class>) AppContext.getApplicationContext().getBean("mySpecialDao");
                daoMap.put(entityType, dao);
            }

有没有更好的方法让春天知道我的DAO?我的意思是如何让Spring知道manualy创建的instancess?

2 个答案:

答案 0 :(得分:1)

您可以使用AspectJ使用Spring AOP支持来完成此操作。在此处阅读更多内容:http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-atconfigurable

启用此功能后,Spring会知道使用Configurable注释注释的类创建的任何实例。然后Spring将能够识别PreAuthorize注释。

答案 1 :(得分:0)

为什么需要工厂来创建DAO?这就是Spring应用程序的上下文。

您似乎希望限制使用基于角色的安全性调用DAO方法的能力。我认为这很好,也可以做,但你不需要限制DAO的创建。使用Spring创建它,然后限制访问。你的方式有点过分和不必要。