一、Spring框架模块结构

Spring Framework是由Spring团队研发的模块化、轻量级开源框架。其主要目的是为了简化项目开发。

Test

对应spring-test.jar. Spring提供的测试工具, 可以整合JUnit测试, 简化测试环节.

Core Container

Spring的核心组件, 包含了Spring框架最基本的支撑.

Beans, 对应spring-beans.jar. Spring进行对象管理时依赖的jar包.

Core, 对应spring-core.jar, Spring核心jar包.

Context, 对应spring-context.jar, Spring容器上下文对象.

SpEL, 对应spring-expression.jar, Spring表达式语言.

只需要导入Context。

AOP

面向切面编程, 对应spring-aop.jar.

Aspects

AspectJ的具体实现,面向切面编程的另一种实现。对应spring-aspects.jar

Instrumentation

服务器代理接口的具体实现。对应spring-instrument.jar

Messaging

集成messaging api和消息协议提供支持。对应spring-messaging.jar

Data Access/Integration

Spring对数据访问层的封装

JDBC, 对应spring-jdbc.jar. Spring对jdbc的封装, 当需要使用spring连接数据库时使用. spring-jdbc.jar需要依赖spring-tx.jar.

Transactions, 对应spring-tx.jar. 事务管理

ORM, 对应spring-orm.jar. spring整合第三方orm框架需要使用的jar包, 例如Hibernate框架.

Web

Spring对javax下的接口或类做的扩展功能.

spring-web.jar, 对Servlet, filter, Listener等做的增强.

spring-webmvc.jar, 实际上就是SpringMVC框架. 需要依赖spring环境和spring-web.jar

学习Spring其实就是在分别学习Spring所有模块的功能。随着Spring框架的不断发展,在Spring官方压缩包中包含的模块对应的jar也越来越多。

二、IOC/DI

(1)定义

通过XML配置得到方式给类实例化对象,并给对象属性赋值。整个从实例化对象到给对象属性赋值的过程,称为IOC(控制反转),又称DI(依赖注入)。

(2)使用

1.导入Spring核心依赖

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context</artifactId>
  <version>5.3.23</version>
</dependency>

2.在resourcrs下创建一个applicationContext.xml文件

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--bean:实例化对象id:实例化对象的key值或者理解为对象名class:想要实例化的类的权限定路径设值注入property:使用set方法设置值name:属性名value:属性值,简单数据类型ref:属性值,类类型--><bean id="people" class="com.bjsxt.pojo.People"><property name="id" value="1"/><property name="name" value="chen"/><property name="address" value="beijing"/><!--数组类型,list类型,Set类型,Null类型使用方法类似--><property name="hobby"><array><value>看视频</value><value>看视频</value><value>看视频</value></array></property><!--Map类型--><property name="map"><map><entry key="a" value="a1"/><entry key="b" value="b1"/></map></property></bean><!--构造注入constructor-arg:使用构造方法设置值index:从0开始的索引name:参数名type:参数类型--><bean id="people1" class="com.bjsxt.pojo.People"><constructor-arg name="id" type="int" value="2"/><constructor-arg name="name" type="java.lang.String" value="chen2"/><constructor-arg name="address" type="java.lang.String" value="beijing2"/></bean><!--自动注入:只能把另一个bean注入进来bean标签的属性autowire在根标签`<beans>`中配置default-autowire属性。标签整个Spring中自动注入的策略。可取值有5个。default:默认值。不自动注入。no:不自动注入。byName:通过名称自动注入。会自动寻找容器中与当前属性同名的bean进行注入。byType:通过类型自动注入。会自动寻找容器中与当前bean类型匹配的bean进行注入。如果有多个相同类型的bean注入会出现异常。constructor:通过构造方法进行注入。寻找bean的构造方法中是否有一个包含其他bean类型的参数。如果有自动注入进去。类型先byType后byName,如果没找到不注入。注:构造方法类型和其他Bean的类型相同。-->
</beans>

3.测试

