spring对于bean的javaconfig,xml,自动装配三种装配方式实现

本文深入探讨Spring框架中的依赖注入机制,包括构造器注入、属性注入等不同方式,并讲解了自动装配、组件扫描等功能,以及XML配置与Java配置的对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//强依赖通过构造器注入,可选性注入使用属性注入
装配bean
创建应用对象之间的协作关系叫装配,DI的本质
//尽量使用自动配置的机制
xml显示装配
<context:component-Scan base-package="包名">//自动装配包内bean的xml语句

隐式bean发现机制和 自动装配
组件扫描 spring自动发现应用上下文创建的bean
自动装配 spring自动满足bean之间的依赖
组件扫描
@Component注解,自动扫描是不开的@ComponentScan开启,不配置
默认扫描与配置类相同的包,spring扫这个包和包下所有子包查找有
@Component,然后自动创bean
@Runwith(SpringJunit4ClassRunner.class)可以在测试时自动创建应用上下文
注解@ContextConfiguration(classes = CDplayerConfig.class)说明需要在
CDPlayerConfig类加载配置
组件扫描bean命名:将第一个字母小写
修改bean命名:@Component("名字"),注解为bean时直接命名
还可以使用@Name(“名字”)设置id
大部分@name和@Component可以互换
@ComponentScan设置基础包:“@ComponentScan("包名"),
@ComponentScan(basePackages = "包名"),
复数@ComponentScan(basePackages = "包名,包名")
因为包名是String但会有not type-safe
指定为保重包含的类或接口会比较好
@componentScan(basePackageClasses={CDPlayer.class,DVDPlayer.class})
一样会扫描这些类或者接口所在的包
也可创建一个空标记接口,避免要把有些应用代码重构的时候去除
自动装配
@autowired注解 可用于构造器 会自动在实例化时候传入一个可以设置对应
参数的bean,setter方法也可以自动装配,其他方法也会满足方法参数上所
说明的依赖,数量会是有几个bean就尽量满足几个
如果没有会在应用上下文创建抛出异常,@AutoWired(required=false)则不会
抛出异常,没有bean配置就处于未装配状态,如果没有null检查有可能NullpointerException
如果有多个满足bean装载则会报出没有明确定义的那个bean注入
@Inject也可以注入和@Name与@Component可以互换一样
多数情况下@Inject可以和@AutoWired互换
@Rule
public final StandardOutputStreamLog log =
new StandardOutputStreamLog();
方法中{asserEquals{"识别的System.out.print的输出字符",log.getLog{}}}
用于断言识别String是否打印在服务台

spring会在初始化后尽量去满足装配的依赖关系

java显示装配 比xml安全也强大
javaConfig 不包括业务逻辑代码,也不会侵入业务逻辑代码
@Configuration注解表明这是一个配置类,应该包含在Spring应用
上下文如何创建bean的细节
@Bean用于方法会告诉Spring这个方法会返回一个对象,该对象
会注册成为Bean,方法体包含了最终参数bean实例的逻辑,ID和注解
的方法名一样
修改名字@bean(name=“名字”)
这样的对于注入的bean我们可以自定义,也可以确定多种实现接口的类进入
一个bean,而且跟方法名绑定只要返回对象时接口就可以有多实体类多样性

javaConfig怎么装配:@bean只要注解一个方法,Spring会拦截所有对这个方法
的调用并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用
Spring默认的bean都是单例的不会创建第二完全相同的实例,所以Spring会拦截
对于方法的调用并确保返回的是Spring创建的bean
用@bean不指名创建的bean使用地方,在创建这个bean时能借助这个技术将
创建这个bean需要的参数自动装配到对应的参数中,方法体就可使用还不用明确
引用的@Bean的方法,这是一般引用其他bean最佳选择,因为可以不用声明在同
一个配置类中,在方法体中时可以写入任何方法来实现装配
xml装配
配置文件以<beans>为跟
<?xml version = "1.0" encoding = "utf-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmls:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://www.springframework.org/shema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context">
</beans>
声明的是xml模式文件,可借助Spring Tool Suite
选择File>New>Spring Bean Configuration File,能创建xml配置文件而且可以
选择可用配置命名空间
<bean class ="全限定类名">类似于@bean因为没有id所以命名为
全限定类名#0,#0是计数加入id=“名字”就可以命名
优缺点:不需要创建实例,Spring会默认调用默认构造器,所以没有那么多得
自主和自我定义没有变动就是最简单的,而且传入的Class是个String,如果修改
了类名,就需要修改配置文件、
IDE可以检查xml的合法性
xml配置
//setter注入,c-命名空间只有构造器注入
  1. <bean id="UserManagerImpl" class="com.shuitian.spring.manager.UserManagerImpl">  
         <!-- 使用property注入对象 -->             <property   name = "userDao"   ref = "userDao4Mysql" />         </bean>
