Spring调用每个方法调用之前的方法

时间:2013-12-11 12:49:35

标签: java spring spring-aop

有没有办法在每次调用bean之前调用一个方法?

我在春天使用硒和黄瓜。由于这个原因,所有页面都是单例,因为我使用@FindBy注释,所以每次使用页面时都要调用PageFactory.initElements(driver,object)。

使用标准页面对象模式,可以通过在构造函数中调用它来完成。

我想避免的是在每种方法中指定方法如下:

public void clickThis() {
    PageFactory.initElements(driver, this)
    ...
}

public void clickThat() {
    PageFactory.initElements(driver, this)
    ...
}

我不想返回新页面,因为它们无法在功能之间共享。

2 个答案:

答案 0 :(得分:4)

Spring拥有出色的AOP支持,您可以从中获益。

为解决问题,您需要做的是。

  1. 通过在Spring配置文件中添加<aop:aspectj-autoproxy/>来启用Spring中的方面。

  2. 创建一个简单的类并将其注册为Aspect。

  3. 来源:

    <bean id="myAspect" class="some.package.MyFirstAspect">
       <!-- possible properties ... for instance, the driver. -->
    </bean>
    

    MyFirstAspect课程。请注意,它标有@Aspect注释。在类中,您必须创建一个方法并将其注册为@Before建议(在方法执行之前,之后或周围运行建议)。

    package some.package;
    import org.aspectj.lang.annotation.Aspect;
    
    @Aspect
    public class MyFirstAspect {
        @Before("execution(* some.package.SomeClass.*(..))")
        public void initElements() {
            //your custom logic that has to be executed before the `clickThis`
        }
    }
    

    更多信息:

答案 1 :(得分:0)

正如kocko所提到的,你可以使用aspects

除此之外:我不确定我是否理解正确,但你真的需要在每个方法调用中调用initElements吗?或者只是在您创建页面时。在后面的例子中,我建议创建一个抽象页面,在其中调用initElements方法并从中继承每个其他页面。