Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。

Spring项目出发点:

  • 目的:提供一种贯穿始终的解决方面,将各种专用框架整合成一个连贯的整体框架,简化企业级应用的开发(有点像粘合剂)

  • 鼓励最佳实践: 例如spring将“针对接口编程”的成本降到了最小

  • 非侵入性: 应用对象尽量避免依赖框架,IoC和AOP是避免依赖的关键技术

  • 统一配置: 好的框架应该让应用配置灵活且统一

  • 易于测试: 使单元测试尽可能简单

  • 可扩展:

简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

2. 什么是控制反转(或依赖注入)

控制反转(IoC=Inversion of Control)IoC,用白话来讲,就是由容器控制程序之间的(依赖)关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:(依赖)控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。 简单来说就是把生成对象的权限给予了spring框架进行管理

IoC还有一个另外的名字:“依赖注入 (DI=Dependency Injection)” ,即由容器动态的将某种依赖关系注入到组件之中。

3. AOP的关键概念

  • 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出.

  • 目标(Target):被通知(被代理)的对象

  • 通知(Advice):在某个特定的连接点上执行的动作,同时Advice也是程序代码的具体实现,例如一个实现日志记录的代码(通知有些书上也称为处理)

  • 代理(Proxy):将通知应用到目标对象后创建的对象(代理=目标+通知),请注意:只有代理对象才有AOP功能,而AOP的代码是写在通知的方法里面的

  • 切入点(Pointcut):多个连接点的集合,定义了通知应该应用到那些连接点。(也将Pointcut理解成一个条件 ,此条件决定了容器在什么情况下将通知和目标组合成代理返回给外部程序)

  • 适配器(Advisor):适配器=通知(Advice)+切入点(Pointcut)

4. 示例

4.1 创建工程

创建一个web工程,并转换为web3.1, 详细步骤可参见“maven”课件

4.2 pom文件

依赖配置如下:

  <properties><hibernate.version>5.2.12.Final</hibernate.version><mysql.driver.version>5.1.44</mysql.driver.version><spring.version>5.2.6.RELEASE</spring.version><struts2.version>2.5.13</struts2.version><slf4j.version>1.7.7</slf4j.version><log4j.version>2.9.1</log4j.version><disruptor.version>3.2.0</disruptor.version><junit.version>4.12</junit.version><servlet.version>4.0.1</servlet.version><jstl.version>1.2</jstl.version><standard.version>1.1.2</standard.version><tomcat-jsp-api.version>8.5.20</tomcat-jsp-api.version></properties>
​<dependencies>
​<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency>
​<!-- spring 相关 --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><!--spring 核心包 此演示只会涉及到此包--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency>
​<!-- 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.driver.version}</version></dependency><!--4. log配置:Log4j2 + Slf4j --><!-- slf4j核心包 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>jcl-over-slf4j</artifactId><version>${slf4j.version}</version><scope>runtime</scope></dependency>
​<!--用于与slf4j保持桥接 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>${log4j.version}</version><exclusions><exclusion><artifactId>slf4j-api</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency>
​<!--核心log4j2jar包 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>${log4j.version}</version></dependency>
​<!--web工程需要包含log4j-web,非web工程不需要 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-web</artifactId><version>${log4j.version}</version><scope>runtime</scope></dependency><!--需要使用log4j2的AsyncLogger需要包含disruptor --><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>${disruptor.version}</version></dependency>
​<!--5. other --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet.version}</version><scope>provided</scope></dependency>
​<!--6. jstl --><dependency><groupId>javax.servlet.jsp.jstl</groupId><artifactId>jstl</artifactId><version>${jstl.version}</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>${standard.version}</version></dependency>
​<!-- 7. jsp自定义标签依赖 (必须与tomcat的版本一致) --><dependency><groupId>org.apache.tomcat</groupId><artifactId>tomcat-jsp-api</artifactId><version>${tomcat-jsp-api.version}</version><scope>provided</scope></dependency>
​</dependencies>

注: 该依赖配置不仅包含了spring,同时也包含了hibernate,struts,mysql驱动等。

4.3 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" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
​
​</beans>

注意: 此配置中 含有 spring-tx 如果监测报错导入tx包即可 tx 事务处理 配置文件夹名可随意

4.4 示例代码

4.4.1 示例1

1) Student

public class Student {private String name;
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​@Overridepublic String toString() {return "Demo [name=" + name + "]";}
​
}

2) spring.xml 配置文件 注意 : 放在上方配置文件的<beans>标签中间

    <bean id="demo" class="org.lisen.springdemo.model.Demo"><property name="name"><value>张三</value></property></bean>

配置文件说明:

  • id:在容器中查找Bean的id(唯一、且不能以/开头)

  • class:bean的完整类名

  • name:在容器中查找Bean的名字(唯一、允许以/开头、允许多个值,多个值之间用逗号或空格隔开)

  • scope:(singleton|prototype)默认是singleton singleton: 单例模式, 在每个Spring IoC容器中一个bean定义对应一个对象实例 prototype: 原型模式/多例模式, 一个bean定义对应多个对象实例

  • parent:指定一个父bean(必须要有继承关系才行)

  • abstract: 将一个bean定义成抽象bean(抽象bean是不能实例化的),抽象类一定要定义成抽象bean,非抽象类也可以定义成抽象bean

