别名,import,注入
Bean别名的配置
<bean id="user5" class="com.woshi.pojo.User" name="U5,User5,yonghu5">
<constructor-arg name="name" value="吴七"></constructor-arg>
</bean>
name 是别名,也可以通过getBean调用,与alias的作用相同
<alias name="user5" alias="Yonghu5"></alias>
import:引入其他配置文件
<import resource="beans.xml"></import>
<import resource="beans1.xml"></import>
<import resource="beans2.xml"></import>
<import resource="beans3.xml"></import>
<import resource="beans4.xml"></import>
将多个xml文件导入到一个里面(作为总配置文件),这样就可以通过ClassPathXmlApplicationContext来一统调用(虽然ClassPathXmlApplicationContext能够读取多个xml——d=====( ̄▽ ̄*)b
依赖注入(DI)
依赖注入有
基于构造器的注入
<beans>
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg ref="beanTwo"/>
<constructor-arg ref="beanThree"/>
</bean>
<bean id="beanTwo" class="x.y.ThingTwo"/>
<bean id="beanThree" class="x.y.ThingThree"/>
</beans>
假设ThingTwo和ThingThree类没有继承关系,则不存在潜在的歧义(因为例子中没有指定成员变量,属于靠类型来匹配的情况,如果ThingTwo和ThingThree是继承关系,可能会发生类型转换而导致注入错误却不报错)。
基于构造器的注入其实是通过调用对应对象相应的构造器实现的。调用一个静态的工厂方法(带有构造bean的特定参数)也是差不多的 。
构造器注入适用于创建不需要经常变动的对象,因为构造器注入的组件始终以完全初始化的状态返回到调用处的代码,并且能保证所需要的依赖项不为null。
关于基于构造器配置对象的一些使用:https://www.cnblogs.com/woshi123/p/12436784.html
-
拓展:c命名空间的注入
<bean id="user2" class="com.woshi.entity.User" c:age="18" c:name="李四"></bean>
c: 相当于constructor-arg ,是基于构造器的注入
set方式注入
Student对象
public class Student {
private String name;
private Integer age;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String,Long> card;
private Set<String> games;
private Student girlfriend;
private Properties info;
//...各个成员变量的set方法
}
对应的bean对象装配
<bean id="address" class="com.woshi.entity.Address">
<property name="address" value="中国"></property>
</bean>
<bean id="girlstudent" class="com.woshi.entity.Student"></bean>
<bean id="student" class="com.woshi.entity.Student">
<!--依赖基本数据包装类注入-->
<property name="name" value="张三"></property>
<!--注入null-->
<property name="age">
<null/>
</property>
<!--依赖对象注入-->
<property name="address" ref="address"></property>
<!--依赖数组注入-->
<property name="books">
<array>
<value>红楼梦</value>
<value>三国演义</value>
<value>水浒传</value>
<value>西游记</value>
</array>
</property>
<!--依赖List注入-->
<property name="hobbies">
<list>
<value>打篮球</value>
<value>玩游戏</value>
</list>
</property>
<!--依赖Map注入-->
<property name="card">
<map>
<entry key="身份证" value="12309812039238457"></entry>
<entry key="学生证" value="8888888888888"></entry>
</map>
</property>
<!--依赖Set注入-->
<property name="games">
<set>
<value>lol</value>
<value>gal</value>
</set>
</property>
<!--依赖对象注入-->
<property name="girlfriend" ref="girlstudent"></property>
<!--依赖property注入-->
<property name="info">
<props>
<prop key="id">0129384</prop>
<prop key="name">张三</prop>
<prop key="username">stuZhang</prop>
<prop key="password">123456</prop>
</props>
</property>
</bean>
set注入主要应用于一些类中的可选择依赖项,也就是允许了,当对象初始化完成时,存在着一些依赖项为null。
set注入的两一个好处时,可使类的对象在以后重新配置或注入。
set还可以配置循环注入,即A依赖于B,B依赖于A,构造器配置则不能实现这种,会引发:BeanCurrentlyInCreationException。
-
拓展:p命名空间注入
<bean id="user" class="com.woshi.entity.User" p:age="18" p:name="张三"></bean>
p: 的作用就相当于property ,是基于set方法和无参构造器的注入
depends-on注入(严格来讲不算是注入)
```xml
<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
<property name="manager" ref="manager" />
</bean>
<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />
```
一个bean是另一个bean的依赖项的话,通常可以使用ref元素或标签来完成依赖注入。
但是,有时bean之间的依赖不太直接,该depends-on属性可以在初始化使用此元素的bean之前显式强制初始化一个或多个bean。
depends-on会影响“关机顺序”:在bean被销毁时,depends-on指定的bean,会先被销毁。
idref:把配置文件中的bean的id当作字符串,而不当作ref引用
<bean id="theTargetBean" class="..."/>
<bean id="theClientBean" class="...">
<property name="targetName">
<idref bean="theTargetBean"/>
</property>
</bean>