使用@ Autowired绑定在使用'new'实例化的实例内部不起作用。
使用@ Autowired绑定在使用'new'实例化的实例内部不起作用。
在我的Web Spring应用程序中,我使用关键字new
创建了一个实例,如下所示。
在我的一个Action类中,存在以下方法。
public void process() { MyBean b=new MyBean(); //用new初始化了实例 b.process(); }
其他的MyBean类
@Service public class MyBean { @Autowired MyService service; public void process() { service.execute(); // 这个service实例没有通过Spring DI初始化。service对象为空。 }
MyService实例没有被Spring的依赖注入设置。这是因为我自己用new
创建了MyBean的实例,而不是使用Spring吗?
Binding with @Autowired not working inside instances initiated with 'new'。
出现的原因:使用'new'关键字实例化的对象无法使用@Autowired注解进行自动装配。
解决方法:可以通过编程方式进行自动装配,使用AutowireCapableBeanFactory的autowireBean方法来手动装配依赖。
示例代码如下:
private AutowireCapableBeanFactory beanFactory; public void process() { MyBean obj = new MyBean(); beanFactory.autowireBean(obj); // obj现在已经自动装配了它的依赖关系 }
在使用`@Autowired`注解进行依赖注入时,如果使用`new`关键字创建的实例不受Spring容器的管理,因此Spring默认只会为由Spring容器管理的实例注入依赖。为了解决这个问题,可以采取两种方法。第一种方法是不使用`new`关键字,而是通过`@Autowired`注解在`MyBean`实例上进行注入。第二种方法是在`MyBean`类上使用`@Configurable`注解。使用`@Configurable`注解后,Spring将会为通过`new`关键字创建的对象注入依赖。需要注意的是,使用`@Configurable`注解时需要在classpath中引入`AspectJ`的相关jar包。对于第二种方法,需要在`pom.xml`文件中添加以下依赖,并通过AspectJ编译器进行编译,以确保生成的字节码具有所需的功能。
org.springframework spring-aspects 3.1.1.RELEASE org.aspectj aspectjrt 1.6.8 org.aspectj aspectjweaver 1.6.8 org.aspectj aspectjtools 1.6.8 org.codehaus.mojo aspectj-maven-plugin 1.4 true 1.6 ignore 1.6 UTF-8 false org.springframework spring-aspects compile test-compile org.aspectj aspectjrt 1.6.8 org.aspectj aspectjtools 1.6.11
以上是解决该问题的原因及解决方法,谢谢。你的意思是<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>4.0.6.RELEASE</version> </dependency>
这个就足够了吗?