欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring装配Bean之用Java代码安装配置bean详解

程序员文章站 2024-04-03 18:27:22
前言 本文主要给大家介绍了关于spring之利用java代码安装配置bean的相关内容,尽管通过组件扫描和自动装配实现spring的自动化配置很方便也推荐,但是有时候自动...

前言

本文主要给大家介绍了关于spring之利用java代码安装配置bean的相关内容,尽管通过组件扫描和自动装配实现spring的自动化配置很方便也推荐,但是有时候自动配置的方式实现不了,就需要明确显示的配置spring。比如说,想要将第三方库中的组件装配到自己的应用中,这样的情况下,是没办法在它的类上添加 @compnent和 @autowired注解的。

在这种情况下,需要使用显示装配的方式,可以分别通过java和xml实现,推荐使用java的方式,因为更加强大,类型安全并且重构友好,因为就和我们应用所写的java代码一样。但是虽然javaconfig和其他的java代码没有区别,但是在概念上是不同的。所以javaconfig不应该出现业务逻辑的代码,并建议放在单独的包中,做隔离。

创建配置类

在之前,看到过javaconfig,我们再看一下:

package soundsystem;
import org.springframework.context.annotation.configuration;

@configuration
public class cdplayerconfig {
 
}

创建javaconfig类的关键在于为其添加 @configuration注解,@configuration注解表明这个类是一个配置类,该类应该包含spring上下文中如何创建bean的细节。之前我们都是依赖组件扫描来发现spring应该创建的bean。尽管可以同时使用组件扫描和显示配置,但是现在我们去掉了 @compnentscan注解,现在的cdplayerconfig类就没有任何作用了。如果现在运行之前的测试类,就会失败,并且出现beancreationexception异常。

声明简单的bean

在javaconfig中声明bean,需要编写一个方法,该方法会创建所需类型的实例,然后这个方法添加 @bean注解。

@bean
public compactdisc sgtpeppers() {
 return new sgtpeppers();
}

@bean注解会告诉spring这个方法会返回一个对象,该对象要注册为spring应用上下文中的bean。

默认情况下,bean的id与带有 @bean注解的方法名是一样的,在上面的例子中,bean的id将会是sgtpeppers。如果想设置不同的id,那么可以重命名该方法,也可以通过name属性指定一个不通的名字:

@bean(name="lonelyheartsclubband")
public compactdisc sgtpeppers() {
 return new sgtpeppers();
}

借助javaconfig实现注入

前面声明的compactdisc很简单,因为没有其他依赖。但现在,我们需要声明cdplayer bean,它依赖于compactdisc。

在javaconfig中装配bean的最简单方式就是引用创建bean的方法。

@bean
public cdplayer cdplayer() {
 return new cdplayer(sgtpeppers());
}

注意:看起来,compactdisc是通过调用sgtpeppers()得到的,但情况并非完全如此。因为sgtpeppers()方法添加了 @bean注解,spring会拦截所有对它的调用,并确保直接返回该方法创建的bean,而不是每次都进行实际的调用。
假如引入另外一个cdplayer bean,他和之前的那个bean完全一样:

@bean
public cdplayer cdplayer() {
 return new cdplayer(sgtpeppers());
}

@bean
public cdplayer anothercdplayer() {
 return new cdplayer(sgtpeppers());
}

如果sgtpeppers()的调用是实际的方法调用,那么每个cdplayer实例都会有一个特有的sgtpeppers实例。如果是实际的cd播放器和cd光盘的话,很ok,物理上没办法共用一张cd光盘在两个cd播放器上。

但是,在软件中,我们完全是可以将同一个sgtpeppers实例注入到任意数量的其它的bean中。默认情况下,spring的bean都是单例的,我们并没有必要为第二个cdplayer bean创建完全相同的sgtpeppers实例。

根本的问题在于,通过调用方法的方式来引入bean有点困惑,还有另外一种方式:

@bean
public cdplayer cdplayer(compactdisc compactdisc) {
 return new cdplayer(compactdisc);
}

通过这种方式引入其它的bean通常是最佳的方式,因为spring并不会要求将compactdisc声明放在同一个配置文件中,甚至不一定是javaconfig中,可以将配置分布在xml、多个配置类以及自动扫描装配的bean中。

另外,这里的cdplayer的构造器实现了di功能,但是我们完全可以根据需求实例化cdplayer,比如想通过setter方法注入compactdisc的话,可以这样:

@bean
public cdplayer cdplayer(compactdisc compactdisc) {
 cdplayer cdplayer = new cdplayer(compactdisc);
 cdplayer.setcompactdisc = compactdisc;
 return cdplayer;
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。