使用@Configurable进行弹簧自动布线

2022-09-01 06:12:41

我正在玩使用Spring的想法,并将DAO注入领域对象,这样它们就不需要直接了解持久层。@Configurable@Autowire

我试图遵循 http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-atconfigurable,但我的代码似乎没有效果。

基本上,我有:

@Configurable
public class Artist {

    @Autowired
    private ArtistDAO artistDao;

    public void setArtistDao(ArtistDAO artistDao) {
        this.artistDao = artistDao;
    }

    public void save() {
        artistDao.save(this);
    }

}

和:

public interface ArtistDAO {

    public void save(Artist artist);

}

@Component
public class ArtistDAOImpl implements ArtistDAO {

    @Override
    public void save(Artist artist) {
        System.out.println("saving");
    }

}

在应用程序上下文中.xml,我有:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springsource.org/dtd/spring-beans-2.0.dtd">
<beans>

    <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator" />
    <bean class="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect" factory-method="aspectOf"/>

</beans>

类路径扫描和初始化由 Play 的弹簧模块执行!框架,虽然其他自动连接的bean工作,所以我非常确定这不是根本原因。我使用的是Spring 3.0.5。

在其他代码中(实际上,在使用Spring注入到我的控制器中的bean方法中),我正在这样做:

Artist artist = new Artist();
artist.save();

这给了我一个NullPointerException,试图访问Artist.save()中的artistDao。

知道我做错了什么吗?

马丁


答案 1

您需要启用加载时间编织(或其他类型的编织)才能使用 。确保正确启用了它,如 Spring Framework 中的 7.8.4 使用 AspectJ 进行加载时编织中所述。@Configurable


答案 2

我在Tomcat 7上使用LTW尝试将bean自动连接到我的域类中时遇到了这个问题。

http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/aop.html#aop-configurable-container 对3.2.x的文档进行了一些更新,显示可以使用@EnableSpringConfigured而不是xml配置。

因此,我对我的域对象进行了以下注释:

@Configurable(preConstruction=true,dependencyCheck=true,autowire=Autowire.BY_TYPE)
@EnableSpringConfigured

@EnableSpringConfigured是

<context:spring-configured />

并且不要忘记将其添加到您的上下文 xml 文件中:

<context:load-time-weaver weaver-class="org.springframework.instrument.classloading.ReflectiveLoadTimeWeaver" aspectj-weaving="on"/>

当然,我需要先设置Tomcat以进行加载时间编织。

另外,我在3.2.0(空指针)中遇到了一个错误,所以我需要升级到Spring 3.2.1(https://jira.springsource.org/browse/SPR-10108)

现在一切都很好!


推荐