spring学习笔记(第一部分)

一、什么是spring?

spring是2003年兴起的一个轻量级的java开发框架,它是为了解决企业应用开发的复杂性而创建的。

spring是一个容器,用于降低代码间的耦合度,根据不同情况(不同代码),采用IoC(用于主业务逻辑解耦合)和AOP(用于系统级服务解耦合)两种技术进行解耦合。

上面是spring架构图,每一块代表一个jar包,例如第一块由5个jar包组成。

二、spring的特点

1.非侵入式

spring框架的API不会在业务逻辑上出现,即业务逻辑是POJO(java原生类,不需要依赖任何额外引入的jar)。由于业务逻辑中没有spring的API,所以业务逻辑可以从spring框架迅速移植到其他框架。


2.容器

spring作为一个容器,可以管理对象的生命周期、对象与对象之间的依赖关系。可以通过配置文件,来定义对象,以及设置其与其他对象的依赖关系。


3.IoC

控制反转,即实例的创建不是由调用者完成,而是由spring容器完成,并注入调用者。容器在对象初始化时不等对象请求就主动将依赖传递给它。


4.AOP

面向切面编程,是一种编程思想,是面对对象编程OOP的补充。很多框架都实现了对AOP编程思想的实现。spring也提供了面向切面编程的丰富支持,允许分离应用的业务逻辑与系统级服务(如日志和事务管理)进行开发。

我们可以把日志、安全和事务管理等服务理解成一个“切面”,以前都是直接把这些服务写到业务逻辑代码当中,这样有两点不好:(1)业务逻辑代码不纯净,不便于阅读理解。(2)这些服务是会被业务逻辑反复使用的,完全可以剥离出来做到复用。AOP就是解决这个问题的,它可以把这些服务剥离出来形成一个“切面”,然后将“切面”动态的织入到业务逻辑中,让业务逻辑能够享受到此“切面”的服务。


三、spring与IoC

IoC是一种思想,指将传统上由程序代码直接操控的对象调用权交给容器,通过容器来实现对象的装配和管理。控制反转就是对对象控制权的转移,将程序代码本身反转到了外部容器。

IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式有两种:

(1)依赖查找(DL):容器提供调用接口,程序代码则需提供查找的路径。

(2)依赖注入(DI):不做定位查询,所有工作由容器自动完成。(但是对象不能重名)。


3.1 spring的第一个程序

首先准备好spring的jar包和spring的依赖包,下面需要的jar包都是从这里来的。


必须:spring的4个基础jar包


如果需要测试,导入junit


如果需要记录日志,导入log4j和apache-commons中的logging  jar包。logging是一个适配器,它使得框架可以使用任何日志技术,而不局限于log4j等。


到这里需要的jar包就准备好了。


1)创建一个java project,目录结构如下:



2)建立服务类及其实现类

public interface SomeService {
	void doSome();
}
import com.hnu.service.SomeService;

public class SomeServiceImpl implements SomeService {

	@Override
	public void doSome() {
		System.out.println("执行doSome方法!");
	}

}


3)在src目录下建立applicationContext.xml(取什么名字都行,官方推荐这个名字)。xml文件需要约束,可以从spring官方jar包中的spring-framework-4.2.1.RELEASE\docs\spring-framework-reference\html这个文件夹下找到xsd-configuration.html这个文件,里面有spring的约束文件格式。

建立xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<xml-body>

</xml-body>

添加约束:

<?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 definitions here -->

</beans>


添加自动提示(补充):拷贝http://www.springframework.org/schema/beans/spring-beans.xsd,点击window->preferences->XML Catalog


点击添加,弹出如下窗口,Key type选择URI,Key填上面复制的spring-bean的约束地址http://www.springframework.org/schema/beans/spring-beans.xsd,Location选择spring官方jar包中的spring-bean约束spring-framework-4.2.1.RELEASE\schema\beans\spring-beans-4.2.xsd ,选择4.2版本的,因为我们用的spring也是4.2的。

点击确定,然后关掉xml再打开,就有自动提示了。



4)注册bean

<?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 definitions here -->
    <!--注册Service -->
    <bean id="myService" class="com.hnu.service.implSomeServiceImpl" />

</beans>


5)获取容器对象,实现注入:

import org.junit.Test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;


import com.hnu.service.SomeService;
import com.hnu.service.impl.SomeServiceImpl;


public class MyTest {
	
	@Test
	public void test01(){
		SomeService service = new SomeServiceImpl();
		service.doSome();
	}
	
	@Test
	public void test02(){
		//1.从类路径下找配置文件
		ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
		
		//2.从项目路径下找配置文件
		//ApplicationContext ac =new FileSystemXmlApplicationContext("applicationContext.xml");
		
		//3.从指定盘符下找配置文件
		//ApplicationContext ac =new FileSystemXmlApplicationContext("d:/applicationContext.xml");
		SomeService service = (SomeService) ac.getBean("myService");
		service.doSome();
	}
	
	
	@Test
	public void test05(){
		//另外一中容器BeanFactory
		BeanFactory bf =new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
	  //BeanFactory bf =new XmlBeanFactory(new FileSystemResource("applicationContext.xml"));
		SomeService service = (SomeService) bf.getBean("myService");
		service.doSome();
	}


}

类路径就是src下:


项目路径就是项目根路径:



ApplicationContext的getBean()方法是继承的BeanFactory的。

ApplicationContext和BeanFactory容器的区别:

1)ApplicationContext容器在进行初始化时,会将其中的所有的Bean(对象)进行创建

         缺点:占用系统资源

         优点:响应速度快

2)BeanFactory容器中的对象,在容器初始化时并不会被创建,而是在真正获取该对象时才被创建

         

         缺点:相对来说响应速度慢

         优点:不多占用系统资源

目前计算机资源越来约廉价,我们一般都习惯用空间换时间,所以一般第一种方式用的较多一点。




连接spring源码操作(补充):

alt+鼠标左键点击ApplicationContext类,弹出如下窗口:


点击 Attach Source,弹出如下窗口:


选择External location ,Encoding选择UTF-8,根据上面的提示找到spring-context-4.2.1的源码,一般在spring-framework-4.2.1.RELEASE\libs里面。点击ok即可连上源码。

Ctrl+T可以查看类或接口的继承关系,如下:


Ctrl+O可以查看类或接口的结构,如下:





猜你喜欢

转载自blog.csdn.net/cqf949544506/article/details/80894673