Spring超详细讲解
一、Spring是什么?
Spring简单来说就是容器框架。
- Spring的核心概念(Application和Bean)
ApplicationContext(应用程序上下文)和Bean(Bean其实就是对象,Spring把对象称为Bean)。ApplicationContext是容器,用来容纳Bean,
Bean是可以被Spring管理的对象。 - Spring的核心功能
对象的发现,创建,配置,管理。
-Spring的功能
此功能非彼功能,这里的功能是指Spring主要干什么。Spring的特点就是IOC(控制反转)和AOP(面向切面编程)。
二、IOC(控制反转)
IOC反转的是对象的控制权,IOC是概念非技术。在之前的程序中,我们一般用两种方式创建对象:new和newInstance(),这样创建的对象属于强引用对象,jvm垃圾回收机制永远不会回收这类对象,这时候需要手动移除引用。如果没有移除,这个对象将一直存在,久而久之,会引起内存泄露问题。
Spring创建的对象可以避免此问题,而且,还可以指定对象的生命周期和对象之间的关系。IOC思想把对象的控制权拿了回来,实现了松散耦合。
1.ApplicationContext(应用程序上下文)
大概知道了IOC是什么意思,现在对程序实现IOC。反转对象的控制权,Application就是用来存放,管理spring注入的Bean的容器。
Application大致分为三类:xmlApplicationContext,AnnotationConfigApplicationContext,WebApplicationContext。
今天先讲xmlApplicationContext,xmlApplicationContext字面意思就是用xml配置应用程序上下文。xmlApplicationContext又分为ClassPathXmlApplicationContext和FileSystemXmlApplicationContext。用ClassPathXmlApplicationContext的比较多,演示ClassPathXmlApplicationContext。
(PS:项目使用的是maven)
第一:创建 ClassPathXmlApplicationContext 对象,把注入对象的xml文件写入对象里。
ClassPathXmlApplicationContext context=
new ClassPathXmlApplicationContext("beans.xml");
第二:创建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">
<bean id="linghuchong" class="springdemo.Student"><!--class 是实体类地址-->
<property name="id" value="1001"/><!---property 属性,表示对象的属性 name表示参数名 value 表示参数值-->
<property name="name" value="令狐冲"/>
<property name="gender" value="男"/>
<property name="studentClass" ref="class01"/><!--ref 引入其他对象 -->
</bean>
<bean id="yuelingshan" class="springdemo.Student" scope="prototype"><!--scope 表示生命周期 一般默认为 siglenton-->
<constructor-arg value="1002"/>
<constructor-arg value="岳灵珊"/>
<constructor-arg value="女"/>
<constructor-arg ref="class01"/>
</bean>
<bean id="class01" class="springdemo.StudentClass">
<property name="id" value="01"/>
<property name="name" value="高软一班"/>
<property name="department" value="信息工程系"/>
</bean>
<bean id="renyingying" class="springdemo.Students"
factory-method="createStudent"/>
</beans>
scope表示对象的生命周期,siglenton是默认的,可以不用设置。prototype表示Bean被调用一次,就会创建一个对象,可以创建多个对象
第三:创建实体类
package springdemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import springdemo.StudentClass;
public class Student {
private String id;
private String name;
private char gender;
@Autowired
private StudentClass studentClass;
public Student() {
}
public Student(String id, String name, char gender, StudentClass studentClass) {
this.id = id;
this.name = name;
this.gender = gender;
this.studentClass = studentClass;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public StudentClass getStudentClass() {
return studentClass;
}
public void setStudentClass(StudentClass studentClass) {
this.studentClass = studentClass;
}
}
package springdemo;
import org.springframework.stereotype.Component;
public class StudentClass {
private String id;
private String name;
private String department;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
第四:实现对象的调用
@Test
public void student() {
Student s1 = (Student)context.getBean("linghuchong");/*getBean("Bean的id")返回object类型*/
s1.setId("1001");
Assert.assertEquals("1001", s1.getId());
Student s2 = (Student)context.getBean("yuelingshan");
s2.setId("1002");
Assert.assertEquals("1002", s2.getId());
}
@Test
public void getBeanByClass() {
StudentClass studentClass = context.getBean(StudentClass.class);/*getBean(StudentClass.class) 返回的是指定类型*/
Assert.assertNotNull(studentClass);
Assert.assertEquals("01", studentClass.getId());
}
运行Test方法,即可
总结
以上就是今天要讲的内容,本文仅仅简单介绍了使用set方法注入属性的使用,set方法是较为常用的方法,除了set方法还有构造法和工厂方法注入属性。