一、Bean基本配置
装配一个 bean和bean的命名
<bean id="car" class="com.smart.fb.Car"/>
1.id的命名规范:必须以字母开始,后面可以是字母、数字、连字符、下划线、句号、冒号等完整约束的符号,逗号和空格都是非法的。如果希望使用特殊字符进行命名,则可以使用name属性。
id和name都可以指定多个名字,名字之间用逗号、分号或者空格进行分割,如:
<bean id="car,123,$car" name="#car1,123,$car" class="com.smart.simple.Car"></bean>
用户可以使用getBean("car1"),getBean("123"),getBean("$car")获取到Ioc容器中的car Bean
spring配置文件不允许出现两个相同id的bean,但是却可以出现两个相同name的bean。多个name相同的 bean,使用getBean(name)获取Bean时,将返回后边声明的那个bean
如果id,name属性都未指定,如
<bean class="com.smart.simple.Car"></bean>
那么spring自动将全限定类名作为Bean的名称,这时用户可以通过getBean("com.smart.simple.Car")获取 bean
二、依赖注入
1.属性注入
指的是使用setXXX()方法注入Bean的属性值或依赖对象,具有可选择性和灵活性高的优点,是实际应用中最常才用的注入方式。
属性注入要求Bean提供一个默认的构造方法,并为需要注入的属性提供对应的 setter方法。
package com.smart.scope;
public class Car {
private String color;
private String brand;
private double price;
public void setPrice(double price) {
this.price = price;
}
public void setBrand(String brand) {
this.brand = brand;
}
public void setColor(String color) {
this.color = color;
}
}
2.配置文件注入
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
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-4.0.xsd">
<bean id="car" class="com.smart.attr.Car">
<property name="brand" value="吉利CT5" />
<property name="maxSpeed" value="100" />
<property name="price" value="1000.00" />
</bean>
<bean id="boss" class="com.smart.attr.Boss">
<property name="car">
<ref parent="car" />
</property>
</bean>
</beans>
java属性命名特殊规范:
一般情况下,属性变量名才都以小写字母开头,特殊情况考虑到一些特定意义的的大写英文缩略词(XML等),必须满足变量的前两个字母要么全部大写,要么全部小写,这样的属性在启动spring容器的时候会报错
3.构造函数注入
按类型匹配入参
<!--构造函数注入:type -->
<bean id="car1" class="com.smart.ditype.Car">
<constructor-arg type="java.lang.String">
<value>红旗CA72</value>
</constructor-arg>
<constructor-arg type="double">
<value>20000</value>
</constructor-arg>
</bean>
按索引匹配入参
<bean id="boss" class="com.smart.auto.Boss" autowire="constructor">
<constructor-arg index="0" value="John"/>
</bean>
联合使用类型和索引匹配入参:用于解决有多个重载的构造方法,且入参数量相同产生的问题
<!--构造函数注入:type&index -->
<bean id="car3" class="com.smart.ditype.Car">
<constructor-arg index="0" type="java.lang.String">
<value>红旗CA72</value>
</constructor-arg>
<constructor-arg index="1" type="java.lang.String">
<value>中国一汽</value>
</constructor-arg>
<constructor-arg index="2" type="int">
<value>200</value>
</constructor-arg>
</bean>
循环依赖问题:解决方法是将构造函数注入方式调整为属性注入方式即可
4.工厂方式注入(不推荐使用,因为工厂方法需要额外的类和代码,这些功能和业务是没有关系的)
非静态工厂方法:由于是非静态的,所以需要先定义一个工厂类的bean
<!-- 工厂方法-->
<bean id="carFactory" class="com.smart.ditype.CarFactory" />
<bean id="car5" factory-bean="carFactory" factory-method="createHongQiCar">
静态工厂:直接在<bean>中通过class属性指定工厂类,然后通过factory-method指定对应的工厂方法
<bean id="car6" class="com.smart.ditype.CarFactory"
factory-method="createCar"></bean>
三、注入参数详解
1.字面值
指可用字符串表示的值,这些值可以通过<value>元素标签进行注入
<![CDATA[]]>作用是让XML解析器将标签中的字符串当做普通文本解析。
2.引用其他bean
<bean id="brand"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject">
<ref bean="car" />
</property>
<property name="targetMethod">
<value>getBrand</value>
</property>
</bean>
<ref>元素有三个属性:
- bean:通过该属性引用同一容器或父容器中的bean
- local:通过该属性只能引用同意配置文件中的bean
- parent:引用父容器中的bean
3.内部bean
如果car只被boss引用,而不被容器中任何其他bean引用,则可以将car以内部bean的方式注入到Boss中
<!-- 内部Bean -->
<bean id="boss2" class="com.smart.attr.Boss">
<property name="car">
<bean class="com.smart.attr.Car">
<property name="maxSpeed" value="200" />
<property name="price" value="2000.00" />
</bean>
</property>
</bean>
4.null值
使用专门的null标签:<null/>
5.级联属性
下边的代码直接为car属性的brand属性赋值
<bean id="sportsCar" class="com.smart.attr.SportsCar">
<property name="brand">
<bean id="car.brand"
class="org.springframework.beans.factory.config.PropertyPathFactoryBean">
</bean>
</property>
</bean>
6.集合类型属性
List
<bean id="favoriteList"
class="org.springframework.beans.factory.config.ListFactoryBean">
<property name="targetListClass" value="java.util.LinkedList" />
<property name="singleton" value="false" />
<property name="sourceList">
<list>
<value>看报</value>
<value>赛车</value>
<value>高尔夫</value>
</list>
</property>
</bean>
Set:使用<set></set>标签,其他同list
Map
<property name="jobs">
<map>
<entry>
<key><value>AM</value></key>
<value>会见客户</value>
</entry>
<entry>
<key><value>PM</value></key>
<value>公司内部会议</value>
</entry>
</map>
</property>