本節重點
理解下面名詞的概念:
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