Spring 带自动装配的纯注解
Spring pure annotation with autowired
我正在尝试对 Spring 进行完整注释(无 xml)实现。未填充自动装配的成员。根据我的研究,有 3 件事要做:
设置管理 bean 的配置文件
使用@Autowired
获取bean到文件
实例化一个应用程序上下文以开始工作
很难找到仅使用注释的完整示例,因此我没有太多参考。大多数示例至少使用了一些 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 实例化 Trivial
。 new Trivial()
将不起作用。为了让您的样本发挥作用,我认为您需要满足以下条件:
- 将
Trivial
配置为 bean。
- 将
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-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 文档
我正在尝试对 Spring 进行完整注释(无 xml)实现。未填充自动装配的成员。根据我的研究,有 3 件事要做:
设置管理 bean 的配置文件
使用
@Autowired
获取bean到文件实例化一个应用程序上下文以开始工作
很难找到仅使用注释的完整示例,因此我没有太多参考。大多数示例至少使用了一些 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 实例化 Trivial
。 new Trivial()
将不起作用。为了让您的样本发挥作用,我认为您需要满足以下条件:
- 将
Trivial
配置为 bean。 - 将
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-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 文档