当前位置: 首页 > 图灵资讯 > 技术篇> Spring中Bean自动装配详解

Spring中Bean自动装配详解

来源:图灵教育
时间:2023-03-29 15:15:00

Spring在配置文件中设置框架bean的依赖关系是一种十分友好的机制,与此同时,Spring容器还可以自动组装合作关系bean之间的关系。这意味着Spring可以通过向beang发送 在Factory中注入的方式自动解决了bean之间的依赖关系。Bean在Spring中的自动组装问题一直困扰着许多学习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可以在接口实现中注释,但在userdaoo中发现、还添加了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);

}

}

在对Postservicebean注入时,同时依赖两个bean、postdao和userdao。直接引用beanID,spring会自动从容器中获取这些bean,只要它们的配置正确。在这个例子中,userdaoo、postdao是Mybatis配置自动扫描,将dao接口生成代理注入spring,实际上是xml组装bean。

如果在这里再声明一个bean,返回的仍然是postserviceimpl对象,与之前的bean完全相同,是同一个例子。一般来说,如果spring@bean是同一个beanID,默认返回的是单个bean,注入的是同一个例子。如果修改其中一个,它将被改变。

但是这里要注意测试,因为spring的单元测试和springIoc容器完全独立。postdao和userdao注入检测时,使用locations加载xml文件,而postservice使用clases加载config,但两者不能同时混合在@contextconfiguration中。所以如果非要全部测试,就分开测试。

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

相应的介绍需要在这里介绍 XML 模式(XSD)这些文件定义了配置 Spring 使用idea创建XML文件的XML元素:

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

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

xsi:schemaLocation="https://www.tulingxueyuan.cn/d/file/p/20230329/ydrbkpnnczl https://www.tulingxueyuan.cn/d/file/p/20230329/ydrbkpnnczl/spring-beans.xsd">

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

这一篇Bean在Spring中自动组装策略对你有帮助吗?当然,生动的真实案例是我们快速掌握该技术的最佳辅助,然后与本网站合作Spring专业课更像虎添翼!