一、什么是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可以查看类或接口的结构,如下: