DI:控制反转:IOC是降低依赖关系,DI则是管理程序内的依赖关系。
Spring管理依赖的主要内容是数据的注入以及注入方式。
可注入的数据类型:
- 基本类型和String。
- Bean类型:交给Spring管理的Bean,即IOC托管的Bean。
- 复杂类型/集合类型。
注入的方式:
- 使用构造函数注入
- 使用set注入
- 使用注解注入(详见注解章节)
1.1 使用构造方式
配置文件:bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
两部分: 1.根标签beans的别名:xmlns="http://www.springframework.org/schema/beans"
2.约束文件:schemaLocation引入约束,然后给约束地址起个别名xsi
-->
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--没有constructor-arg标签会class报错,因为本例中的AccountServicesImpl没有默认的无参构造方法了-->
<!--
1.找构造函数中的属性:
type:要注入的数据类型
index:指定要注入的数据给构造方法中指定索引位置的参数赋值。索引从0开始。
name:给指定参数名称赋值。常用的。
2.给属性赋值
value:给基本类型和String赋值。
ref:指赋值其他Bean类型,即在IOC容器中的Bean。
优势:在获取Bean时注入的数据是必须的操作,否则对象无法创建成功。
劣势:改变Bean对象的实例化方式,在用不到这些属性的是也必须提供。所以一般不用。
-->
<bean id="birthday" class="java.util.Date"></bean>
<bean id="accountServices" class="com.springdi.services.AccountServicesImpl">
<constructor-arg name="name" value="xzb"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="birthday"></constructor-arg>
</bean>
</beans>
AccountServicesImpl
public class AccountServicesImpl implements AccountServices {
//经常变化的数据不适用注入
private String name;
private Integer age;
private Date birthday;
public AccountServicesImpl(String name ,Integer age,Date birthday){
this.name = name;
this.age = age;
this.birthday = birthday;
}
@Override
public void saveAccount() {
System.out.println("services"+name+"||"+age+"||"+birthday);
}
}
客户端:
public class client {
public static void main(String[] args) {
ClassPathXmlApplicationContext ApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
AccountServices accountServices = (AccountServices) ApplicationContext.getBean("accountServices");
accountServices.saveAccount();
}
}
结果:
结果.png1.2 使用set注入
简单类型的注入:
配置文件:bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
两部分: 1.根标签beans的别名:xmlns="http://www.springframework.org/schema/beans"
2.约束文件:schemaLocation引入约束,然后给约束地址起个别名xsi
-->
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--set方式注入:使用property
property的属性:
1.找属性:
name:指定注入时调用的方法名称。
2.给属性赋值
value:给基本类型和String赋值。
ref:指赋值其他Bean类型,即在IOC容器中的Bean。
优势:创建对象没有明确限制,可以直接使用默认构造函数。
劣势:如果成员必须有值,则set方法无法一定注入。
-->
<bean id="birthday" class="java.util.Date"></bean>
<bean id="accountServices" class="com.springdi.services.AccountServicesImpl">
<property name="name" value="xzb"></property>
<property name="age" value="20"></property>
<property name="birthday" ref="birthday"></property>
</bean>
</beans>
AccountServicesImpl:
public class AccountServicesImpl implements AccountServices {
private String name;
private Integer age;
private Date birthday;
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public void saveAccount() {
System.out.println("services"+name+"||"+age+"||"+birthday);
}
}
客户端:
public class client {
public static void main(String[] args) {
ClassPathXmlApplicationContext ApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
AccountServices accountServices = (AccountServices) ApplicationContext.getBean("accountServices");
accountServices.saveAccount();
}
}
结果:
结果.png复杂类型的注入:
配置文件bean.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
两部分: 1.根标签beans的别名:xmlns="http://www.springframework.org/schema/beans"
2.约束文件:schemaLocation引入约束,然后给约束地址起个别名xsi
-->
<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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!--set方式注入复杂类型:结构相同,标签可以互换。
List类: List Array Set
Map类: Map Properties
-->
<bean id="accountServices" class="com.springdi.services.AccountServicesImpl">
<property name="myStrs">
<array>
<value>a</value>
<value>b</value>
<value>c</value>
</array>
</property>
<property name="mylist">
<list>
<value>a-list</value>
<value>b-list</value>
<value>c-list</value>
</list>
</property>
<property name="mySet">
<set>
<value>a-set</value>
<value>b-set</value>
<value>c-set</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="a" value="a-map"></entry>
<entry key="b">
<value>b-map</value>
</entry>
</map>
</property>
<property name="myProps">
<props>
<prop key="a">a-prop</prop>
<prop key="b">b-prop</prop>
</props>
</property>
</bean>
</beans>
AccountServicesImpl:
public class AccountServicesImpl implements AccountServices {
private String[] myStrs;
private List<String> mylist;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps;
public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public void setMylist(List<String> mylist) {
this.mylist = mylist;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
}
@Override
public void saveAccount() {
System.out.println(Arrays.toString(myStrs));
System.out.println(mylist);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);
}
}
客户端:
public class client {
public static void main(String[] args) {
ClassPathXmlApplicationContext ApplicationContext = new ClassPathXmlApplicationContext("bean.xml");
AccountServices accountServices = (AccountServices) ApplicationContext.getBean("accountServices");
accountServices.saveAccount();
}
}
结果:
结果.png1.3 Bean的生命周期
Bean的生命周期定义、创建、解析和销毁。
网友评论