一、IOC
1. 什么是IOC
- 控制反轉,把物件創建核對物件之間的呼叫程序,交給Spring進行管理
2. IOC的目的
- 為了耦合度降低
3. IOC的底層原理
- xml決議
- 工廠模式
- 反射
4. IOC程序
- 創建xml組態檔,配置創建的物件
<bean id="user" class="com.github.entity.User" > </bean>
- 創建工廠類
class UserFactory{
public static User getUser(){
String class = class的屬性值 // xml決議獲得類的名稱
Class clazz = Class.forName(class); //通過反射創建物件
return (User)clazz.newInstance();
}
}
5. BeanFactory介面
- IOC思想基于IOC容器完成,IOC容器底層就是物件工廠
- Spring提供IOC容器實作的倆種方式——兩個介面
- BeanFactory:IOC容器基本實作,是Spring內部的使用介面,不提供開發人員進行使用
加載組態檔時候不會創建物件,在獲取物件使用才去創建物件- ApplicationContext:BeanFactory的子介面,提供更多更強大的功能,一般由開發人員進行使用
加載組態檔時候就會把組態檔的物件進行創建- ApplicationContext介面有實作類

二、IOC操作Bean管理
1. 什么是Bean管理
- Spring創建物件
- Spring注入屬性
2. Bean管理的兩種操作方式
- 基于xml配置方式實作
- 基于注解方式實作
3. 基于XML方式
3.1 創建物件
- 首先創建一個User類
public class User {
private String name;
private Integer age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public User(String name, Integer age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public User(){
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
public void add(){
System.out.println("hello");
}
}
- 配置xml檔案
<bean id="user" class="com.github.entity.User"></bean>
- 在Spring組態檔中,使用bean標簽,標簽里面添加對應屬性,就可以實作物件創建
- 在bean標簽里有很多屬性,下面是常用的屬性
- id屬性:唯一標識
- class屬性:類全路徑
- name屬性:也是標識,里面可以存在特殊字符
- scope屬性:確定是否為單例物件
3.2 注入屬性
- DI:依賴注入,就是注入屬性
3.2.1 set 方式注入
- 配置xml檔案
<!-- set注入屬性 -->
<bean id="user" class="com.github.entity.User">
<!-- 使用property完成屬性注入
name: 類里面屬性名稱
value:向屬性注入的值
-->
<property name="name" value="zhangsan"></property>
<property name="age" value="15"></property>
<property name="gender" value="男"></property>
</bean>
3.2.2 使用有參構造進行注入
- 配置xml檔案
<bean id="user1" class="com.github.entity.User">
<constructor-arg name="name" value="wu"></constructor-arg>
<constructor-arg name="age" value="16"></constructor-arg>
<constructor-arg name="gender" value="女"></constructor-arg>
</bean>
3.2.3 p名稱空間注入
- 使用p名稱空間注入,可以簡化基于xml的配置方式
- 添加p名稱空間在組態檔中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
- 配置xml檔案
<bean id="user2" class="com.github.entity.User" p:name="李四" p:age="21" p:gender="男"> </bean>
3.2.4 注入字面量
- 擴展User類
private String address;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
- NuLL值
<bean id="user3" class="com.github.entity.User">
<property name="name" value="zhangsan"></property>
<property name="age" value="15"></property>
<property name="gender" value="男"></property>
<property name="address">
<null></null>
</property>
</bean>
- 屬性中包含特殊符號
<bean id="user4" class="com.github.entity.User">
<property name="name" value="zhangsan"></property>
<property name="age" value="15"></property>
<property name="gender" value="男"></property>
<property name="address">
<value><![CDATA[<<西安>>]]></value>
</property>
</bean>
- 測驗類結果

3.2.5 注入屬性-外部bean
- 創建兩個類
public class Dept {
private String dname;
public Dept() {
}
public void setDname(String dname) {
this.dname = dname;
}
}
public class Emp {
private String name;
private Integer age;
private Dept dept;
public Emp() {
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
public void setDept(Dept dept) {
this.dept = dept;
}
@Override
public String toString() {
return "Emp{" +
"name='" + name + '\'' +
", age=" + age +
", dept=" + dept +
'}';
}
}
xml組態檔
<bean id="emp" class="com.github.entity.Emp">
<property name="name" value="zhangsan"></property>
<property name="age" value="20"></property>
//級聯的一種
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.github.entity.Dept">
<property name="dname" value="研發"></property>
</bean>
3.2.6 注入屬性-內部bean
- xml配置
<bean id="emp" class="com.github.entity.Emp">
<property name="name" value="zhangsan"></property>
<property name="age" value="20"></property>
<property name="dept">
<bean id="dept" class="com.github.entity.Dept">
<property name="dname" value="研發"></property>
</bean>
</property>
</bean>
3.2.7 注入屬性-級聯賦值
- 級聯賦值需要getter方法
public Dept getDept() {
return dept;
}
- xml組態檔
<bean id="emp" class="com.github.entity.Emp">
<property name="name" value="zhangsan"></property>
<property name="age" value="20"></property>
<property name="dept" ref="dept"></property>
<property name="dept.dname" value="技術部"></property>
</bean>
<bean id="dept" class="com.github.entity.Dept">
</bean>
3.2.8 注入集合屬性
- 注入陣列型別屬性
- 注入List集合型別屬性
- 注入Set集合型別屬性
- 注入Map集合型別屬性
package com.github.entity;
import java.awt.*;
import java.util.*;
import java.util.List;
public class CollcetionSum {
private String[] string;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
public void setString(String[] string) {
this.string = string;
}
public void setList(List list) {
this.list = list;
}
public void setSet(Set set) {
this.set = set;
}
public void setMap(Map map) {
this.map = map;
}
@Override
public String toString() {
return "CollcetionSum{" +
"string=" + Arrays.toString(string) +
", list=" + list +
", set=" + set +
", map=" + map +
'}';
}
}
<bean id="collectSum" class="com.github.entity.CollcetionSum">
<property name="string">
<array>
<value>語文</value>
<value>數學</value>
</array>
</property>
<property name="list">
<list>
<value>張安</value>
<value>李四</value>
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key2" value="value2"></entry>
</map>
</property>
<property name="set">
<set>
<value>123</value>
<value>456</value>
</set>
</property>
</bean>
</beans>
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans4.xml");
CollcetionSum collcetionSum = context.getBean("collectSum",CollcetionSum.class);
System.out.println(collcetionSum);
}

- 集合里面設定物件型別值
<bean id="dept" class="com.github.entity.Dept">
<property name="dname" value="研發"></property>
</bean>
<bean id="listClass" class="com.github.entity.ListClass">
<property name="list">
<list>
<ref bean="dept"></ref>
</list>
</property>
</bean>
- 把集合注入部分提取出來
- 添加名稱util空間
<?xml version="1.0" encoding="UTF-8"?>
<!--
添加名稱空間
-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
- 配置xml檔案
<bean id="dept" class="com.github.entity.Dept">
<property name="dname" value="研發"></property>
</bean>
<util:list id="deptlist">
<ref bean="dept"></ref>
</util:list>
<bean id="listClass" class="com.github.entity.ListClass">
<property name="list" ref="deptlist"></property>
</bean>
3.3 FactoryBean
- Spring有倆種型別bean,一種為普通bean,另一種為工廠bean(FactoryBean)
- 普通bean:在組態檔中定義bean型別就是回傳型別
- 工廠bean:在組態檔中定義bean型別可以和回傳型別不一樣
3.3.1 如何實作
- 創建類,讓這個類作為工廠bean,實作介面FactoryBean
- 實作介面里面的方法,在實作的方法中定義回傳的bean型別
- 創建類
public class MyBean implements FactoryBean<Dept> {
@Override
public Dept getObject() throws Exception {
Dept dept = new Dept();
dept.setDname("145");
return dept;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
}
- 配置xml
<bean id="mybean" class="com.github.entity.MyBean"> </bean>
- 撰寫測驗類
public void test2(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Dept dept = context.getBean("mybean",Dept.class);
System.out.println(dept);
}
4.xml自動裝配
4.1 什么是自動裝配
- 根據指定裝配規則,Spring自動將匹配的屬性值進行注入
4.2 自動裝配程序
- bean標簽的autowire屬性,配置自動裝配
1.byName:根據屬性名稱注入
2. byType:根據屬性型別注入
- xml組態檔
<bean id="emp" class="com.github.entity.Emp" autowire="byType">
</bean>
<bean id="dept" class="com.github.entity.Dept">
</bean>
<bean id="emp" class="com.github.entity.Emp" autowire="byName">
</bean>
<bean id="dept" class="com.github.entity.Dept">
</bean>
5.引入外部資源檔案
- 引入context名稱空間
- 組態檔
<context:property-placeholder location="classpath:djbc.properties"></context:property-placeholder>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259458.html
標籤:java
