我是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;
}
}
答案 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.serviceControllers
,applicationContext.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
的实例。