本节重点
理解下面名词的概念:
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