天天看點

Spring架構——IOC容器1.IOC作用 2.IOC底層原理 3.IOC的兩種實作方式4.IOC操作Bean管理 5.bean的作用域6.bean的生命周期

目錄

1.IOC作用

2.IOC底層原理

3.IOC的兩種實作方式

    BeanFactory

    ApplicationContext

        ApplicationContext的兩個實作類

4.IOC操作Bean管理 

    4.1基于xml建立對象 

    4.2基于xml注入屬性

    4.3使用set方法注入

    4.4 使用有參構造進行注入

    4.5 p名稱空間注入

4.6注入其他類型屬性--null&特殊符号

4.7外部bean注入

4.7内部bean注入

4.8級聯指派

4.8.1外部bean的方式進行指派

4.8.2get方法注入(需在類中先生成對應屬性的get方法)

4.9注入數組和集合的值

4.9.1純字元串類型

        4.9.2使用Util标簽進行提取注入

4.10工廠bean

5.bean的作用域

6.bean的生命周期

1.IOC作用

           控制反轉--把對象建立和對象之間的調用過程,交給Spring進行管理

           目的--降低耦合度

2.IOC底層原理

            xml解析

            工廠模式

            反射

    注:IOC思想是基于IOC容器完成,IOC容器底層就是對象工廠

3.IOC的兩種實作方式

    BeanFactory

                加載配置檔案時不會建立對象,在擷取(使用)對象時才建立對象

    ApplicationContext

                 BeanFactory接口的子接口,一般由開發人員使用

                加載配置檔案時就會把配置檔案的對象進行建立

        ApplicationContext的兩個實作類

                    FileSystemXmlApplication--使用時要寫類的全路徑

                    ClassPathXmlApplication--使用時隻需要寫對應的資源路徑

總結:IOC思想基于IOC容器完成,IOC容器底層就是對象工廠

4.IOC操作Bean管理 

    Bean管理--Spring建立對象和注入屬性

    4.1基于xml建立對象 

        <bean id="book" class="com.hzj.spring5.Book">

    4.2基于xml注入屬性

        DI:依賴注入,就是注入屬性

     4.3使用set方法注入

            1、建立類,定義屬性和生成對應的set方法

public class Book {
    private String bname;
    private String bauthor;
    //set方法注入
    public void setBname(String bname) {
        this.bname = bname;
    }


    public void setBauthor(String bauthor) {
        this.bauthor = bauthor;
    }

    public String getBname() {
        return bname;
    }

    public String getBauthor() {
        return bauthor;
    }
           

            2、在spring配置檔案中配置對象建立,配置屬性注入

       <bean id="book" class="com.hzj.spring5.Book">
        <!--property中的
            name 對應的類的屬性名
            value 要注入的對應屬性的值
         -->
        <property name="bname" value="hx"></property>
        <property name="bauthor" value="hzj"></property>
    </bean>
           

    4.4 使用有參構造進行注入

            1、建立類,定義屬性,生成有參構造方法

            2、 在Spring配置檔案中進行配置有參注入

public class Order extends Book {
    private String oName;
    private String oAddress;

    public Order(String oName, String oAddress) {
        this.oName = oName;
        this.oAddress = oAddress;
    }
}
           
<!--有參構造注入-->
    <bean id="order" class="com.hzj.spring5.Order">
        <!--name表示對應的參數名 value表示要注入的值-->
        <constructor-arg name="oName" value="hzj"/>
        <constructor-arg name="oAddress" value="中國"/>
    </bean>
           

4.5 p名稱空間注入

        4.5.1添加p名稱在xml配置檔案中

<?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">
           

      在bean标簽中進行屬性注入

<!--p名稱空間注入-->
    <bean id="book" class="com.hzj.spring5.Book" p:bname="p名稱注入" p:bauthor="hzj"></bean>
 
           

4.6注入其他類型屬性--null&特殊符号

在bean标簽中進行屬性注入

null

<!--null 值-->
<property name="address">
 <null/>
</property>
 
           

特殊符号

<!--屬性值包含特殊符号

