Spring学习笔记一(IOC思想)

  • 注:这是学习过程的记录,可能出错,仅供参考

spring简介

Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,为程序员提供了许多优秀的技术,简化了Javaee的开发,spring有许多优点:方便解耦,简化开发,支持AOP编程思想,支持声明式事务,集成了各种优秀的开源框架。
spring结构图

spring的IOC思想

在以前的开发中,类与类之间都会有一定的联系,最简单的就是当一个类实现了一个接口,当我们需要这个类时就去创建它,但是如果有一天我们需要改变接口的实现类让其实现不同的方法时,我们就需要到源码中修改代码,有可能我们修改一点代码时会导致其他位置的代码也需要修改,牵一发而动全身,这样就说明程序的解耦度不高,但是spring的IOC思想帮我们解决了这个问题,IOC即控制反转,即以前是我们自己创建对象实例,但是现在对象的实例化交予spring来管理,让spring来帮我们实例化对象,我们只要修改一些配置文件就可以达到修改程序的功能的目的,而不再需要去改动源代码。IOC思想的底层就是依靠反射+工厂+配置文件。

spring的使用

spring要使用需要导入spring需要的jar包,同时需要在工程的src目录底下创建一个xml的配置文件,文件名可以随意起。

  • spring需要导入的基本包
    springjar包
  • 通过配置文件实例化对象的三种方式
<?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 + "]";
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值