Spring初學(僅爲筆記)

本節重點

理解下面名詞的概念:

Spring Bean容器:存放對象的一種技術實現,對象的生命週期由容器進行統一管理

注:容器這個概念,在學框架的時候或者在學servlet以web爲容器,都有觸及這個知識點。


IOC Inversion of Control 控制反轉
        //IOC做了什麼》生命週期不在由程序進行管理,包括new對象的創建,在方法結束之後把它進行銷燬,這些本來由程序代碼僅從處理,現在有Spring容器來進行管理。
        // 總結:對象生命週期統一由Spring Bean容器來管理,這種從手動管理對象,轉變爲Spring容器來管理,也就是控制權發生了反轉。


 DI依賴注入
        //設置對象屬性/依賴的方式
        //1.構造方法
        //2.Setter方法

配置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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--創建一個字符串對象,對象名爲myName,通過new String -->
    <bean id="myName" class="java.lang.String">
        <constructor-arg value="小學生" />
    </bean>

<!--注入的兩種方式:一個是通過構造方法,另一個是通過Setter注入-->
<!--需要有name參數的構造方法進行實現,這裏使用的是構造方法注入-->
    <bean id="duck1" class="owen.ioc.Duck" >
        <!--註釋裏使用的setter注入-->
<!--    <property name="name" ref="myName"/>-->
        <constructor-arg ref="myName"/>
        <property name="age"  value="20"/>
    </bean>
    <!--需要無參的構造方法-->
    <bean id="duck2" class="owen.ioc.Duck">
        <property name="name"  value="LadyGaga"/>
        <property name="age"  value="30"/>
    </bean>
    <bean id="duckShop" class="owen.ioc.DuckShop" scope="prototype">
        <property name="name"  value="學校"/>
        <property name="ducks">
            <list>
                <ref bean="duck1"/>
                <ref bean="duck2"/>
            </list>
        </property>
    </bean>
    <bean id="lifecycle" class="owen.ioc.Lifecycle"/>
</beans>

Main主函數

package owen.ioc;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import java.sql.SQLOutput;

public class Main {
    public static void main(String[] args) {
        //BeanFactory 和ApplicationContext 是Spring提供的IOC容器,下面舉例說明ApplicationContext
        ApplicationContext context = new
                ClassPathXmlApplicationContext("applications.xml");
        //通過名字獲取Bean對象
       /* Object o=context.getBean("duck");
        System.out.println(o.getClass());
        System.out.println(o);*/
       Object duck1=context.getBean("duck1");
       Object duck2=context.getBean("duck2");
       Object duckShop=context.getBean("duckShop");
       Object duckShop2=context.getBean("duckShop");
       System.out.println(duckShop==duckShop2);//作用域爲prototype
        Object lifecycle=context.getBean("lifecycle");
        System.out.println(lifecycle);
       //Spring Bean容器:存放對象的一種技術實現,對象的生命週期由容器進行統一管理
       //IOC Inversion of Control 控制反轉
        //IOC做了什麼》生命週期不在由程序進行管理,包括new對象的創建,在方法結束之後把它進行銷燬,這些本來由程序代碼僅從處理,現在有Spring容器來進行管理。
        // 總結:對象生命週期統一由Spring Bean容器來管理,這種從手動管理對象,轉變爲Spring容器來管理,也就是控制權發生了反轉。
        //DI依賴注入
        //設置對象屬性/依賴的方式
        //1.構造方法
        //2.Setter方法
    }
}
package owen.ioc;

public class Duck {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public Duck(String name) {
        this.name = name;
    }

    public Duck() {
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Duck{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package owen.ioc;

import java.util.List;
public class DuckShop {
    private String name;
    private List<Duck> ducks;

    @Override
    public String toString() {
        return "DuckShop{" +
                "name='" + name + '\'' +
                ", ducks=" + ducks +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public List<Duck> getDucks() {
        return ducks;
    }

    public void setDucks(List<Duck> ducks) {
        this.ducks = ducks;
    }
}
package owen.ioc;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;

public class Lifecycle implements BeanNameAware, BeanFactoryAware,
        ApplicationContextAware, BeanPostProcessor, InitializingBean,
        DisposableBean {
    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("BeanFactoryAware");
    }

    @Override
    public void setBeanName(String s) {
        System.out.println("BeanNameAware");
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        System.out.println("ApplicationContextAware");
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor before");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("BeanPostProcessor after");
        return bean;
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("DisposableBean");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean");
    }
}

文章目錄結構 

運行結果 

"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:D:\Idea2019\IntelliJ IDEA 2019.1\lib\idea_rt.jar=3623:D:\Idea2019\IntelliJ IDEA 2019.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;D:\Workspaces\Java10\spring1\target\classes;D:\Repository\M2Repository\org\springframework\spring-context\5.2.3.RELEASE\spring-context-5.2.3.RELEASE.jar;D:\Repository\M2Repository\org\springframework\spring-aop\5.2.3.RELEASE\spring-aop-5.2.3.RELEASE.jar;D:\Repository\M2Repository\org\springframework\spring-beans\5.2.3.RELEASE\spring-beans-5.2.3.RELEASE.jar;D:\Repository\M2Repository\org\springframework\spring-core\5.2.3.RELEASE\spring-core-5.2.3.RELEASE.jar;D:\Repository\M2Repository\org\springframework\spring-jcl\5.2.3.RELEASE\spring-jcl-5.2.3.RELEASE.jar;D:\Repository\M2Repository\org\springframework\spring-expression\5.2.3.RELEASE\spring-expression-5.2.3.RELEASE.jar;D:\Repository\M2Repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar;D:\Repository\M2Repository\ch\qos\logback\logback-core\1.2.3\logback-core-1.2.3.jar;D:\Repository\M2Repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar" owen.ioc.Main
10:44:11.639 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@6504e3b2
10:44:12.247 [main] DEBUG org.springframework.beans.factory.xml.XmlBeanDefinitionReader - Loaded 5 bean definitions from class path resource [applications.xml]
10:44:12.344 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'lifecycle'
BeanNameAware
BeanFactoryAware
ApplicationContextAware
InitializingBean
10:44:12.370 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'myName'
BeanPostProcessor before
BeanPostProcessor after
10:44:12.556 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'duck1'
BeanPostProcessor before
BeanPostProcessor after
10:44:12.657 [main] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - Creating shared instance of singleton bean 'duck2'
BeanPostProcessor before
BeanPostProcessor after
BeanPostProcessor before
BeanPostProcessor after
BeanPostProcessor before
BeanPostProcessor after
false
owen.ioc.Lifecycle@64f6106c

Process finished with exit code 0

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章