 1 把<>進行轉義 &lt; &gt;

 2 把帶特殊符号内容寫到 CDATA

-->

<property name="address">

 <value><![CDATA[<<南京>>]]></value>

</property>
           

4.7外部bean注入

1、建立service類和dao類

Dao類        

public class userDaoImpl implements userDao{
    @Override
    public void update() {
        System.out.println("userDap update...");
    }
}
           

service類

​
public class userService {
    private userDao userDao;

    public void setUserDao(userDao userDao) {
        this.userDao = userDao;
    }

    public void add(){
        System.out.println("service add....");
        userDao.update();
    }
}

​
           

2、在spring配置檔案中進行配置

<!--1 service 和 dao 對象建立-->
<bean id="userService" class="com.atguigu.spring5.service.UserService">
 <!--注入 userDao 對象
 name 屬性:類裡面屬性名稱
 ref 屬性:建立 userDao 對象 bean 标簽 id 值
 -->
 <property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>
	@Test
    public void testUser(){
        ApplicationContext context=
                new ClassPathXmlApplicationContext("bean2.xml");
        userService userService = context.getBean("userService", userService.class);
        userService.add();
    }
 
           

3、編寫測試方法

@Test

    public void testUser(){

        ApplicationContext context=

                new ClassPathXmlApplicationContext("bean2.xml");

        userService userService = context.getBean("userService", userService.class);

        userService.add();

    }
           

     4.7内部bean注入

<!--内部 bean-->

<bean id="emp" class="com.atguigu.spring5.bean.Emp">

 <!--設定兩個普通屬性-->

 <property name="ename" value="lucy"></property>

 <property name="gender" value="女"></property>

 <!--設定對象類型屬性-->

 <property name="dept">

 <bean id="dept" class="com.atguigu.spring5.bean.Dept">

 <property name="dname" value="安保部"></property>

 </bean>

 </property>

</bean>
           

4.8級聯指派

4.8.1外部bean的方式進行指派

<bean id="emp" class="com.atguigu.spring5.bean.Emp">

 <!--設定兩個普通屬性-->

 <property name="ename" value="lucy"></property>

 <property name="gender" value="女"></property>

 <!--級聯指派-->

 <property name="dept" ref="dept"></property>

</bean>

<bean id="dept" class="com.atguigu.spring5.bean.Dept">

 <property name="dname" value="财務部"></property>

</bean>
           

4.8.2get方法注入(需在類中先生成對應屬性的get方法)

<!--級聯指派-->
<bean id="emp" class="com.atguigu.spring5.bean.Emp">
 <!--設定兩個普通屬性-->
 <property name="ename" value="lucy"></property>
 <property name="gender" value="女"></property>
 <!--級聯指派-->
 <property name="dept" ref="dept"></property>
 <property name="dept.dname" value="技術部"></property>
</bean>
<bean id="dept" class="com.atguigu.spring5.bean.Dept">
 <property name="dname" value="财務部"></property>
</bean>
 
           

4.9注入數組和集合的值

4.9.1純字元串類型

1、建立類,定義數組,list,map,set類型屬性,生成對應set方法

public class Stu {
    //數組類型屬性
    private String[] courses;
    //list集合類型屬性
    private List<String> list;
    //map集合類型屬性
    private Map<String,String> maps;
    //set集合
    private Set<String> sets;


    public void setCourseList(List<Course> courseList) {
        this.courseList = courseList;
    }

