动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

Spring中Bean自动装配详解

08-10 17:46 280浏览
举报 T字号
  • 大字
  • 中字
  • 小字

Spring框架中,在配置文件中设定bean的依赖关系是一个十分友好的机制,与此同时,Spring容器还可以自动装配合作关系bean之间的关联关系。这意味着Spring可以通过向Bean Factory中注入的方式自动搞定bean之间的依赖关系。Spring中Bean的自动装配问题一直是困扰着许多学习Spring框架的小伙伴们,于是乎,本文我们就来细讲一下Bean的自动装配问题。

自动装配可以设置在每个bean上,也可以设定在特定的bean上。大部分场景下,我们都会使用 ApplicationContext 的具体实现类,因为对应的 Spring IoC 容器功能相对强大。而在 Spring 中提供了 3 种方法进行配置:

1.在 XML 文件中显式配置

2.在 Java 的接口和类中实现配置

3.隐式 Bean 的发现机制和自动装配原则

一、虽然spring提供了三种方式来装配Bean,但是我们优先使用自动配置机制。

当对一个类标注@Component注解时,表明该类会作为组件类,spring将为这个类创建bean。当在应用文中引用这个bean,spring会自动扫描事先指定的包查找这个 bean。但spring默认是不启用组件扫描的,可以在XML中配置加上。还有一种方法:在新建一个配置类,类中可以什么不用写,在配置类上加上@ComponentScan注解,spring会自动扫描改配置类所在的包,一般应该倾向xml配置。

@Component在接口实现上注解就可以,但发现在userdao、postdao接口也加上了,其实可以去掉,因为采用mybatis在xml中配置数据库的操作,动态实现dao接口。上面代码出现的@Autowired注解实现bean自动装配,会在spring应用上下文中的组件类寻找需求的bean。一般有两种装配方式:构造器和Setter方法(其他方法名也行,只要能够使注入的bean成为这个类的属性就行)

也可能出现spring没有查找到匹配的bean会抛出异常,在@Autowired加上required=false,如果没有匹配的bean时,spring会使这个bean处于未装配的状态,没有装配成功。还有可能会出现相同名字的bean有很多个,会产生歧义,一般在组件类上添加注解@Qualifier()括号写这个bean的id,在注入时也加上@Qualifier(),写上bean的id。像下面:

@Component

@Qualifier("postdao")

public interface Postdao{

. . . .

}

 

@Component

@Qualifier("userdao")

public interface Userdao{

. . . .

}

 

@Autowired

@Qualifier("usedao")

public void setUserdao(Userdao userdao)

{. . .

}

 

@Autowired

@Qualifier("postdao")

public void setUserdao(Postdao postdao)

{. . .

}

由于java规定在同一个条目上重复出现相同类型的多个注解,所有注入采用set方式。但是我们其实可以另辟蹊径,创建自定义的限定符注解。我们就不过多介绍了。

二、然后是通过java代码装配bean

一般通过组件扫描和自动装配方式装配bean已经很方便了,但如果由于需求我们要使用第三方的库的类,在这种情况没有办法到第三方库中去给类加注解,就不能使用第一种方法了。这时得采用显示装配,可以采用java代码或xml显示装配bean。使用java代码,先新建一个配置类JavaConfig,里面都是配置所需的bean,不应该有业务逻辑代码,所以单独建一个类。

@Configuration

@ContextConfiguration(locations = {"classpath:spring/spring-dao.xml","classpath:scan.xml"})

public class bbsConfig{

private Postdao postdao;

private Userdao userdao;

@Bean(name="postservice")

   public PostService getPost()

{

return new PostserviceImpl(postdao,userdao);

}

}

在对PostService的bean注入时,同时又依赖了两个bean,postdao和userdao。直接引用beanID就可以,spring会自动地从容器中获取这些bean,只要他们的配置是正确的就行。这个例子中userdao、postdao是Mybatis配置自动扫描将dao接口生成代理注入到spring的,其实也算是xml装配bean。

这里如果再声明一个bean,返回的仍是postserviceImpl对象,和之前的那个bean完全一样,是同一个实例。一般spring@bean如果是同一个beanID,默认返回的是一个单例bean,注入的是同一个实例。如果修改其中一个会都改变的。

不过在这里要注意进行测试时,由于spring的单元测试和springIoc容器是完全独立的,postdao和userdao注入检测时是使用locations加载xml文件,而postservice使用classes加载config类的,但是两个不能同时混用在@ContextConfiguration中。所以非要都测试的话,就分开测试。

 

使用 XML 装配 Bean 需要定义对应的 XML

这里需要引入对应的 XML 模式(XSD)文件,这些文件定义了配置 Spring 的XML元素,使用idea创建XML文件:

下面是一个简单的XML配置文件:

 

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

 

在上面的XML文件中,是该模式中的一个元素,它是所有Spring配置文件的根元素。Spring对单例模式进行了超越,在传统开发中,由于DAO类持有Connection这个非线程安全的变量,因此往往未采用单例模式。而在Spring环境中,对于所有的DAO都采用单例模式,因为Spring利用AOP和LocalThread功能,对非线程安全的变量进行了特殊处理,使这些非线程安全的类变成了线程安全的类。因为Spring的这一超越,所以在实际应用中都能以单实例的方式运行,这也就是为什么Spring把Bean的默认作用域定位singleton的原因。

这一篇Spring中Bean自动装配攻略是否对你有所帮助呢?当然,活灵活现的真实案例才是我们快速掌握这门技术的最佳辅助,再配合本站的Spring专业课程那就更是如虎添翼啦!

0人推荐
共同学习,写下你的评论
0条评论
熊熊爱吃可爱多
程序员熊熊爱吃可爱多

6篇文章贡献27254字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消