import com.bjsxt.pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestMain {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");People people = ac.getBean("people", People.class);System.out.println(people);}
}

三、bean标签的scope属性

singleton: 默认值。bean是单例的,每次获取Bean都是同一个对象。

prototype:每次获取bean都重新实例化。

request: 每次请求重新实例化对象,同一个请求中多次获取时单例的。

session:每个会话内bean是单例的。

application:整个应用程序对象内bean是单例的。

websocket:同一个websocket对象内对象是单例的。

单例模式:

(1)饿汉式:当加载类时就会立即创建一个当前类的实例。

package com.bjsxt.singleton;/*单例:希望类只有一个核心思想:1. 构造方法私有2. 对外提供一个能够获取对象的方法。饿汉式:优点:实现简单缺点:无论是否使用当前类对象,加载类时一定会实例化。*/
public class Singleton {// 之所以叫做饿汉式:因为类加载时就创建了对象private static Singleton singleton = new Singleton();private Singleton(){}public static Singleton getInstance(){return singleton;}
}

 (2)懒汉式:当想要获取这个对象时,才实例化该对象。

package com.bjsxt.singleton;/*** 核心思想:* 1. 构造方法私有* 2. 对外提供一个能够获取对象的方法。** 懒汉式优点和缺点:*  优点:*      按需创建对象。不会在加载类时直接实例化对象。*  缺点:*      写法相对复杂*      多线程环境下,第一次实例化对象效率低。*/
public class Singleton2 {//懒汉式:不会立即实例化private static Singleton2 singleton2;private Singleton2() {}public static Singleton2 getInstance() {if (singleton2 == null) {// 不是第一次访问的线程,直接通过if判断条件不成立。直接returnsynchronized (Singleton2.class) {if(singleton2==null) {// 防止多个线程已经执行到synchronizedsingleton2 = new Singleton2();}}}return singleton2;}
}

四、Spring整合Web

(1)导入Spring-web依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.3.23</version>
        </dependency>

(2)修改web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0"><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param><!-- 监听ServletContext对象,对象创建时会加载Spring的配置文件,创建Spring容器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
</web-app>

(3)编写Servlet

@WebServlet("/demo")
public class DemoServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {ApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(req.getServletContext());People peo = wac.getBean("peo", People.class);System.out.println(peo);}
}

五、Spring整合MyBaits

(1)导入spring-jdbc依赖,专门负责配置jdbc的四个参数;导入mybatis-spring依赖

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.3.23</version>
</dependency>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>2.0.7</version>
</dependency>

(2)在applicationContext.xml配置

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置数据源,设置数据库连接的四个参数 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><!-- 四个参数名固定的 --><property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/ssm"/><property name="username" value="root"/><property name="password" value="smallming"/></bean><!-- 整合包中提供的对于SqlSessionFactory的封装。里面提供了MyBatis全局配置文件所有配置的属性 --><bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><!-- 为实体类配置别名 --><property name="typeAliasesPackage" value="com.bjsxt.pojo"></property><!-- 配置log4j2 --><property name="configuration"><bean class="org.apache.ibatis.session.Configuration"><property name="logImpl" value="org.apache.ibatis.logging.log4j2.Log4j2Impl"/></bean></property><!-- 配置分页工具类 --><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"/></array></property></bean><!-- 设置扫描哪个包,进行接口绑定--><!-- 所有Mapper接口代理对象都能创建出来,可以直接从容器中获取出来。 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><!-- 扫描的包 --><property name="basePackage" value="com.bjsxt.mapper"></property><!-- 和SqlSessionFactory产生联系--><property name="sqlSessionFactoryBeanName" value="factory"></property></bean>
</beans>

(3)测试类

