`
newslxw
  • 浏览: 213852 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

AOP后发现原来能注入的变量都没注入,一个很有意思的问题

阅读更多

今天要给系统增加日志功能,系统使用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托管,怎么会自动注入变量的。这个也是系统的一个设计缺陷

 

 

 

 

分享到:
评论

相关推荐

    C#版本AOP注入

    1. **依赖注入**:依赖注入(Dependency Injection,DI)是AOP的一个重要应用场景,它帮助解耦对象之间的依赖关系。通过容器管理组件的生命周期和依赖关系,可以轻松替换或扩展实现,便于测试和维护。C#中的Unity、...

    如何实现Spring依赖注入 AOP.rar

    Spring框架是Java开发中广泛应用的一个轻量级容器,它的核心特性是依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect Oriented Programming,简称AOP)。这两个特性极大地简化了Java应用程序的开发和...

    在自定义spring aop中使用el获取拦截方法的变量值。

    Spring AOP是Spring框架的一个重要特性,它允许开发者创建具有横切关注点的模块,如日志记录、事务管理等。这些关注点可以被声明性地应用到多个对象上,而无需修改这些对象的代码。Spring AOP通过动态代理实现,有两...

    C# 静态注入实现AOP

    `Mono.Cecil`是一个强大的.NET元数据操作库,它允许开发者在运行时动态地读取、修改并保存IL(中间语言)代码,从而实现静态注入,即在编译后的.NET程序集上进行代码修改。通过这种方式,我们可以实现在不修改源代码...

    Spring.Net演示实例(IOC、AOP、属性注入、构造函数注入、通知过滤器)

    今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...

    Spring-注入依赖,AOP,自动注入Bean

    在Spring框架中,依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)是两大核心特性,同时自动注入Bean也是Spring管理对象的一种常见方式。让我们深入探讨这些概念。 首先,...

    因Spring AOP导致@Autowired依赖注入失败的解决方法

    AspectJ 是一种基于 Java 语言的 AOP 实现,它可以在编译时织入Aspect,从而解决@Autowired 依赖注入失败的问题。 四、结论 Spring AOP 导致@Autowired 依赖注入失败的解决方法有两种:将方法修饰符改为 public 和...

    Unity结合三导实现依赖注入跟AOP

    在软件开发中,Unity是一个流行的依赖注入容器,它主要用于.NET应用程序,尤其是对于Unity游戏引擎的开发者来说,这个框架可以帮助他们更好地管理和组织代码。另一方面,面向切面编程(AOP)是一种设计模式,允许...

    J2EE_Spring之AOP与依赖注入例子

    在Java企业级开发中,J2EE(Java 2 Platform, Enterprise Edition)是一个重要的平台,它为构建分布式、多层的Web应用程序提供了丰富的框架。Spring框架是J2EE开发中的核心组件,它简化了企业级应用的开发过程,特别...

    C# Spring.Net演示实例【更新版】(IOC、AOP、属性注入、构造函数注入、通知过滤器)

    今天有空,写了基于C#使用Spring.Net的演示实例,希望能给有需要的人带来帮助,其中演示了配置下的IOC、AOP、属性注入、构造函数注入、通知过滤器、以及不使用配置直接代码硬编的AOP动态代码过程,另外还增加了...

    Unity结合三导实现依赖注入跟AOP Unity结合三导实现依赖注入跟AOP.zip

    在类中定义一个带有`[Dependency]`特性的属性,Unity会自动填充该属性: ```csharp public class MyClass { [Dependency] public IService Service { get; set; } } ``` 3. 接口注入:在某些情况下,我们可能...

    JAVA简单AOP切面编程;依赖注入;代码配置Bean源码

    - **Java配置**:使用`@Configuration`注解的类,`@Bean`注解的方法表示一个Bean的生产者。 - **@Component**家族:`@Component`、`@Service`、`@Repository`和`@Controller`注解用于标记组件类,配合`@Autowired`...

    PHP-设计模式: AOP切面编程,DI依赖注入,DIC容器DEMO。简单易懂哦

    当需要一个对象时,只需从容器中获取,而无需关心其具体的创建过程。DIC还允许我们进行依赖的自动解析,使得代码更简洁,降低了组件间的耦合度。 在这个压缩包文件"design_pattern"中,你可以找到关于这些概念的...

    Aop踩坑!记一次模板类调用注入属性为空的问题.doc

    在做一个需求的时候,发现原来的代码逻辑都是基于模板+泛型的设计模式,模板用于规整逻辑处理流程,泛型用来转换参数和选取实现类。但是在方法调用的时候却突然爆出一个 NPE,直接给人整蒙了! 二、类目录结构 * ...

    Spring不能注入Static变量的原因及Spring注入静态变量

    在上述描述中,尝试使用`@Autowired`注解注入一个静态的`JdbcTemplate`,虽然编译时没有问题,但在运行时,由于静态变量不会受到Spring容器的管理,导致在使用`jdbcTemplate.query()`时可能会遇到空指针异常。...

    spring-boot aop

    本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处...

    springioc和spring aop

    构造器注入在创建对象时就注入依赖,setter注入则允许在对象创建后随时注入,接口注入则通过实现特定接口来注入依赖。选择哪种方式取决于具体的应用场景和设计需求。 **面向切面编程(AOP)**是Spring的另一个关键...

    ORM框架 整合asp.net core mvc和Dapper、Autofac实现依赖注入和AOP,同时结合Redis实现 _缓

    Autofac是.NET平台上一个流行的第三方DI容器,它支持构造函数注入、属性注入等多种方式,可以方便地将服务注册到容器,并在需要时注入到依赖的对象中。在本项目中,我们将配置Autofac以管理Dapper的实例,确保在应用...

    aopalliance-1

    标题 "aopalliance-1" 指的是 AOP Alliance 的版本 1,这是一个重要的开源项目,旨在提供一个统一的接口,使得不同的面向切面编程(AOP)框架能够协同工作。AOP Alliance 为Java平台上的AOP实现提供了一个公共API,...

Global site tag (gtag.js) - Google Analytics