我正在尝试执行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
答案 0 :(得分:2)
要使Trivial中的@Autowired
起作用,您需要通过Spring实例化Trivial
。 new Trivial()
无效。为了使您的样本有效,我认为您需要以下内容:
Trivial
配置为bean。new Trivial()
更改为context.getBean(Trivial.class)
。但请注意,在正常情况下使用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文档。
可以将TrivialBean
实例自动装入由Trivial
创建的new
实例中。
spring-aspects.jar
包含一个注释驱动的方面,允许在容器控件之外创建的对象的依赖注入。但是,它不应该用于新的基于Spring的项目中。它旨在用于遗留项目,由于某种原因,某些实例是在Spring容器之外创建的。
Spring 4.2.0(目前最新版本)的示例,AspectJ 1.8.6(目前最新版本),Maven和Java 1.8。
对spring-aspects
和aspectjrt
<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文档。