带有自动装配的Spring纯注释

时间:2015-08-07 06:18:32

标签: spring spring-annotations

我正在尝试执行Spring的完整注释(无xml)。自动装配的成员未被填充。根据我的研究,有3件事要做:

  • 设置管理bean的配置文件

  • 使用@Autowired将bean送到文件

  • 实例化应用程序上下文以推动滚动

很难找到仅使用注释的完整示例,因此我没有太多可供参考。大多数示例至少使用一些xml。

没有错误消息,所以我不知道问题出在哪里。该值仅为null。这是我的文件:

Trivial.java

public class Trivial {

    public TrivialBean trivialBean;

    @Autowired
    public void setTrivialBean(TrivialBean trivialBean) {
        this.trivialBean = trivialBean;
    }

    public static void main(String...args) {

        ApplicationContext context
                = new AnnotationConfigApplicationContext(
                TrivialConfig.class);

        new Trivial().go();
    }

    private void go() {

        System.out.println("trivialBean: " + trivialBean);
    }
}

TrivialBean.java

public class TrivialBean {

    public String foo = "TEST TEST TEST";

    @Override
    public String toString() {
        return foo;
    }
}

TrivialConfig.java

@Configuration
public class TrivialConfig {

    @Bean
    public TrivialBean trivialBean() {
        return new TrivialBean();
    }
}

我希望这会输出trivialBean: TEST TEST TEST,但只是输出trivialBean: null

2 个答案:

答案 0 :(得分:2)

要使Trivial中的@Autowired起作用,您需要通过Spring实例化Trivialnew Trivial()无效。为了使您的样本有效,我认为您需要以下内容:

  1. Trivial配置为bean。
  2. new Trivial()更改为context.getBean(Trivial.class)
  3. 但请注意,在正常情况下使用context.getBean被认为是不好的做法。

答案 1 :(得分:1)

基于注释的容器配置中的常规自动装配

为了使自动装配工作,Trivial实例的生命周期必须由Spring容器管理。

示例

TrivialBean.java是相同的

public class TrivialBean {

    public String foo = "TEST TEST TEST";

    @Override
    public String toString() {
        return foo;
    }
}

TrivialConfig.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class TrivialConfig {

    @Bean
    public TrivialBean trivialBean() {
        return new TrivialBean();
    }

    @Bean
    public Trivial trivial() {
        return new Trivial();
    }
}

Trivial.java

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Trivial {

    public TrivialBean trivialBean;

    @Autowired
    public void setTrivialBean(TrivialBean trivialBean) {
        this.trivialBean = trivialBean;
    }

    public static void main(String... args) {

        ApplicationContext context = new AnnotationConfigApplicationContext(TrivialConfig.class);
        Trivial trivial = context.getBean(Trivial.class);
        trivial.go();
    }

    private void go() {
        System.out.println("trivialBean: " + trivialBean);
    }
}

输出

trivialBean: TEST TEST TEST

有关Annotation-based container configuration的更多信息,请参阅Spring文档。

AspectJ编译时编织和@Configurable

可以将TrivialBean实例自动装入由Trivial创建的new实例中。

spring-aspects.jar包含一个注释驱动的方面,允许在容器控件之外创建的对象的依赖注入。但是,它不应该用于新的基于Spring的项目中。它旨在用于遗留项目,由于某种原因,某些实例是在Spring容器之外创建的。

Spring 4.2.0(目前最新版本)的示例,AspectJ 1.8.6(目前最新版本),Maven和Java 1.8。

spring-aspectsaspectjrt

的其他依赖关系
   <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aspects</artifactId>
        <version>4.2.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.8.6</version>
    </dependency>

通过AspectJ Maven插件编译时间编织

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>aspectj-maven-plugin</artifactId>
    <version>1.7</version>
    <configuration>
        <complianceLevel>1.8</complianceLevel>
            <encoding>UTF-8</encoding>
            <aspectLibraries>
                <aspectLibrary>
                    <groupId>org.springframework</groupId>
                    <artifactId>spring-aspects</artifactId>
                </aspectLibrary>
            </aspectLibraries>
            <Xlint>warning</Xlint>
      </configuration>
      <executions>
          <execution>
              <goals>
                  <goal>compile</goal>
                  <goal>test-compile</goal>
              </goals>
          </execution>
      </executions>
</plugin>

TrivialBean.java是相同的

public class TrivialBean {

    public String foo = "TEST TEST TEST";

    @Override
    public String toString() {
        return foo;
    }
}

TrivialConfig.java

@EnableSpringConfigured类似于<context:spring-configured>。它表示当前应用程序上下文将依赖注入应用于在Spring bean工厂之外实例化的类。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.aspectj.EnableSpringConfigured;

@Configuration
@EnableSpringConfigured
public class TrivialConfig {

    @Bean
    public TrivialBean trivialBean() {
        return new TrivialBean();
    }
}

Trivial.java

@Configurable将Spring驱动的配置应用于Trivial

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

@Configurable
public class Trivial {

    public TrivialBean trivialBean;

    @Autowired
    public void setTrivialBean(TrivialBean trivialBean) {
        this.trivialBean = trivialBean;
    }

    public static void main(String... args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(TrivialConfig.class);
        Trivial trivial = new Trivial();
        trivial.go();
    }

    private void go() {
        System.out.println("trivialBean: " + trivialBean);
    }
}

输出

trivialBean: TEST TEST TEST

有效!有关AspectJ and @Configurable的更多信息,请参阅Spring文档。