2
回答
jfinal2.0 AOP Enhancer
华为云数据库免费试用   

@JFinal 你好,想跟你请教个问题:我在controller里面写

AddressService addService = enhance(AddressService.class);

然后调用其中selAllPro方法

@Before(Tx.class)

public List<Province> selAllPro() {
        return Province.dao.find("select pro_id,pro_name from province");
    }

这里的@Before(Tx.class)对方法进行了什么处理,我试过不加这个,在controller里面也可以执行成功。

如果不加,那我在controller里面直接new AddressService().getAllPro()和enhance之间有什么区别???


<无标签>
举报
共有2个答案 最后回答: 3年前

AOP需要一个创建切面,enhance就是这个切入点 ,切入后@Before(Tx.class)才会有效果。直接调用的话,@Before(Tx.class)是无效的。

Tx的作用是数据库事务,而在你举的例子中,get其实没有用到这类事务,所以你说两种调用方法没区别。

如果AddressService中有方法setAllPro(), 访方法中有多条数据插入行为,那么当其中的一条发生错误时,则全部插入行为都回滚。这些需要enhance(AddressService.class)才会启作用,而直接调用的话是无效的

--- 共有 2 条评论 ---
Alan-Yeh回复 @超凡程序猿 : 所有的Interceptor,@Before是添加Interceptor的一种方法 3年前 回复
超凡程序猿enhance 只针对@Before(Tx.class) 还是针对所有的@Befor 3年前 回复
    selAllPro() 方法是被拦截的方法,它并不知道外层拦截器的存在。拦截器可以在 selAllPro() 方法执行之前与之后添加特效,例如添加事务支持,具体添加了什么特效,取决于拦截器。
顶部