初识Spring
spring介绍
核心理念:IoC(控制反转)、AOP(面向切面的编程)
- 表现层:web层提供了一个优秀的springMVC框架
- 业务逻辑层:通过AOP无入侵情况下对业务层进行增强,eg 管理事务、记录日志。
- DAO层(持久层):整合MYBatis
Spring框架的优点
- 可以直接通过Spring文件配置文件管理数据库事务。
- 方便测试,支持junit单元测试
- 方便集成其他框架(AOP),eg Struts、Hibernate
- 降低了JavaEE的API使用难度
Spring体系结构
- Bean:对象的管理和创建。
- Core:基础核心。
- Context:上下文。
- SpEL:Spring提供的表达式。
从下往上学,学习灰色部分
Spring新特性
- 简化了异常操作。
- 支持响应式编程
- 支持函数式web框架
- 支持Kotlin语言
- 提升测试功能
Spring的下载及目录结构
- spring-5.2.8.RELEASE-dist.zip
Spring入门程序
- 创建一个maven工程,在其中引入相关的依赖包(课本)
- 创建一个类,在目录src/main/java下创建包,eg package com.ncwu
- 在包下创建HelloSpring类,类下要声明属性以及属性对应的set方法
package com.ncwu;
public class HelloSpring{private String userName;public void setUserName (String userName){this.userName=userName;}}
- 目录src/main/resources下创建applicationContext.xml作为HelloSpringl类的配置文件,并在配置文件里创建Bean(对象)
<bean id="hellospring" class="com.ncwu.HelloSpring">
id是唯一标识,class指向com.ncwu.HelloSpring
spring帮助创建类的对象,唯一标识
<property name="userName" value="张"></property>
为userName赋值iii
- Spring帮助文档获取约束信息(用AI更快,idea有模板)
- 第一步:pom.xml里相关的依赖,引入一个依靠maven以来传递引出所有的。
- 第二步:创建类,提供属性以及属性的set方法
- 第三步:编写Spring的核心配置,头部信息复制,配置Bean
- 第四步:在测试类里进行单元测试
Spring的控制反转和依赖注入(IoC)
控制反转(Inversion of Controi):是面向对象编程中的一个设计原则,用来降低程序代码之间的耦合度。在传统的面向对象的编程里,获取对象的方式是用new关键字主动创建一个对象,也就是应用程序掌握着对象的控制权
Ioc控制反转机制指的是对象由IoC容器统一管理,当程序需要使用对象时,可以直接从容器中获取,这样对象的控制权就从应用程序转移到了IoC容器。
依赖注入(Dependency Inject)
依赖注入就是有IoC容器在运行期间动态的将某种以来注入到对象中,例如将对象B注入(赋值)给对象A的成员变量。依赖注入的基本思想时明确定义组件接口,独立开发各个组件,然后根据组件依赖关系组装运行。
**依赖注入和控制反转从不同角度描述了同一件事。依赖注入是从应用程序角度描述,即应用程序依赖IoC容器创建并注入他所需的外部资源;而控制反转是从IoC容器角度描述,即IoC容器控制应用程序,由IoC反向的向应用程序注入应用程序所需要的外部资源(可以是外部实例对象也可以是外部文件对象) **
//获取Spring容器
ApplicationContext ac =new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取对象
HelloSpring helloSSpring =(HelloSpring)ac.getBean("helloSpring");
//调用对象的方法
helloSpring.show();
依赖注入的类型
实现方法
依赖注入的作用就是在使用Spring框架创建对象时动态的把其多以来的对象注入到Bean组件中,依赖注入通常有两种方法:构造方法注入,属性setter方法注入。
构造方法注入
Spring读取配置信息后,或通过反射方式调用实例的构造f方法,如果是有参的构造方法可以在构造方法里传入所需的参数值,最后创建类对象并赋值
<bean id="user1" class="com.ncwu.User1"><construcror-arg name="id" value="1">//arg表示参数</constructor-arg><construcror-arg name="name" value="王五"></constructor-arg> <construcror-arg name="password" value="1234"></constructor-arg>
一个
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext-User.xml");
//加载applicationContext.xml配置
User1 user1=applicationContext.getBean("user1","User1.class");
//获取配置中的User1实例
确定参数
name属性:通过参数的名字来确定参数
type属性:通过参数的类型来确定参数
index属性:通过参数的索引来确定参数
给属性赋值的
value:用来给基本类型赋值
ref:用来给引用型类型赋值
setter方法
<bean id ="user2" class="com.ncwu.User2">