注: 在这里配置的name属性为简单的String属性,可以直接使用value进行配置。另外可以直接使用value设置的如下: 8基础数据+String+3个sql java.util.Date java.sql.Date java.sql.Time java.sql.Timestamp

3) 通过Spring的ApplicationContext获取Bean 配置文件名字可任意

public class SpringDemo {public static void main(String[] args) {ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");Student demo = (Student)cxt.getBean("demo");System.out.println(demo);}
​
}

4.4.2 示例2 (abstract,parent示例)

1) Person

public class Student extends Person {private String name;
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​@Overridepublic String toString() {return "Demo [name=" + name + "]";}
​
}

3) 配置文件

    <bean id="student" class="org.lisen.springdemo.model.Student" parent="person"><property name="name"><value>张三</value></property></bean><bean id="person" class="org.lisen.springdemo.model.Person" abstract="true"><property name="phone"><value>139751878778</value></property></bean>

4) 通过Spring的ApplicationContext获取Bean

public class SpringDemo {public static void main(String[] args) {ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");Student student = (Student)cxt.getBean("student");System.out.println(student.getName());System.out.println(student.getPhone());}
​
}

4.4.3 使用有参数构造方法创建javaBean

constructor-arg

1) Worker

public class Worker extends Person {
​private String workName;public Worker(String workName) {this.workName = workName;}
​public String getWorkName() {return workName;}
​public void setWorkName(String workName) {this.workName = workName;}}

2)配置文件

    <bean id="worker" class="org.lisen.springdemo.model.Worker" parent="person"><constructor-arg name="workName"><value>王小</value></constructor-arg><!-- 第二种方式<constructor-arg index="0"><value>王小</value></constructor-arg>--></bean>

3) 通过Spring的ApplicationContext获取Bean

public class SpringDemo {public static void main(String[] args) {ApplicationContext cxt = new ClassPathXmlApplicationContext("spring.xml");Student student = (Student)cxt.getBean("student");System.out.println(student.getName());System.out.println(student.getPhone());//构造函数注入Worker worker = (Worker)cxt.getBean("worker");System.out.println(worker.getWorkName());}
​
}

4.4.4 init-method:指定bean的初始化方法

  1. 修改上面的Student类,加入一个init方法,注意该方法不能有参数

public class Student extends Person {private String name;
​public String getName() {return name;}
​public void setName(String name) {this.name = name;}
​@Overridepublic String toString() {return "Demo [name=" + name + "]";}//init方法,不能有参数public void init() {System.out.println("Student init ....");}
​
}

2) 修改Student类对应的配置文件

  <bean id="student" class="org.lisen.springdemo.model.Student" parent="person" init-method="init"><property name="name"><value>张三</value></property></bean>

3) 运行原来的测试用例,会发生后台打印“Student init ....“,表示init-method正常调用。

4.4.5 复杂属性的配置

1) JavaBean属性注入

  <bean id="student" class="org.lisen.springdemo.model.Student" parent="person" init-method="init"><property name="name"><value>张三</value></property><property name="addr" ref="addr"/></bean><bean id="addr" class="org.lisen.springdemo.model.Addr"><property name="city"><value>长沙</value></property></bean>

java部分代码比较简单,请根据配置文件自行完成。

2)List或数组

声明属性

 private int[] arr;private List list;

配置文件

    <property name="list"><list><value>123</value><value>456</value><value>789</value><value>asd</value></list></property>

3)Map

private Map map;

配置文件

 <property name="map"> <map> <entry key="aa" value="123"/> <entry key="bb" value="456"/> <entry key="cc" value="789"/> </map> </property>
  1. Properties   对象赋值

private Properties prop;  实体 对象  比如人类有 name 名字和age 年龄一样

配置文件

      <property name="prop"><props><prop key="dd">qwer</prop><prop key="ee">tyu</prop><prop key="ff">iop</prop></props></property>

5. 多配置文件

系统一般会被分成多个模块,可以为每个模块配置一个配置文件,便于管理,在版本控制软件中也可以减少冲突

spring-a.xml 假设为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" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><bean id="student" class="org.lisen.springdemo.model.Student" parent="person" init-method="init"><property name="name"><value>张三</value></property><property name="addr" ref="addr"/></bean><bean id="addr" class="org.lisen.springdemo.model.Addr"><property name="city"><value>长沙</value></property></bean><bean id="person" class="org.lisen.springdemo.model.Person" abstract="true"><property name="phone"><value>139751878778</value></property></bean><bean id="worker" class="org.lisen.springdemo.model.Worker" parent="person"><constructor-arg name="workName"><value>王小</value></constructor-arg><!-- 第二种方式<constructor-arg index="0"><value>王小</value></constructor-arg>--></bean></beans>

spring.xml 为总的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" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd"><import resource="spring-a.xml"/></beans>

6. 与web集成

6.1 集成配置

在web.xml中加入如下配置:

   <context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param>
​<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>

6.2 获取配置的Bean

