Spring 带自动装配的纯注解

Spring pure annotation with autowired

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

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

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

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

要使 Trivial 中的 @Autowired 正常工作,您需要 Spring 实例化 Trivialnew Trivial() 将不起作用。为了让您的样本发挥作用,我认为您需要满足以下条件:

  1. Trivial 配置为 bean。
  2. new Trivial() 更改为 context.getBean(Trivial.class)

但是请注意,在正常情况下使用 context.getBean 被认为是不好的做法。

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

为了自动装配工作,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 实例自动装配到 new 创建的 Trivial 实例中。

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 文档