package com.bjsxt.test;import com.bjsxt.mapper.PeopleMapper;
import com.bjsxt.pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.Arrays;
import java.util.List;public class Test {public static void main(String[] args) {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");System.out.println(Arrays.toString(ac.getBeanDefinitionNames()));PeopleMapper peopleMapper = ac.getBean("peopleMapper", PeopleMapper.class);List<People> list = peopleMapper.selectAll();System.out.println(list);}
}

Spring的IOC/DI相关推荐

  1. Spring框架IoC/DI原理及实现

    1.概念 IoC:指将对象的创建权,交给到Spring容器: DI :指Spring创建对象的过程中,将对象依赖的属性通过配置的方式自动的设值给当前的对象 . IoC/DI注解详解 完成IoC/DI, ...

  2. Spring入门 IOC/DI基础案例

    目录 前言 一.创建set方法让外部进行方法提供 二.配置文件 三.实际运行 前言 书接上回:Spring入门-ioc基础案例代码_年关的博客-CSDN博客 我们通过Spring方式进行了对象创建,但 ...

  3. 解释Spring中IOC, DI, AOP

    oc就是控制翻转或是依赖注入.通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过spring的bean工厂为你长生这样一个对象. aop就是面向切面的编程.比如 ...

  4. Spring框架原理 | IOC/DI | Bean

  5. Spring 实践 -IoC

    Spring 实践 标签: Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转) ...

  6. Spring-学习笔记03【Spring的IOC和DI】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  7. Spring 框架 IOC 与 DI 的总结

    一:Spring并天下 1:Spring帝国: ①:Spring崛起 什么是Spring:源于Rod Johnson在其著作<Expert one on one J2EE design and ...

  8. 认识Spring核心容器IoC/DI

    对于 Java 编程来说,使用 Spring 能完成的更加快速,更容易并更安全.Spring 专注于速度,便捷与开发效率,也正是如此,让Spring成为了全世界最流行的 Java 框架.从配置到安全, ...

  9. spring之IOC和DI关系

    spring之IOC和DI关系 IOC:控制反转:那么什么是控制反转呢? 对于程序开发人员来说,在没有使用spring之前,我们如果需要某一个对象,那么我们会直接去new这个对象,在程序员的世界里还有 ...

最新文章

  1. 中国31个金融中心城市
  2. linux python qt 安装目录,Linux 下QT调用Python库文件 以及Linux 安装Python3.8开发环境 问题...
  3. python 如果没有该key值置为空_在python字典中用“None”替换空值
  4. 遇到tensorflow has no attribute 问题
  5. php 抽象类 静态方法吗,php中的抽象类和静态方法是什么
  6. PHP在哪里执行_php文件放在哪运行
  7. HTML---文本样式---行高---字符间距---文本对齐方式---文本使用线条修饰---文本的大小写---处理元素内的空白---字体样式---无序列表有序列表---表格
  8. MSXML版本6.10.1129.0
  9. 进销存系统的成本核算方法一览
  10. 攻防世界 ics-05
  11. SparkRDD优化(二)之SparkRDD共享变量(广播变量,累加器)
  12. 基于Thinkphp5+EasyWeChat+fastadmin微信小程序授权登录获取手机号微信公众号网页---联合授权登录
  13. 查询计算机上可用端口的两种方法
  14. 实时控制软件第一次作业总结
  15. windows文本转语音调用
  16. 精通Java并发——张龙
  17. 无法安装X64 在计算机找到X32,怎么看电脑适合装32位还是64位
  18. 我进了培训机构,成为一名java讲师
  19. 》古文诗词:庄子·杂篇·天下
  20. 游戏中的设计模式之观察者模式 笔记

热门文章

  1. 百条网络工程师基础面试题(不断更新)
  2. mysql建表,主键,等
  3. 用java实现的文本编辑器可以媲美windows自带的编辑器吗?(功能全,超详细)
  4. python pymssql - pymssql模块官方文档的翻译
  5. selenium模拟浏览器-----爬取马蜂窝地区全部景点
  6. Geography V.S. Geometry
  7. c语言12cr,计算机二级C语言讲义12.doc
  8. 大学本科毕业论文查重有什么要求?
  9. (论文加源码)基于时频域特征分析和SVM分类器的DEAP脑电信号情感状态识别(matlab代码)(四分类)
  10. 理解G1 Remember Set(RSet)