21-05-07
spring概述
Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)
ioc的技术实现
DI是ioc的技术实现
DI :依赖注入,只需要在程序中提供要使用的对象名称就可以,至于对象如何在容器中创建,赋值,查找都由容器内部实现。
spring是使用的di实现了ioc的功能,spring底层创建对象,使用的是反射机制
反射机制
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。
可以使用 Constructor 创建新的对象,用 get() 和 set() 方法读取和修改与 Field 对象关联的字段,用 invoke() 方法调用与 Method 对象关联的方法。另外,还可以调用 getFields() getMethods() 和 getConstructors() 等很便利的方法,以返回表示字段,方法,以及构造器的对象的数组。这样匿名对象的信息就能在运行时被完全确定下来,而在编译时不需要知道任何事情。
通过反射机制创建对象,在创建对象之前要获得对象的构造函数对象,通过构造函数对象创建对应类的实例
Spring的配置文件
1.beans:是根标签,spring把java对象称为bean
2.spring-beans.xsd 是约束文件,和mybatis指定的dtd是一样的。
告诉spring创建对象
声明bean,就是告诉spring要创建某个类的对象
id:对象的自定义名称,唯一值 spring通过该这个名称找到对象
class:类的全限定名称(不是接口,因为spring是反射机制常见对象,必须使用类)
一个bean标签声明一个对象
Spring默认创建对象的时间:在创建Spring容器时,会创建配置文件中的所有的对象
Spring创建对象:默认调用的时无参的构造方法
实现spring创建对象的步骤
1.创建maven项目
2.加入maven的依赖
<!--加入spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
3.创建类
package com.node.ba01;
public class Student {
private String name;
private int age;
public Student(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
4.创建spring需要使用的配置文件
声明类的信息,这些类由spring创建和管理
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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myStudent" class="com.node.ba01.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
</bean>
</beans>
5.测试
package com.node;
import com.node.ba01.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyTest {
@Test
public void test02(){
//使用spring容器创建对象
//指定spring配置文件的名称
String config="ba01/applicationContext.xml";
//创建表示spring容器的对象,ApplicationContext
//ApplicationContext就是表示spring容器,通过容器获取对象了
//ClassPathXmlApplicationContext:表示从类路径中加载spring的配置文件
ApplicationContext ac=new ClassPathXmlApplicationContext(config);
//从容器中获取某个对象
//getBean("配置文件中的bean的id值")
Student student= (Student) ac.getBean("myStudent");
System.out.println("Student对象"+student);
}
}
DI的语法分类
1.set注入(设值注入):spring调用类的set方法,在set方法可以事项属性的赋值 (大多数用)
2.构造注入,spring调用类的有参构造方法,创建对象,在构造方法中完成赋值。
set注入
简单类型:spring中规定java的基本数据类型和String都时简单类型
1.简单类型的set注入
<bean id="myStudent" class="com.node.ba01.Student">
<property name="属性名字" value="此属性的值"/>
<property name="age" value="20"/>
一个property只能给一个属性赋值
</bean>
2.引用类型的set注入:spring调用类的set方法
<bean id="myStudent" class="com.node.ba02.Student">
<!--引用类型-->
<property name="属性名字" ref="bean的id(对象的名称)"/>
<property name="school" ref="mySchool"/>
</bean>
例:
<bean id="myStudent" class="com.node.ba02.Student">
<property name="name" value="李四"/>
<property name="age" value="20"/>
<!--引用类型-->
<property name="school" ref="mySchool"/>
</bean>
<!--声明School对象-->
<bean id="mySchool" class="com.node.ba02.School">
<property name="name" value="北京大学"/>
<property name="address" value="北京海淀区"/>
</bean>
构造注入
spring调用类的有参构造方法,在创建对象的同时,在构造方法中给属性赋值。
构造注入使用 标签
标签:
一个表示构造方法的一个参数
标签属性:
name:表示构造方法的形参名
index:表示构造方法的参数的位置,参数从左往右位置时0,1,2的顺序
value:构造方法的形参类型时简单类型的,使用value
ref:构造方法的形参类型时引用类型的,使用ref
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--使用name属性构造注入-->
<bean id="myStudent" class="com.node.ba03.Student">
<constructor-arg name="myname" value="张三"/>
<constructor-arg name="myage" value="20"/>
<constructor-arg name="myschool" ref="myXuexiao"/>
</bean>
<!--使用index方式构造注入-->
<!--index 可省略,但顺序要按有参构造中的顺序-->
<bean id="myStudent2" class="com.node.ba03.Student">
<constructor-arg index="0" value="赵四"/>
<constructor-arg index="1" value="29"/>
<constructor-arg index="2" ref="myXuexiao"/>
</bean>
<!--声明School对象-->
<bean id="myXuexiao" class="com.node.ba03.School">
<property name="name" value="北京大学"/>
<property name="address" value="北京海淀区"/>
</bean>
</beans>