Spring AOP建议没有被执行

时间:2014-06-04 10:10:43

标签: spring spring-aop

我是Spring AOP的新手,在实施过程中面临一些问题。

我正在尝试将日志记录作为建议。但建议没有得到执行。

以下是我正在使用的文件。

LoggingAspect.java

package com.demo.conference.aspects;

@Aspect
@Component
public class LoggingAspect {
@Pointcut("execution(* com.demo.conference.daoImpl.ConferenceDAOImpl.*(..))")
public void point(){}


@Pointcut("execution(public * *(..))") //this should work for the public pointcut
private void anyPublicOperation() {}

@Before("anyPublicOperation()")
public void log(){
    System.out.println("--------------------->Aspect execuetd");

}
}

调度-servlet.xml中

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

   <context:annotation-config/>
   <mvc:annotation-driven />
   <context:component-scan base-package="com.demo.conference"/>

 <bean id="hibernateTemplate"      class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory">
        <ref bean="sessionFactory"/>
    </property>
</bean>
</beans>

applicationContext.xml //对于AOP相关配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">


   <context:component-scan base-package="com.demo.conference.aspects"/>
   <aop:aspectj-autoproxy/>

</beans>

的web.xml

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>

</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
  </context-param>
    <listener>
          <listener-class>
          org.springframework.web.context.ContextLoaderListener
        </listener-class>
     </listener>

</web-app>

的pom.xml   

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>3.2.8.RELEASE</version>
</dependency>
 <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>3.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aop</artifactId>
    <version>3.2.0.RELEASE</version>
</dependency>
<dependency>
    <groupId>cglib</groupId>
    <artifactId>cglib</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjrt</artifactId>
    <version>1.6.11</version>
</dependency>                    
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.6.11</version>
</dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-beans</artifactId>
    <version>3.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>3.2.8.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>3.2.8.RELEASE</version>
</dependency>

首先,我将所有xml配置放在单个文件中(在dispatcher-servlet.xml中),然后抛出异常NoSuchBeanDefined。

然后我在一些帖子中发现在单独的文件中声明AOP相关的配置。我这样做了。(如果有人能解释创建单独文件背后的原因) 现在没有任何例外,但建议没有被执行。

更新

package com.demo.conference.daoImpl;
@Component
@Repository
public class ConferenceDAOImpl implements ConferenceDAO {

@Autowired
private HibernateTemplate hibernateTemplate;

/**
 * Method to list all the conferences
 * @return list of conferences
 */
public List<Conference> listConference() {
    System.out.println("***ConferenceDAOImpl : listConference");
    System.out.println("Before fetching conferences");
    List<Conference> conferenceList = hibernateTemplate.find("from "+ Conference.class.getName());

    return conferenceList;
}
} 

1 个答案:

答案 0 :(得分:2)

dispatcher-servlet.xml中,将组件扫描更改为com.demo.conference.serviceControllers,将applicationContext.xml更改为com.demo.conference

HibernateTemplate和其他与网络无关的bean不应放在dispatcher-servlet.xml中。这些应该在applicationContext.xml。在dispatcher-servlet.xml中,您应该只有控制器,视图解析器和其他与Web部件相关的bean。将任何其他bean移至applicationContext.xml并按照我的提及配置组件扫描:dispatcher-servlet.xml使用com.demo.conference.serviceControllersapplicationContext.xml使用com.demo.conference

故事是这样的:dispatcher-servlet.xml中的bean形成一个应用程序上下文,其中包含由applicationContext.xml中的bean形成的应用程序上下文。当dispatcher-servlet上下文中的某个东西需要bean时,它会在包含的上下文中搜索,如果找不到它则在父上下文中搜索它。因此,在applicationContext.xm l中定义的每个bean都应该可以通过dispatcher-servlet上下文中的bean轻松访问。但反之亦然。 applicationContext中的Bean无法访问dispatcher-servlet中的bean。

此外,对接口使用@Autowired,而不是具体类:@Autowired private ConferenceDAO dao;@Autowired private ConferenceService service;并限制切入点的范围(改为使用point()并注释anyPublicOperation()) !建议使用像HibernateTemplate这样的Bean,而Spring正在为它创建一个代理。如果要在自己的类中注入HibernateTemplate具体类,则创建的代理是JDK代理(实现接口),而@Autowired需要HibernateTemplate的实例。