spring装配bean的三种方式:
- 在XML中进行显示装配
- 在XML中进行显示装配在Java中进行显示装配
- 在XML中进行显示装配隐式的Bean发现和装配机制
一、自动化装配Bean
Spring从两个角度实现自动化装配:
- 组件扫描(ComponentScan)):spring会自动发现spring应用上下文中所创建的Bean
- 自动装配(Autowried):Spring自动满足Bean之间的依赖
第一方面:从组件扫描的角度
- Spring会自动发现应用上下文所创建的bean
创建接口:
public interface CompactDisc{
void play();
}
创建类:
@Component
public class SgtPeppers implements CompactDisc{
public void play(){
Ststem.out.println("Hello world!");
}
}
解释:@Component这个注解表示该类会作为组件类,并告知Spring要为这个类创建bean,但是组件扫描默认是不开启的,我们需要显示的配置一下Spring
创建配置类:
@ComponentScan
@Configuration
public class CDPlayerConfig{
}
解释:@ComponentScan会在Spring启用组件扫描,默认扫描与配置类相同的包,可以设置扫描的包,查找带有@Component注解的类
@Configuration表明这是一个配置类
通过XML文件启用组件扫描
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com" /
</beans>
注意:如果你的应用程序中,所有的对象都是独立的,彼此之间没有任何依赖,那么使用组件扫描就可以,但是很多对象会依赖其他的对象完成任务,这样我们就需要一种方法将组件扫描的到的bean和他们的依赖装配在一起,所以要了解一下自动装配
第二方面:从自动装配方面
通过为bean添加注解实现自动装配,我们可以借助@Autowried注解
通过自动装配,将一个CompactDisc注入到CDPlayer中
@Component
public class CDPlayer implements MediaPlayer{
private CompactDisc cd;
@Autowried
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void play(){
cd.play();
}
}
@Autowried不仅可以用在构造器上,还可以用在属性的setter方法上,比如CDPlayer有一个setCompactDisc方法,可以采用如下的形式实现自动化装配
@Autowried
public void setCompactDisc(CompactDisc cd){
this.cd = cd;
}
解释:在Spring初始化bean后,他会尽可能去满足bean的依赖,在本例中,依赖是通过带有@Autowried注解的方法声明的。
不管是构造器,Setter方法还是其他的方法,Spring都会尝试满足方法参数上所声明的依赖,假如只有一个bean匹配依赖的话,那么这个bean就会被匹配进来
如果没有匹配的bean,那么在应用上下文创建的时候,Spring会抛出一个异常,为了避免这种异常,可以将@Autowried的required属性值设置为false
二、使用java显示创建Bean
尽管在很多情况下使用组件扫描和自动装配实现Spring的自动化配置是更为推荐的方式,但是有时候这种方案行不通,因此需要明确配置Spring,比如将第三方插件装配到你的应用中去,是没有办法在他的类上添加@Component和@Autowired注解的,因此必须采用显示装配的方法。
在显示装配的时候,javaConfig是更好的方案,因为它更为强大,类型安全,并且对重构友好。通常将JavaConfig代码放在单独的包中,使它与其他应用程序逻辑分离开来。
第一步:创建配置类
创建配置类的关键在于为其添加@Configuration注解,此注解表明这个类是一个配置类,该类包含在spring应用上下文中如何创建bean的细节.
@Configuration
public class CDPlayConfig{
}
第二步:声明简单的bean
@Bean注解会告诉Spring这个方法会返回一个对象,该对象要注册为Spring应用上下文中的Bean.
默认情况下Bean的ID与带@Bean注解的方法名是一样的,也可以通过name属性指定一个名字
下面的代码返回了所需类型的实例,声明了CompactDisc bean:
@Configuration
public class CDPlayConfig{
//Bean(name="123")
//SgtPeppers继承CompactDisc接口
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();//返回此类的一个实例
}
}
第三步:借助javaConfig实现依赖注入
将CompactDisc bean 注入到CDPlayer bean中
构造器注入:
@Configuration
public class CDPlayConfig{
//Bean(name="123")
@Bean
public CompactDisc sgtPeppers(){
return new SgtPeppers();//返回此类的一个实例
}
@Bean
public CDPlayer cdPlayer(){
return new CDPlayer(sgtPeppsers());
}
//或者使用下面这种方法:
/*
当Spring调用cdPalyer() 创建CDPlayer bean的时候,他会自动装配一个CompactDisc到配置方法中
public CDPlayer cdPlayer(CompactDisc compactDisc){
return new CDPlayer(compactDisc);
}
*/
}
Setter方法注入
@Configuration
public class CDPlayConfig{
@bean
public CDplayer cdPlayer(CompactDisc compactDisc){
CDPlayer cdPlayer = new CDPlayer(compactDisc);
cdPlayer.setCompactDisc(compactDisc);
return cdPlayer;
}
}
三、使用XML显示配置Bean
spring最初,XML是最主要的配置方式,在XML中创建Bean需要使用<bean>元素
<?xml version="1.0" encoding="GBK"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!--配置bean-->
<bean class="com.Hello"/>
这是最简单的XML方式的Bean声明,仅仅指定了该Bean属于的类,Bean的命名规则为全限定类名来命名,该Bean的名称为“com.Hello#0”,其中“#0”是一个计数,从0开始
也可以使用id属性来命名
<bean id="hello" class="com.Hello"/>
一般我们对需要引用的Bean指定名称,对不需要引用的,采用自动命名即可
采用XML配置Bean的缺点:在这个简单的Bean声明中,我们将Bean的类型以字符串的形式设置在了class属性中,但是不能保证class属性的值是真正的类型。
借助构造器注入初始化Bean
1. 元素:附加文件:https://blog.csdn.net/qq_41357573/article/details/844457432.使用spring3.0所应用的c:命名空间 在使用之前,必须在顶部声明其模式
xmlns:c="http://www.springframework.org/schema/c"
......
<bean id="hello" class="com.Hello" c:cd-ref="test">
<!--test为一个bean引用,而不是字面量-->
<!--只有一个构造器参数的时候,可以不使用表示参数-->
<bean id="hello" class="com.Hello" c:_-ref="test">
将字面量注入到构造器中
使用c:命名空间
<bean id="hello" class="com.Hello" c:cd-ref="test"
c:_name="yq"
c:_age=""23/>
<!--也可以使用下面这种方式,通过参数索引装配相同字面量-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
c:_0="yq"
c:_1=""23/>
<!--如果只有一个构造器参数的话-->
<bean id="hello" class="com.Hello" c:cd-ref="test"
c:_="yq"/>
装配集合
类:
......
//包含值
public people(String name;string age;List<String>kills){
this.name = name;
this.age = age;
thsi.kills = kills;
}
XML配置:
<!--首先使用List将其声明为一个列表-->
<bean id="people" class="类路径"
<constructor-arg value="yq"/>
<constructor-arg value="23"/>
<constructor-arg>
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</constructor-arg>
</bean>
实现bean引用列表的装配:
<bean id="people" class="类路径"
<constructor-arg value="yq"/>
<constructor-arg value="23"/>
<constructor-arg>
<list>
<ref bean="a"/>
<ref bean="b"/>
<ref bean="c"/>
</list>
</constructor-arg>
</bean>
总结: 上述三种装配技术非常有用,但是在便利性方面,最强大的还是Spring的自动化装配置,自动化装配分为两个方面,一个方面是当所有的对象之间没有依赖时,所需要的仅是组件扫描而已,组件扫描分为java配置和XMl配置。另一方面,当对象会依赖其他对象才能完成任务时,这时就需要自动装配。