滚动鼠标spring中如何实现参数隐式传递_Spring创建bean的三种⽅式原⽂作者:Java后端技术栈 制和⾃动装配。这三种⽅式各有各的优点,但也有其不⾜: 模块化机组
⼀、使⽤⾃动装配创建bean
Spring主要从两个⾓度来实现⾃动化装配:①组件扫描;②⾃动装配。组件扫描指的是Spring会⾃动扫描指定包及其⼦包下的所有bean,
并将其放⼊spring容器中进⾏管理,⽽⾃动装配则是指对于有相互依赖关系的bean,Spring会将其⾃动装配到⽬标bean中,如将
repository层的bean⾃动装配到service层中。
⾃动装配的⽅式创建bean主要是使⽤⼀个被专门⽤来当做配置的接⼝(或类)来实现的。配置接⼝上主要使⽤两个注解:@Configuration和
@ComponentScan。@Configuration来标注该接⼝是⽤于定义配置的,⽽@ComponentScan则是⽤于指定扫描的bean的⽂件夹的,
默认情况下Spring会扫描该配置接⼝所在包及其⼦包下的所有bean。以下是⼀段配置接⼝的⽰例代码:
import t.annotation.ComponentScan;import t.annotation.Configuration;@Configuration@ComponentScan
上述代码定义了Spring查bean的⽅式,⽽创建bean则可以使⽤@Component注解来实现,该注解可以传⼀个参数value,⽤来指定要创
建的bean的名称,默认使⽤类名并且⾸字母⼩写。以下代码演⽰了如何使⽤@Component创建⼀个bean:
鸟笼的制作
public interface CompactDisc { void play();}@Componentpublic class SgtPeppers implements CompactDisc { private String title = "Sgt. Pepper's Lonely Hearts Clu
这样Spring就可以⾃动创建⼀个SgtPeppers的实例,并且将其放到Spring容器中进⾏管理,另外我们也可以使⽤@Named注解来创建⼀
秸秆制煤个bean。
上⾯只是讲了如何创建⼀个bean,⽽⾃动装配还有另⼀⽅⾯的概念:依赖注⼊。其是指Spring会将⼀个bean所依赖的bean⾃动装配进
来。依赖注⼊是通过@Autowired或@Resource来实现的,当⼀个bean需要另⼀个bean作为其属性的时候,其只需要声明该bean的⼀个
变量,并且对该属性使⽤@Autowired或@Resource标注⼀下即可。以下是⼀个依赖注⼊的实例:
@Componentpublic class CDPlayer implements MediaPlayer { @Autowired private CompactDisc compactDisc; public void setCompactDisc(CompactDisc compac
这⾥Spring就会在bean容器中查CompactDisc实例,即sgtPeppers,并将其注⼊进来。以下是⼀段测试代码,⽤来验证这⾥的bean都
创建了,并且也都注⼊进来了:
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(classes = CDPlayerConfig.class)public class CDPlayerTest { @Autowired private CompactDis ⼆、在java中进⾏显⽰的配置
这种⽅式创建bean则不需要进⾏组件扫描了,其是通过在配置类中通过⽅法显⽰的创建⼀个bean,该⽅法则需要使⽤@Bean注解进⾏标
识。如下是⼀段在java配置中显⽰的声明bean的代码:
摄像机外壳
@Configurationpublic class CDPlayerConfig { @Bean public CompactDisc sgtPeppers() { return new SgtPeppers(); } @Bean public CDPlayer cdPlayer(Co
如上的代码中去掉了@ComponentScan注解,并且在配置类中使⽤@Bean注解显⽰的声明了CompactDisc和CDPlayer的两个实例,这两个实例的名称默认情况下是和⽅法名称是⼀样的。这⾥需要说明的是,①在@Bean标注的⽅法上如果有参数,那么Spring会⾃动在容器中查是否有参数类型的bean,并将其注⼊进来;②如果不使⽤参数的⽅式注⼊依赖的bean,可以使⽤调⽤⽅法的⽅式,如下代码演⽰了如何调⽤⽅法注⼊bean:
@Configurationpublic class CDPlayerConfig { @Bean public CompactDisc sgtPeppers() { return new SgtPeppers(); } @Bean public CDPlayer cdPlayer() {
上⾯的代码中,在创建CDPlayer类型的bean时会调⽤⼀次sgtPeppers()⽅法,⽽在创建CompactDisc类型的bean时也会调⽤⼀次该⽅法,这样会造成Spring容器中有两个同类型的bean,这与Spring的bean都是单例的相悖,为了避免这个问题,Spring会拦截创建CDPlayer类型的bean时调⽤的sgtPeppers()⽅法,⽽直接从容器中获取该bean并将其返回。
这⾥需要注意的⼀点是,这种⽅式相对于第⼀种⽅式需要对每个bean都进⾏显⽰声明,但是其有⾃⼰的优点,对于⼀些额外的类库中的
类,我们⽆法在其中加⼊Spring的注解,但是却要将其加⼊到Spring容器中进⾏管理,那么我们就可以通过这种⽅式来显⽰的声明这些类
加热平台的bean。因⽽,在项⽬中我们可以通过将第⼀种⽅式和第⼆种⽅式结合使⽤来创建和管理bean。
三、xml中进⾏显⽰的配置
在xml⽂件中配置bean是Spring最先使⽤的⼀种⽅式,在该xml⽂件中主要是⼀个标签,其有⼀个⼦标签,所有的bean的声明都是在⼦标
签中声明的。标签主要有两个属性:id和class。id⽤来指定要声明的bean的名称,如果没指定则创建的bean的默认名称为class属性的值
加上#数字,class属性则是⽤来指定要创建的类(包含包名)的。如下是⼀段使⽤xml创建bean的基本配置: <?xml version="1.0" encoding="UTF-8" ?>
这样就创建了⼀个名称为compactDisc的SgtPeppers类型的对象。如果要创建的对象的构造器中有参数,我们有两种⽅式对其进⾏注⼊。⼀种是使⽤标签的⼦标签标签,其有两个属性ref和value,如果参数为其他的bean类型,那么就⽤ref指向其他的bean的id即可,如果参数为基本数据类型,那么就⽤value执⾏基本数据类型的值即可。以下是⼀段⽰例配置:
<?xml version="1.0" encoding="UTF-8" ?>
这⾥也可以使⽤c-命名空间的⽅式对构造器的参数进⾏注⼊,对于引⽤数据类型,其格式为c:argName-ref,对于基本数据类型,其格式为c:argName,这⾥argName为参数名称。以下是使⽤这种⽅式的⽰例配置:
<?xml version="1.0" encoding="UTF-8" ?>
对于⼀个类的创建,并不⼀定所有的参数都是必须的,因⽽Spring提供了⼀种属性注⼊的⽅式,属性注⼊则必须要求该类中有⼀个该属性的set⽅法,⽐如setCompactDisc,属性名在配置⽂件中的名称为该set⽅法后半部分⾸字母⼩写的形式。属性注⼊参数的⽅式和构造器注⼊的⽅式⾮常类似,其也有两种⽅式进⾏注⼊,即标签下的⼦标签和p-命名空间。以下是进⾏属性注⼊的⽰例:
<?xml version="1.0" encoding="UTF-8" ?><?xml version="1.0" encoding="UTF-8" ?>
对于使⽤⼦标签和使⽤命名空间进⾏的属性注⼊,在基本数据类型和基本对象类型的处理上基本相似,但是如果参数为集合,那么命名空间将⽆法处理,⽽只能使⽤⼦标签的⽅式来进⾏集合参数的注⼊,以下是⼀段⽰例配置:
<?xml version="1.0" encoding="UTF-8" ?>Sgt. Pepper's Lonely Hearts Club BandWith a Little Help from My FriendsLucy in the Sky with DiamondsGetting
以上就是Spring创建bean的三种⽅式的介绍,可以看出,使⽤xml进⾏显⽰的配置这种⽅式⽐较复杂,⽽且因为其使⽤的是字符串,这不是类型安全的,使⽤JavaConfig则只能创建少量的bean,但是其可以为第三⽅库的类创建bean,⽽使⽤隐式的bean发现机制和⾃动装配则可以扫描⼤量的bean,但其不能将第三⽅库的bean收录到Spring容器中,因为第三⽅库的代码中不能添加Spring的注解。总⽽⾔之,后两种⽅式是现在⽐较常⽤的⽅式,并且可以结合起来使⽤,以实现对bean的控制。
最后,我⾃⼰是⼀名从事了多年开发的Java⽼程序员,辞职⽬前在做⾃⼰的Java私⼈定制课程,今年年初我花了⼀个⽉整理了⼀份最适合2019年学习的Java学习⼲货,可以送给每⼀位喜欢Java的⼩伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。