/*** 用于简化Bean的获取.* * ApplicationContextAware接口:* 实现了这个接口的bean,当spring容器初始化的时候,会自动的将ApplicationContext注入进来* * @author Administrator*/
public final class SpringBeanUtil implements ApplicationContextAware {private SpringBeanUtil() {}private static ApplicationContext cxt;
​@Overridepublic void setApplicationContext(ApplicationContext appContext) throws BeansException {cxt = appContext;}/*** 根据Bean的id来获取Bean对象* @param id 配置文件中的bean的id属性* @return Object*/@SuppressWarnings("unchecked")public static <T> T getBean(String id) {return (T)cxt.getBean(id);}} 

配置文件 将配置好的类 定义成组件 也可使用注解方式

 <bean class="org.lisen.springdemo.util.SpringBeanUtil"/>

什么是spring,他能够做什么相关推荐

  1. 从架构演进的角度聊聊Spring Cloud都做了些什么?

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,之前也写过一些关于Spring Cloud文章,主要偏重各组件的使用,本次分享主要解答这两个问题:Spring Cl ...

  2. Spring整合Redis做数据缓存(Windows环境)

    当我们一个项目的数据量很大的时候,就需要做一些缓存机制来减轻数据库的压力,提升应用程序的性能,对于java项目来说,最常用的缓存组件有Redis.Ehcache和Memcached. Ehcache是 ...

  3. Spring Security可以做的十件事

    一 您可以在Spring XML配置文件中指定您选择的授权提供者. 您可以通过配置Spring的http://www.springframework.org/schema/security/sprin ...

  4. 什么是spring框架?spring框架到底有什么用?spring框架到底做了些什么?

    什么是spring框架,spring框架究竟有什么用呢?我们可以用spring框架来做些什么呢?这是我今天要说的内容. 当然,百度spring框架会出现一大堆spring框架的介绍,以及IOC和AOP ...

  5. 中value大小_如何在Spring/SpringBoot 中做参数校验?你需要了解的都在这里!

    数据的校验的重要性就不用说了,即使在前端对数据进行校验的情况下,我们还是要对传入后端的数据再进行一遍校验,避免用户绕过浏览器直接通过一些 HTTP 工具直接向后端请求一些违法数据. 本文结合自己在项目 ...

  6. spring整合aspects做aop演示

    第一步:接入spring 和aspects依赖 <dependency>             <groupId>org.springframework</groupI ...

  7. Spring整合MyBatis做 student crud

    把mybatis框架和spring集成在一起,向一个框架一样使用. 用的技术是:ioc . 为什么ioc:能把mybatis和spring集成在一起,像一个框架, 是因为ioc能创建对象. 可以把my ...

  8. Spring Boot 项目如何做性能监控?

    来源:zhaoyh's blog,http://zhaoyh.com.cn/ Spring Boot特别适合团队构建各种可快速迭代的微服务,同时为了减少程序本身监控系统的开发量,Spring Boot ...

  9. spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非 ...

  10. spring 单例 获取多例的位_Spring 获取单例流程(一)

    读完这篇文章你将会收获到 在 getBean 方法中, Spring 处理别名以及 factoryBean 的 name Spring 如何从多级缓存中根据 beanName 获取 bean Spri ...

最新文章

  1. Verilog以及VHDL所倡导的的代码准则
  2. sqlmap os shell解析
  3. 透过字节码分析java基本类型数组的内存分配方式。
  4. ASP.NET Core 中的静态文件
  5. H5入门-xhtml+css2-第01节
  6. leapmotion 初识
  7. 交通灯程序设计C语言,单片机C语言程序设计:LED 模拟交通灯
  8. 【转】Ubuntu下用G++编译C++程序
  9. 计算机组成原理八位全加器,8位全加器-课程设计
  10. 十二栋发布新品牌BC12 能否成衍生品市场黑马?
  11. 非常详细的范式讲解(1NF/2NF/3NF/BCNF)
  12. 处理Nginx返回octet-stream数据流的配置
  13. Phoenix FD Maya 软件插件
  14. Kanzi学习-待继续更新
  15. 基于TIVA库函数的TM4C1294XL使用笔记|TI单片机
  16. 最近的题目总结(树,电话线铺设,我的天)
  17. sklearn的predict_proba
  18. bat 设置 IP, 清除IP
  19. Detailed errors from the package manager follow: apt transaction returned result exit-failed问题解决
  20. 2023开年第一涨!有省市IDC电费拟环比上浮23.41 %

热门文章

  1. 高一计算机专业班主任工作总结,【班主任工作总结报告计算机材料】
  2. 软件工程----第一遍机房文档之串思路
  3. 实验7 蓝桥ROS1使用外设 适用kinetic/melodic/noetic
  4. 架构师之路(18)讲解秒杀系统设计
  5. u盘图片损坏怎么恢复
  6. Python turtle圣诞树
  7. 全国计算机二级考试设置地点,黑龙江2020年3月全国计算机等级考试考点设置
  8. python所用到的英语单词_用Python自制考研英语单词手册
  9. CS5265的Type-C转HDMI2.0方案
  10. 计算机专业学什么语言最能找工作