今天要给系统增加日志功能,系统使用struts2+spring2.5+hibernate3.0框架开发。
我第一反应就是使用AOP,又快又方便。
我这么修改:
1、修改spring配置文件,增加如下内容:
<aop:aspectj-autoproxy/>
<bean id="actionTrack" class="com.sa.ActionTrack" />
配置文件原来就已经配置了
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="....
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd ..."
所以就免了。
而actionTrack就是我的日志跟踪类,如下:
@Aspect
public class ActionTrack
{
@Pointcut("execution(* com.xx..*.*Action.*(..))")
public void actionPointCut(){};
public Object roundLog(ProceedingJoinPoint pjp) throws Throwable
{
Signature sig = pjp.getSignature();
Object obj = pjp.getTarget();
String str="calling "+obj.getClass().toString() + " " + sig.getName();
System.out.println(str);
Object retVal = pjp.proceed();
str="calling over "+obj.getClass().toString() + " " + sig.getName();
return retVal;
}
@Before("target(com.xx.struts2.action.BaseAction)")
public void beforeLog(JoinPoint jp)
{
Signature sig = jp.getSignature();
Object obj = jp.getTarget();
String str="before calling "+obj.getClass().toString() + " " + sig.getName();
System.out.println(str);
//Object retVal = pjp.proceed();
//str="calling over "+obj.getClass().toString() + " " + sig.getName();
//return retVal;
}
@AfterThrowing(pointcut="target(com.xx.struts2.action.BaseAction) ",throwing="ex")
public void exceptionLog(Exception ex)
{
ex.printStackTrace();
}
}
然后启动tomcat,登录系统,查看日志,发现打印before calling xxxx " " xxx后就打印出异常,大概如下:
java.lang.NullPointerException
at com.xx.xxAction.list(GridProcessorAction.java:161)
at com.xx.xxAction$$FastClassByCGLIB$$21cf86ce.invoke(<generated>)
跟踪进去list方法发现如下代码
xxService.query(xxx);
中xxService是空指针,xxService是成员变量,自动注入的,如下:
@Resource(name="xxService")
private xxServiceImpl xxService;
其中xxServiceImpl是xxService的接口。
明明声明了自动注入,不应该为空啊,而且我把切面去了,就一切正常,真莫名其妙。
后来我发现这个xxAction的类开头并没有注解声明
@Repository("login") @Scope("prototype")
但是在没用切面前,它的属性却能正确注入,真的怪了。于是跟踪struts的配置文件,发现struts是这么写的
<action name="Login_*" class="com.xx.xxAction" method="{1}">
<result name="input">xx</result>
<result>xx</result>
</action>
按理说struts+spring时,这个class应该是写spring组件的ID,但这里却写具体类。从目前的配置看,也就是struts的所有action都不有Spring托管,但是Spring却能注入变量,真神奇了。
我把上面的配置改成
<action name="Login_*" class="login" method="{1}">
<result name="input">xxx</result>
<result>xx</result>
</action>
然后在xxAction的类开头加上注解,如下
@Repository("login") @Scope("prototype")
xxAction
然后再运行切面,一切正常,问题解决了。
但遗留下疑问,struts+spring是struts的action明明没有被spring托管,怎么会自动注入变量的。这个也是系统的一个设计缺陷
分享到:
相关推荐
1. **依赖注入**:依赖注入(Dependency Injection,DI)是AOP的一个重要应用场景,它帮助解耦对象之间的依赖关系。通过容器管理组件的生命周期和依赖关系,可以轻松替换或扩展实现,便于测试和维护。C#中的Unity、...
Spring框架是Java开发中广泛应用的一个轻量级容器,它的核心特性是依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)。这两个特性极大地简化了Java应用程序的开发和...
Spring AOP是Spring框架的一个重要特性,它允许开发者创建具有横切关注点的模块,如日志记录、事务管理等。这些关注点可以被声明性地应用到多个对象上,而无需修改这些对象的代码。Spring AOP通过动态代理实现,有两...
`Mono.Cecil`是一个强大的.NET元数据操作库,它允许开发者在运行时动态地读取、修改并保存IL(中间语言)代码,从而实现静态注入,即在编译后的.NET程序集上进行代码修改。通过这种方式,我们可以实现在不修改源代码...
今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...
AspectJ 是一种基于 Java 语言的 AOP 实现,它可以在编译时织入Aspect,从而解决@Autowired 依赖注入失败的问题。 四、结论 Spring AOP 导致@Autowired 依赖注入失败的解决方法有两种:将方法修饰符改为 public 和...
在Spring框架中,依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)是两大核心特性,同时自动注入Bean也是Spring管理对象的一种常见方式。让我们深入探讨这些概念。 首先,...
在软件开发中,Unity是一个流行的依赖注入容器,它主要用于.NET应用程序,尤其是对于Unity游戏引擎的开发者来说,这个框架可以帮助他们更好地管理和组织代码。另一方面,面向切面编程(AOP)是一种设计模式,允许...
在Java企业级开发中,J2EE(Java 2 Platform, Enterprise Edition)是一个重要的平台,它为构建分布式、多层的Web应用程序提供了丰富的框架。Spring框架是J2EE开发中的核心组件,它简化了企业级应用的开发过程,特别...
今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...
在类中定义一个带有`[Dependency]`特性的属性,Unity会自动填充该属性: ```csharp public class MyClass { [Dependency] public IService Service { get; set; } } ``` 3. 接口注入:在某些情况下,我们可能...
- **Java配置**:使用`@Configuration`注解的类,`@Bean`注解的方法表示一个Bean的生产者。 - **@Component**家族:`@Component`、`@Service`、`@Repository`和`@Controller`注解用于标记组件类,配合`@Autowired`...
当需要一个对象时,只需从容器中获取,而无需关心其具体的创建过程。DIC还允许我们进行依赖的自动解析,使得代码更简洁,降低了组件间的耦合度。 在这个压缩包文件"design_pattern"中,你可以找到关于这些概念的...
在做一个需求的时候,发现原来的代码逻辑都是基于模板+泛型的设计模式,模板用于规整逻辑处理流程,泛型用来转换参数和选取实现类。但是在方法调用的时候却突然爆出一个 NPE,直接给人整蒙了! 二、类目录结构 * ...
在上述描述中,尝试使用`@Autowired`注解注入一个静态的`JdbcTemplate`,虽然编译时没有问题,但在运行时,由于静态变量不会受到Spring容器的管理,导致在使用`jdbcTemplate.query()`时可能会遇到空指针异常。...
本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处...
构造器注入在创建对象时就注入依赖,setter注入则允许在对象创建后随时注入,接口注入则通过实现特定接口来注入依赖。选择哪种方式取决于具体的应用场景和设计需求。 **面向切面编程(AOP)**是Spring的另一个关键...
Autofac是.NET平台上一个流行的第三方DI容器,它支持构造函数注入、属性注入等多种方式,可以方便地将服务注册到容器,并在需要时注入到依赖的对象中。在本项目中,我们将配置Autofac以管理Dapper的实例,确保在应用...
标题 "aopalliance-1" 指的是 AOP Alliance 的版本 1,这是一个重要的开源项目,旨在提供一个统一的接口,使得不同的面向切面编程(AOP)框架能够协同工作。AOP Alliance 为Java平台上的AOP实现提供了一个公共API,...