目录
搭建环境
pom.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>chapter07</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.8.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>5.0.8.RELEASE</version>
</dependency>
</dependencies>
</project>
applicationContext.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:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 通过构造器注入成员变量的值 -->
<bean id="student" class="com.qfedu.bean.Student">
<constructor-arg name="sid" value="1"/>
<constructor-arg name="name" value="ZhangSan"/>
<constructor-arg name="age" value="20"/>
<constructor-arg name="course" value="Java"/>
</bean>
<bean id="teacher" class="com.qfedu.bean.Teacher">
<property name="tid" value="1"></property>
<property name="name" value="LiSi"></property>
</bean>
<bean id="mix" class="com.qfedu.bean.Mix">
<!-- 注入List-->
<property name="myList">
<list>
<value>list01</value>
<value>list02</value>
</list>
</property>
<!-- 注入map-->
<property name="myMap">
<map>
<entry key="key01" value="map01"></entry>
<entry key="key02" value="map02"></entry>
</map>
</property>
<!-- 注入array-->
<property name="myArray">
<array>
<value>array01</value>
<value>array02</value>
</array>
</property>
</bean>
<!--school测试1-->
<!-- <bean id="school" class="com.qfedu.bean.School">-->
<!-- <property name="stu">-->
<!-- <ref bean="student"></ref>-->
<!-- </property>-->
<!-- </bean>-->
<!-- school测试2-->
<!-- <bean id="school" class="com.qfedu.bean.School">-->
<!-- <property name="stu" ref="student"></property>-->
<!-- </bean>-->
<!--school测试3-->
<bean id="school" class="com.qfedu.bean.School" p:sid="1" p:stu-ref="student"></bean>
<!-- SpEL注入-->
<bean id="employee" class="com.qfedu.bean.Employee">
<property name="eid" value="1"></property>
<property name="name" value="WangWu"></property>
<property name="department" value="研发部"></property>
</bean>
<bean id="person" class="com.qfedu.bean.Person">
<property name="pid" value="#{employee.eid}"></property>
<property name="name" value="#{employee.name}"></property>
</bean>
<!-- Bean的配置-->
<bean id="person01" class="com.qfedu.bean.Person"></bean>
<bean id="person02" class="com.qfedu.bean.Person" scope="prototype"></bean>
<!-- Bean的生命周期-->
<!-- <bean id="bean01" class="com.qfedu.bean.Bean01" init-method="init">-->
<!-- <property name="bid" value="1" />-->
<!-- <property name="name" value="xiaoqian"></property>-->
<!-- </bean>-->
<!-- <bean id="bean02" class="com.qfedu.bean.Bean02">-->
<!-- <property name="bid" value="1" />-->
<!-- <property name="name" value="xiaoqian"></property>-->
<!-- </bean>-->
<!-- <bean id="bean03" class="com.qfedu.bean.Bean03" destroy-method="close">-->
<!-- <property name="bid" value="1" />-->
<!-- <property name="name" value="xiaoqian"></property>-->
<!-- </bean>-->
<!-- <bean id="bean04" class="com.qfedu.bean.Bean04">-->
<!-- <property name="bid" value="1" />-->
<!-- <property name="name" value="xiaoqian"></property>-->
<!-- </bean>-->
<!-- 注解-->
<context:component-scan base-package="com.qfedu.bean"></context:component-scan>
</beans>
1 Bean的配置
1.1 注入方式
1.1.1 注入集合
Mix.class
package com.qfedu.bean;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Mix {
private List<String> myList;
private Map<String,String> myMap;
private String[] myArray;
//set方法
public void setMyList(List<String> myList) {
this.myList = myList;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public void setMyArray(String[] myArray) {
this.myArray = myArray;
}
//toString方法
@Override
public String toString() {
return "Mix{" +
"myList=" + myList +
", myMap=" + myMap +
", myArray=" + Arrays.toString(myArray) +
'}';
}
}
TestSpring03.class
package com.qfedu.test;
import com.qfedu.bean.Mix;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring03 {
public static void main(String[] args) {
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("applicationContext.xml");
Mix mix = applicationContext.getBean("mix", Mix.class);
//输出Mix类对象的信息
System.out.println(mix);
}
}
TestSpring03测试结果
1.1.2 注入其它Bean
School.class
package com.qfedu.bean;
public class School {
private int sid;
private Student stu;
// get/set方法
public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public Student getStu() {
return stu;
}
public void setStu(Student stu) {
this.stu = stu;
}
}
TestSpring04.class
package com.qfedu.test;
import com.qfedu.bean.School;
import com.qfedu.bean.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring04 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
School school = applicationContext.getBean("school", School.class);
// 通过school获取student对象,并输出Student对象的xinxi
Student stu = school.getStu();
System.out.println(stu);
}
}
TestSpring04测试结果
1.1.3 使用P:命名空间注入
TestSpring05.class
package com.qfedu.test;
import com.qfedu.bean.School;
import com.qfedu.bean.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring05 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
School school = applicationContext.getBean("school", School.class);
int sid = school.getSid();
System.out.println("sid:"+sid);
Student stu = school.getStu();
System.out.println(stu);
}
}
TestSpring05测试结果
1.1.4 使用SpEL注入
Person.class
package com.qfedu.bean;
public class Person {
private int pid;
private String name;
public void setPid(int pid) {
this.pid = pid;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"pid=" + pid +
", name='" + name + '\'' +
'}';
}
}
TestSpring06.class
package com.qfedu.test;
import com.qfedu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring06 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Person person = applicationContext.getBean("person", Person.class);
System.out.println(person);
}
}
TestSpring06测试结果
1.2 Bean的作用域
测试说明singleton返回共享实例,prototype返回新的实例。
TestSpring07.class
package com.qfedu.test;
import com.qfedu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring07 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// person01实例
Person person01_1 = applicationContext.getBean("person01", Person.class);
Person person01_2 = applicationContext.getBean("person01", Person.class);
// person01实例
Person person02_1 = applicationContext.getBean("person02", Person.class);
Person person02_2 = applicationContext.getBean("person02", Person.class);
// 判断两次获取的实例是否相等
System.out.println(person01_1==person01_2);
System.out.println(person02_1==person02_2);
}
}
TestSpring07测试结果
1.3 Bean的生命周期
1.3.1 Bean实例初始化之前
Bean01.class
package com.qfedu.bean;
public class Bean01 {
private String bid;
private String name;
public Bean01() {
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bean01{" +
"bid='" + bid + '\'' +
", name='" + name + '\'' +
'}';
}
public void init(){
System.out.println("Bean的初始化完成,调用init()方法");
System.out.println(this.toString());
}
}
Bean02.class
package com.qfedu.bean;
import org.springframework.beans.factory.InitializingBean;
public class Bean02 implements InitializingBean {
private String bid;
private String name;
//无参构造
public Bean02() {
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bean02{" +
"bid='" + bid + '\'' +
", name='" + name + '\'' +
'}';
}
public void afterPropertiesSet() throws Exception {
System.out.println("Bean的初始化完成,调用afterPropertiesSet()方法");
System.out.println(this.toString());
}
}
TestSpring08.class
package com.qfedu.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring08 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
}
}
TestSpring08测试结果
1.3.2 Bean实例销毁之前
Bean03.class
package com.qfedu.bean;
public class Bean03 {
private String bid;
private String name;
public Bean03() {
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bean03{" +
"bid='" + bid + '\'' +
", name='" + name + '\'' +
'}';
}
public void close(){
System.out.println("Bean实例即将销毁,调用claose()方法");
System.out.println(this.toString());
}
}
Bean04.class
package com.qfedu.bean;
import org.springframework.beans.factory.DisposableBean;
public class Bean04 implements DisposableBean {
private String bid;
private String name;
public Bean04() {
}
public String getBid() {
return bid;
}
public void setBid(String bid) {
this.bid = bid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Bean04{" +
"bid='" + bid + '\'' +
", name='" + name + '\'' +
'}';
}
public void destroy() throws Exception {
System.out.println("Bean实例即将销毁,调用destroy() 方法");
System.out.println(this.toString());
}
}
TestSpring09.class
package com.qfedu.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring09 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 关闭容器,此时Bean实例即将被销毁
AbstractApplicationContext ac = (AbstractApplicationContext) applicationContext;
ac.registerShutdownHook();
}
}
TestSpring09测试结果
2 注解
Sch.class
package com.qfedu.bean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Component("sch")
@Scope(scopeName = "singleton")
public class Sch {
@Value("005")
private String sid;
@Autowired
@Qualifier("stu")
private Stu stu;
public String getSid() {
return sid;
}
public void setSid(String sid) {
this.sid = sid;
}
public Stu getStu() {
return stu;
}
public void setStu(Stu stu) {
this.stu = stu;
}
@Override
public String toString() {
return "Sch{" +
"sid='" + sid + '\'' +
", stu=" + stu +
'}';
}
@PostConstruct
public void init(){
System.out.println("Bean的初始化完成,调用init()方法");
}
@PreDestroy
public void destroy(){
System.out.println("Bean的初始化完成,调用destroy()方法");
}
}
TestSpring10.class
package com.qfedu.test;
import com.qfedu.bean.Sch;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestSpring10 {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Sch sch = applicationContext.getBean("sch", Sch.class);
System.out.println(sch);
AbstractApplicationContext ac = (AbstractApplicationContext) applicationContext;
ac.registerShutdownHook();
}
}
2.1 先导包
2.2 修改applicationContext.xml配置
TestSpring10测试结果