    public void setCourses(String[] courses) {
        this.courses = courses;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }

}
           

2、書寫配置檔案

<bean id="stu" class="com.hzj.spring5.collectionType.Stu">
        <property name="courses">
            <!--數組類型屬性注入-->
            <array>
                <value>sql</value>
                <value>linux</value>
            </array>
        </property>
        <!--list類型屬性注入-->
        <property name="list">
            <list>
                <value>hzj</value>
                <value>hx</value>
            </list>
        </property>
        <!--map類型屬性注入-->
        <property name="maps">
            <map >
                <entry key="Java" value="java"></entry>
                <entry key="C++" value="c++"></entry>
            </map>
        </property>
        <!--set類型屬性注入-->
        <property name="sets">
            <set>
                <value>Mysql</value>
                <value>Redis</value>
            </set>
        </property>
    </bean>
 
           

4.9.2使用Util标簽進行提取注入

1、在Spring配置檔案中引入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">
 
           

2、使用util完成注入提取

<!--提取list集合類型屬性注入-->

    <util:list id="bookList">

        <value>hzj</value>

        <value>hx</value>

        <value>Java課程</value>

    </util:list>

    <!--注入-->

    <bean id="book" class="com.hzj.spring5.collectionType.Book">

        <property name="list" ref="bookList"></property>

    </bean>
           

4.10工廠bean

1、建立類,讓這個類作為工廠bean,實作接口FactoryBean和它的方法

public class MyBean implements FactoryBean<Course> {
 //定義傳回 bean
 @Override
 public Course getObject() throws Exception {
 Course course = new Course();
 course.setCname("abc");
 return course;
 }
 @Override
 public Class<?> getObjectType() {
 return null;
 }
 @Override
 public boolean isSingleton() {
 return false;
 }
}
           

2、配置檔案建立對象

<bean id="myBean" class="com.atguigu.spring5.factorybean.MyBean"></bean>
           

3、測試方法

@Test
public void test3() {
 ApplicationContext context =
 new ClassPathXmlApplicationContext("bean3.xml");
 Course course = context.getBean("myBean", Course.class);
 System.out.println(course);
}
           

5.bean的作用域

 單例對象:當在使用bean建立對象時,設定scope的值未singleton時,為單例模式,加載spring配置檔案時就會建立該單例對象

多例對象:設定 scope 值是 prototype 時候,不是在加載 spring 配置檔案時候建立對象,而在調用getBean 方法時候建立多執行個體對象

6.bean的生命周期

生命周期 :從對象建立到對象銷毀的過程

(1)通過構造器建立 bean 執行個體(無參數構造)

(2)為 bean 的屬性設定值和對其他 bean 引用(調用 set 方法)

(3)把 bean 執行個體傳遞 bean 後置處理器的方法 postProcessBeforeInitialization

(4)調用 bean 的初始化的方法(需要進行配置初始化的方法)

(5)把 bean 執行個體傳遞 bean 後置處理器的方法 postProcessAfterInitialization

(6)bean 可以使用了(對象擷取到了)

(7)當容器關閉時候,調用 bean 的銷毀的方法(需要進行配置銷毀的方法)

public class Orders {
 //無參數構造
 public Orders() {
 System.out.println("第一步 執行無參數構造建立 bean 執行個體");
 }
 private String oname;
 public void setOname(String oname) {
 this.oname = oname;
 System.out.println("第二步 調用 set 方法設定屬性值");
 }
 //建立執行的初始化的方法
 public void initMethod() {
 System.out.println("第三步 執行初始化的方法");
 }
 //建立執行的銷毀的方法
 public void destroyMethod() {
 System.out.println("第五步 執行銷毀的方法");
 }
}
           
//建立類,實作接口 BeanPostProcessor,建立後置處理器
public class MyBeanPost implements BeanPostProcessor {
 @Override
 public Object postProcessBeforeInitialization(Object bean, String beanName) 
throws BeansException {
 System.out.println("在初始化之前執行的方法");
 return bean;
 }
 @Override
 public Object postProcessAfterInitialization(Object bean, String beanName) 
throws BeansException {
 System.out.println("在初始化之後執行的方法");
 return bean;
 }
}
           
​<bean id="orders" class="com.atguigu.spring5.bean.Orders" initmethod="initMethod" destroy-method="destroyMethod">
 <property name="oname" value="手機"></property>
</bean>
<!--配置後置處理器-->
<bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean>sh

​