<constructor-arg>//构造方法注入
<bean id="cdPlayer" class="注入的全类名">
<construction-arg ref="bean的id"/>
</bean>
c-命名空间
<?xml version="1.0" encoding="UTF-8">
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http://www.springframework.org/shcema/c"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation ="http://www.springframework.org/shema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="cdPlayer" class="全类名"
c:cd-ref="“参数bean的id">
</beans>
c为c-命名空间前缀 cd为构造器参数名-ref为注入bean引用的约定
需要把调试标志保存在类代码中,所以可以用_0代替cd来确定参数顺序
或者单个不用cd直接_

如果只要字面量值装配对象
//xml传参
<bean id="bean的id" class="全类名">
<constructor-arg value ="String值"/>
</bean>

//c-命名空间
<bean id=“bean的id"
class="soundsystem.BlankDisc"
c:_0="String值"/>

装配集合
当集合为null//有个StringList
<bean id="' class="">
<constructor-arg value="1">
<constructor-arg value="2">
<constructor-arg><null/></constructor-arg>
</bean>
不为空的时候
<bean id="' class="">
<constructor-arg value="1">
<constructor-arg value="2">
<constructor-arg>
<list>
<value>1</value>
<value>2</value>
<value>3</value>
<value>4</value>
</list>
</constructor-arg>
</bean>
list是construction的子元素value也可以用<re
f>来代替
换成就是<list><ref bean="1"/></list>
还有<set>和<list>效果一致主要看装配时候是要那个
c-命名空间无法装配集合
xml装配属性
<bean id="被注入的id"
class="被注入的全类名">
<property name="注入的属性名" ref=“注入的id”>
</bean>
setter使用p命名空间进行了装配
<bean id=""
class=""
p:compactDisc-ref ="注入的bean的id">
</bean>
compactDisc为属性名-ref注入bean引用

p-命名空间和c-命名空间都不可以装载集合
p命名空间加载String
<bean id=""
class=""
p:title=""
p:artist="">
<property name = "tracks">
<list>
<value>""</value>
<value>""</value>
<value>""</value>
</list>
</property>
</bean>

util-命名空间简化BlankDiscbean
<>xml version="1.0" encoding="utf-8"?>
<beans xmlns = "http://www.springframework.org/schema/bean"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/shcema/p"
xmlns:util="http://www.springframework.org/shcema/util"
xsi:schemaLocation ="http://www.springframework.org/shema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"
http://www.springframework.org/schema/util/spring-util/xsd">
</bean>

借助util命名空间可以将list拿出bean单独把声明到bean中,单独创建一个列表
bean,然后注入就好了
<util:list id="列表id">
<value></value>
<value></value>
<value></value>
</util:list>

<bean id="被注入的id"
class = "被注入的全类名"
p:title =""
p:artist = ""
p:tracks-ref =""/>

util有<util:constant> 引用某个类型public static域,并将其暴露为bean
<util:lis><util:map><util:set
<util:properties> 创建java.util.properties类型的bean//java.util.properties是键值对的形式存储
<util:property-path> 引用一个bean属性, 暴露其为bean

两个bean分开不同类后
@Import注解会导入bean在配置类中
@import(CDconfig.class)

javaconfig引用xml
当其中一个bean在xml里面,将两个bean装载到一起
@importResource注解
@Configuration
@import("第一个装载bean1的类")
@ImportResource("classpaht:xml文件路径")
public class SoundSystemConfig{}
两个bean都会装载进来,因为CDplayer带有@Bean注解的方法接受一个
compactDisc作为参数,因此BlankDisc将会装配进来,此时与他是通过
xml配置的没有任何关系,但如果没有也会装载

xml配置引用另外一个xml配置
<bean class="soundsystem.CDConfig">
<import resource="另外一个配置文件地址"/>
xml配置中引用javaconfig
<bean class ="java装载bean的全类名"/>
<bean id=""
class=""
c:cd-ref=""/>

更多用来众合的xml
<bean class=""/>
<import resource=""/>
<context:component-scan> 也可以开启自扫

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值