开源免费框架,轻量级,非入侵式框架。Spring就是一个轻量级的控制反转(IOC)和面向切片编程(AOP)的框架
Maven repo:Spring Web MVC + spring-jdbc(整合Mybatis)
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.9</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.3.9</version> </dependency>Spring两大特点
控制反转(IOC)
面向切片编程(AOP)支持事务处理
Spring
About IOC控制反转:IOC是一种设计思想,通过描述(XML或注解)并通过第三方生产或获取对象的方式。之前对象的创建与对象的依赖关系完全在java硬编码程序中,控制权在程序;实现IOC后,控制权在第三方,实现降藕。
在Spring中实现控制反转的是IoC容器,实现方法是依赖注入DI(Dependency Injection,DI)
引用狂神的一个例子简单理解下
private UserDao userDao = null; public UserServiceImpl(){ userDao = new UserDaoImpl(); }在之前我们使用JavaWeb写service=>dao的时候,是通过如上的方式去实现的,项目构建大概如下
那么如果此时我的UserDao接口又了一个新的实现类暂且为UserDaoImpls,这个实现类中有新的功能实现,那么就需要到UserServiceImpl中再去构造方法加一段如下的代码:
userDao = new UserDaoImpls();那么这时如果该项目还没发布那到无所谓,如果是已经上线的项目是不可能这样重新去修改代码的,或者如果有n个new,就要修改n处。
解决这个问题就是通过一个set方法。如下:
public void setUserDao(UserDao userDao) { this.userDao = userDao; }在构造方法中实例化对象的这个操作,改为利用set封装并将需要new的实现类的名称变为set方法的参数,实现用户可控的去new一个新的实现类从而添加新的功能展示到页面。
而这个思想就是控制反转(IOC)的原型,将new实现类对象的主动权交给了用户而不是程序,从本质上解决了上面的问题,也实现了降藕。
Hello SpringHello.java
package com.zh1z3ven.pojo; public class Hello { private String str; public Hello() { } public Hello(String str) { this.str = str; } public String getStr() { return str; } public void setStr(String str) { this.str = str; } @Override public String toString() { return "Hello{" + "str='" + str + '\'' + '}'; } }Beans.xml
一个bean标签代表一个对象, id代表在Spring中这个类要实例化生成的对象的名字, class指定这个实体类
设置对象的属性值
引用Spring容器中创建的对象
<?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 https://www.springframework.org/schema/beans/spring-beans.xsd"> <!--使用Spring创建对象,Spring都称之为bean--> <!-- 一个bean标签代表一个对象, id代表要实例化的对象的名字, class指定这个实体类--> <bean> <!-- 设置实体类的属性值--> <property value="Spring"/> </bean> </beans>Test.java
在Spring中也存在一个上下文,通过ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");传入xml配置文件名字来获取该xml文件的上下文对象。利用ApplicationContext#getBean()传入在xml中配置的该类的id获取该实体类对象。
public class MyTest { public static void main(String[] args) { //获取Spring上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); //从Spring中取出对象 Hello hello = (Hello) context.getBean("hello"); System.out.println(hello); } } IOC创建对象的几种方式PS:在配置文件加载的时候,通过bean标签注册的对象就已经在Spring IoC容器中初始化了。
总体来说就两种方式:
无参构造
默认使用
有参构造
下标赋值
<!--通过下标赋值--> <bean> <constructor-arg index="0" value="Spring2"/> </bean>
类型复制
<!--通过类型赋值--> <bean> <constructor-arg type="java.lang.String" value="Spring3"/> </bean>
属性名赋值
<!--属性名赋值--> <bean> <constructor-arg value="Spring4"/> </bean> Spring import settingsimport标签可导入其他beans.xml配置文件,而applicationContext.xml到时可作为总bean的配置文件,而不需要导入多个xml