- 注:这是学习过程的记录,可能出错,仅供参考
spring简介
Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,为程序员提供了许多优秀的技术,简化了Javaee的开发,spring有许多优点:方便解耦,简化开发,支持AOP编程思想,支持声明式事务,集成了各种优秀的开源框架。
spring的IOC思想
在以前的开发中,类与类之间都会有一定的联系,最简单的就是当一个类实现了一个接口,当我们需要这个类时就去创建它,但是如果有一天我们需要改变接口的实现类让其实现不同的方法时,我们就需要到源码中修改代码,有可能我们修改一点代码时会导致其他位置的代码也需要修改,牵一发而动全身,这样就说明程序的解耦度不高,但是spring的IOC思想帮我们解决了这个问题,IOC即控制反转,即以前是我们自己创建对象实例,但是现在对象的实例化交予spring来管理,让spring来帮我们实例化对象,我们只要修改一些配置文件就可以达到修改程序的功能的目的,而不再需要去改动源代码。IOC思想的底层就是依靠反射+工厂+配置文件。
spring的使用
spring要使用需要导入spring需要的jar包,同时需要在工程的src目录底下创建一个xml的配置文件,文件名可以随意起。
- spring需要导入的基本包
- 通过配置文件实例化对象的三种方式
<?xml version="1.0" encoding="UTF-8"?>
<!-- beans的约束文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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标签,让spring来帮我们创建对象实例(无参构造),这就是spring的IOC思想(控制反转)
id作为一个bean标签的唯一属性,通过使用spring的API-getBean(id值)就可以得到spring帮我们创建的对象
注意:id值可以任意写,但是在配置文件中,id值是唯一的,只能一个bean写一个id
class为我们要让spring帮我们创建的对象的全限定名
scope是用来决定创建出的对象是单实例还是多实例
singleton:单实例,即当配置文件被加载时,对象就会被创建好,我们拿到的对象都是同一个对象
prototype:多实例,当我们使用getBean()时,对象才会被创建,创建出的都是一个新的不同的对象
默认情况下,scope的值为singleton,创建的都是单例
对象的销毁:
单实例对象只有当IOC容器销毁时才会一起销毁
多实例对象当不用时会被java的垃圾回收机制gc随机回收
这是最常用的配置,直接创建要用的对象
-->
<!-- <bean id="stu" class="com.wzm.entity.Student" scope="singleton"></bean> -->
<!-- 获取对象的另一种方式,通过静态工厂来获取
id值还是和前面的一样,spring的API通过这个Id来获取对象
class中的全限定名不再是要创建的那个对象,而是创建那个对象的工厂类的全限定名
factory-method为工厂类中的静态方法名,方法是能够创建需要的对象(student)的方法
注意:工厂类的方法是静态的才能使用
-->
<!-- <bean id="stu" class="com.wzm.factory.StudentStaticFactory" factory-method="getStudent"></bean> -->
<!-- 这个也是通过工厂来创建对象,不同的是,这里的工厂类的创建对象的方法不是静态的,
因此还得写一个工厂类的bean标签,class是工厂类的全限定名
然后在写一个关于Student的bean标签,
factory-bean为工厂类的bean标签的id值
factory-method为工厂类能够创建对象的方法名,不是静态的
-->
<!-- <bean id="stuFactory" class="com.wzm.factory.StudentFactory"></bean>
<bean id="stu" factory-bean="stuFactory" factory-method="getStudent"></bean> -->
</beans>
- spring的API使用
@Test
public void test1() {
//加载配置文件,ClassPathXmlApplicationContext为加载类路径classes目录下的配置文件
//new FileSystemXmlApplicationContext()为加载主机磁盘目录下的配置文件
//因此配置文件要放在工程的src目录底下,配置文件的名字可以随意取
//ApplicationContext是接口,体现多态
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//获取spring为我们创建的对象实例,参数为在配置文件中bean标签的id值
//获取哪个对象就传入哪个Id值
Student student = (Student) context.getBean("stu");
Student student1 = (Student) context.getBean("stu");
System.out.println(student);
}
- spring依赖注入的使用
<?xml version="1.0" encoding="UTF-8"?>
<!-- beans的约束文件 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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">
<!-- DI即为依赖注入,当一个对象中需要到其他资源,然后由spring帮这个对象提供资源,这就是依赖注入的简单理解
比如说,每个学生都需要有老师,spring能够帮我们提供这个老师对象
-->
<!-- 对象属性依赖注入的第一种方式-有参构造器方式
使用该方式的条件:在JavaBean(Student类)中要有包含需要依赖注入的属性的有参构造器
比如这里的Student类中有name属性,对这个属性进行依赖注入,类中需要有包含name属性的构造器
constructor-arg标签代表使用构造器方式注入
name为要注入的属性的属性名
value为注入的值,这里value针对的是基本类型和String类型的属性的注入
还有一个属性ref针对的是对象类型的属性的注入
-->
<!-- <bean id="stu" class="com.wzm.entity.Student">
<constructor-arg name="name" value="小明"></constructor-arg>
</bean> -->
<!-- 属性的依赖注入的第二种方式,通过 p 标签来注入
使用该方式的条件:需要在配置文件的约束文件中加入p标签的名称空间
xmlns:p="http://www.springframework.org/schema/p"
p:属性名=注入值,针对的是基本类型和String类型的属性
p:属性名-ref=注入值,针对的是对象类型的属性
-->
<!-- <bean id="stu" class="com.wzm.entity.Student" p:name="小明"></bean> -->
<!-- 属性的依赖注入的第三种方式,通过set属性注入(常用)
使用该方式的条件:在Javabena中有要注入的属性的set方法
property表示要进行set方式的以来注入
name为属性名,value为注入值,同样针对的是基本类型和String类型的属性
还有一个属性ref针对对象类型的属性的注入
-->
<!-- String类型属性的注入-set方式 -->
<!-- <bean id="stu" class="com.wzm.entity.Student">
<property name="name" value="小明"></property>
</bean> -->
<!-- 对象类型属性的注入 -set方式
如果要注入的属性是对象类型的,那么在配置文件中,要有用来注入的对象的bean标签
如要向学生对象注入老师对象,那么需要有老师对象的bean标签
用来注入的对象也可以有自己的属性依赖注入
ref就是用来注入类型为对象类型的属性,值为注入对象bean标签的id值
-->
<!-- <bean id="tea" class="com.wzm.entity.Teacher">
<property name="name" value="老师"></property>
</bean>
<bean id="stu" class="com.wzm.entity.Student">
<property name="teacher" ref="tea"></property>
</bean> -->
<!-- 数组类型属性的注入 -set方式
property表明是set方式注入,name为数组类型属性名
list表明该属性是数组类型或者是list类型
value往数组中注入值,针对的是基本类型和String类型的属性
-->
<!-- <bean id="stu" class="com.wzm.entity.Student">
<property name="s">
<list>
<value>学生</value>
</list>
</property>
</bean> -->
<!-- list类型属性的注入 -set方式
property表明是set方式注入,name为数组类型属性名
list表明该属性是数组类型或者是list类型
value往list中注入值,针对的是基本类型和String类型的属性
ref往list中注入值,针对的是对象类型的属性,注意对象类型属性要有bean标签
-->
<!-- <bean id="tea" class="com.wzm.entity.Teacher">
<property name="name" value="老师"></property>
</bean>
<bean id="stu" class="com.wzm.entity.Student">
<property name="l">
<list>
<value>学生</value>
<ref bean="tea"/>
</list>
</property>
</bean> -->
<!-- Map类型属性的注入 -set方式
map表明注入的map类型的属性
entry为键值对,key就是map的key
value为key对应的值,基本类型或String类型
value-ref也是key对应的值,对象类型
-->
<!-- <bean id="tea" class="com.wzm.entity.Teacher">
<property name="name" value="老师"></property>
</bean>
<bean id="stu" class="com.wzm.entity.Student">
<property name="m">
<map>
<entry key="名字" value="小明"></entry>
<entry key="老师" value-ref="tea"></entry>
</map>
</property>
</bean> -->
<!-- properties类型属性的注入 - set方式
props表明注入的是properties类型的属性
prop为键值对,key为properties的key
对应值只能是String类型
-->
<bean id="stu" class="com.wzm.entity.Student">
<property name="p">
<props>
<prop key="名字">小明</prop>
</props>
</property>
</bean>
</beans>
- 其他javabean
package com.wzm.entity;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
/*
* student
*/
public class Student {
private String name;
private Teacher teacher;
private String[] s;
private List l;
private Map m;
private Properties p;
public Student(){
System.out.println("我被创建了");
}
public Student(String name) {
this.name = name;
}
//省略getter和setter
@Override
public String toString() {
return "Student [name=" + name + ", teacher=" + teacher + ", s=" + Arrays.toString(s) + ", l=" + l + ", m=" + m
+ ", p=" + p + "]";
}
}
package com.wzm.factory;
import com.wzm.entity.Student;
/*
* 静态工厂类
*/
public class StudentStaticFactory {
public static Student getStudent() {
return new Student();
}
}
package com.wzm.factory;
import com.wzm.entity.Student;
/*
* 工厂类
*/
public class StudentFactory {
public Student getStudent() {
return new Student();
}
}
package com.wzm.entity;
/*
* 老师类
*/
public class Teacher {
private String name;
//省略getter和setter
@Override
public String toString() {
return "Teacher [name=" + name + "]";
}
}