我有像这样的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?
答案 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创建它,然后限制访问。你的方式有点过分和不必要。