<?xml version="1.0" encoding="UTF-8"?>
<!--
	Application context definition for PetClinic on JPA.
-->
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:cache="http://www.springframework.org/schema/cache"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/aop
         http://www.springframework.org/schema/aop/spring-aop.xsd
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/cache
         http://www.springframework.org/schema/cache/spring-cache.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">

    <!--
        Simply defining this bean will cause requests to owner names to be saved.
        This aspect is defined in petclinic.jar's META-INF/aop.xml file.
        Note that we can dependency inject this bean like any other bean.
    -->
    <aop:aspectj-autoproxy>
        <aop:include name="callMonitor"/>
    </aop:aspectj-autoproxy>

    <!-- Call monitoring aspect that monitors call count and call invocation time -->
    <bean id="callMonitor" class="org.springframework.samples.petclinic.util.CallMonitoringAspect"/>

    <!--
        Exporter that exposes the CallMonitoringAspect via JMX,
        based on the @ManagedResource, @ManagedAttribute, and @ManagedOperation annotations.
    -->
    <context:mbean-export/>

    <!-- enables scanning for @Cacheable annotation -->
    <cache:annotation-driven/>

    <!--Jhonny: added to monitor statistics-->
    <bean id="managementService" class="net.sf.ehcache.management.ManagementService"
          init-method="init"
          destroy-method="dispose">
        <constructor-arg ref="ehcache"/>
        <constructor-arg ref="mbeanServer"/>
        <constructor-arg index="2" value="false"/>
        <constructor-arg index="3" value="false"/>
        <constructor-arg index="4" value="false"/>
        <constructor-arg index="5" value="true"/>
    </bean>

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcache"/>
    </bean>

    <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:cache/ehcache.xml"/>
    </bean>

    <bean id="mbeanServer" class="org.springframework.jmx.support.MBeanServerFactoryBean">
        <property name="locateExistingServerIfPossible" value="true"/>
    </bean>

</beans>
