Spring背景
Spring是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,它为Java开发者提供了一种全面的编程和配置模型,用于现代基于Java的企业应用程序。Spring框架最初是由Rod Johnson创建的,目的是为了解决企业级应用程序开发的复杂性。
平常我们在写代码时,经常会用到new来进行实例化,这样会造成高度耦合。此时我们可以使用工厂模式去解决,让工厂生产我们需要的对象,我们只需要找工厂拿到指定的对象即可。过程如下图:
Spring框架的特点
方便解耦,简化开发
Spring 就是一个大工厂,可以将所有对象的创建和依赖关系的维护交给 Spring 管理。
方便集成各种优秀框架
Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如 Struts2、Hibernate、MyBatis 等)的直接支持。
降低 Java EE API 的使用难度
Spring 对 Java EE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了封装,使这些 API 应用的难度大大降低。
方便程序的测试
Spring 支持 JUnit4,可以通过注解方便地测试 Spring 程序。
AOP 编程的支持
Spring 提供面向切面编程,可以方便地实现对程序进行权限拦截和运行监控等功能。
声明式事务的支持
只需要通过配置就可以完成对事务的管理,而无须手动编程。
Spring的核心思想
IOC思想
Inversion of Control,控制反转,强调的是原来在程序中创建Bean的权利给第三方。
DI思想
Dependency Injection,依赖注入,强调的Bean之间的关系,这种关系第三方去负责设置。
AOP思想
Aspect Oriented Programming,面向切面编程,功能的横向抽取,主要的实现方式就是Proxy。
使用Spring
使用spring框架步骤如下:
- 创建工程,导入Spring包
- 配置Spring的xml文件
- 测试,从spring容器中拿到对象
首先创建一个Maven工程,前往Maven中央仓库搜索Spring-context导入spring的jar包:
导入好之后,配置Spring.xml:
注意:xml文件要新建在resources中,选择Spring配置:
接下来进行编辑,配置如下:(注意要编写Bean类,否则会报错)
Bean类的具体代码如下:
public class UserService {
String name;
public void setName(String name) {
this.name = name;
}
public void A(){
System.out.println("UserService对象方法");
}
}
接下来进行测试,在测试前首先要了解:
ClassPathXmlApplicationContext类:它可以从类路径加载XML文件,获取到一个容器对象;
通过使用这个对象的getBean方法,通过配置文件的唯一标识找到对象。
编写测试类:
import com.cc.Service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
public static void main(String[] args) {
ClassPathXmlApplicationContext cpxac = new ClassPathXmlApplicationContext("text.xml");
UserService userService = (UserService) cpxac.getBean("UserService");
System.out.println(userService.getName());
}
}
可以发现,并没有使用new去创建对象,而是直接从Spring容器内获取,并且拿到了name的值。
IOC
控制反转(Inversion of Control,IoC)是一种设计原则,用于减少代码间的耦合度,并提高系统的可维护性和可扩展性。其核心思想是将对象的创建和绑定(即控制权)从代码本身转移到外部容器或框架。通过这种方式,对象不再负责查找和创建其依赖的对象,而是由外部实体(如IoC容器)负责这些任务。上面的例子已经实现了从容器获取对象,这里使用BeanFactory来实现管理Bean对象。
除了测试类的代码有区别,其他都与上面的例子相同。
public class Main {
public static void main(String[] args) {
DefaultListableBeanFactory df = new DefaultListableBeanFactory();
XmlBeanDefinitionReader xr = new XmlBeanDefinitionReader(df);
xr.loadBeanDefinitions("text.xml");
Object u = df.getBean("userService") ;
UserService o = (UserService) u;
o.B();
}
}
Di依赖注入
IoC负责对象的创建,配置和组装,降低了程序的耦合度,而Ioc的主要机制就是依赖注入。
public class UserController {
UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
public void b(){
userService.a();
}
}
<?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="userService" class="com.fs.Service.UserService">
</bean>
<bean id="userController" class="com.fs.Controller.UserController">
<property name="userService" ref="userService"></property>
</bean>
</beans>