Spring
Spring框架由Rod Johnson开发,2004年发布了Spring框架的第一版。Spring是一个从实际开发中抽取出来的框架,因此它完成了大量开发中的通用步骤,留给开发者的仅仅是与特定应用相关的部分,从而大大提高了企业应用的开发效率。
Spring简介
作用:为代码“解耦合”,降低代码间的耦合度(符合软件工程中的高内聚、低耦合的特点),让对象和对象(模块和模块)之间关系不是通过代码关联,而是通过配置来说明。
Spring 根据代码的功能特点,使用Ioc 降低业务对象之间耦合度,Ioc 使得主业务在相互调用的过程中,不用再自己维护关系了,即不用再自己创建要使用的对象了,而是由Spring 容器统一管理,自动注入,即赋值。而AOP 使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由Spring 容器统一完成织入。
官网:
Spring 安装包:
- spring-framework-5.2.5.RELEASE
- docs
- javadoc-api
- kdoc-api
- spring-framework-reference
- libs
- spring-model-5.2.5.RELEASE.jar
- spring-model-5.2.5.RELEASE-javadoc.jar
- spring-model-5.2.5.RELEASE-sources.jar
- schema
Spring 优点
- 轻量
- 针对接口编程、解耦合
AOP 编程的支持- 方便集成各种优秀框架
Ioc控制反转
Ioc的概念
概念:Ioc ,Inversion of Control ,控制反转,是一个理论,把对象的创建、属性赋值,对象的声明周期都交给代码以外的容器管理。
Ioc 分为控制和反转
- 控制:对象创建、属性赋值,对象的声明周期
- 反转:把开发人员管理对象的权限转移给了代码之外的容器实现,由容器完成对象的管理。
- 正转:开发人员在代码中,使用
new 构造方法创建对象。
Ioc 的实现
- 依赖注入:
DI ,Dependency Injection ,程序只需要提供要使用的对象的名称即可,对象如何创建,如何从容器中查找,获取都由容器内部自己实现
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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="someService" class="org.bjpowernode.service.impl.SomeServiceImpl"/>
</beans>
Spring 的标准配置文件
- 根标签是
beans beans 后面是约束文件说明,beans 里面是bean 声明bean 是java 对象,Spring 容器创建的java 对象
创建对象并调用接口方法
package org.bjpowernode;
import org.bjpowernode.service.SomeService;
import org.bjpowernode.service.impl.SomeServiceImpl;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppMain {
public static void main(String[] args) {
String config = "beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
SomeService service = (SomeService)ctx.getBean("someService");
service.doSome();
}
}
Spring容器创建对象的特点
Spring 创建对象特点:
-
Spring 创建对象调用的构造函数默认是无参构造,如果定义了有参构造,则再定义无参构造. -
创建Spring 容器对象的时候,会读取配置文件,创建文件中声明所有的的Java 对象,即new ClassPathXmlApplicationContext(config);
-
优点:获取对象的速度快,因为对象已经创建好了 -
缺点:占用内存 -
String 对象存在Spring 内部的map 中,并从map 进行获取对象(可以调用ApplicationContext 接口里面的方法试一试)
创建非自定义类对象
<beans>
<bean id="date" class="java.util.Date"/>
</beans>
DI(依赖注入)
Spring 调用类的五参数构造方法,创建对象,对象创建后给属性赋值
DI 分类:
set 注入,简单类型注入(简单的数据类型和String )
<beans>
<bean id="myStudent" class="com.bjpowernode.ba01.Student">
<property name="name" value="lh"/>
<property name="age" value="12"/>
</bean>
</beans>
注入过程:按照前调用无参构造的原则,其后调用setxx 方法进行赋值(和属性名无关,无关是不是类的属性),而非直接通过有参构造进行赋值
给非自定义类同理
set 注入,引用类型注入
<beans>
<bean id="myst" class="com.bjpowernode.ba01.Student">
<property name="name" value="lh"/>
<property name="age" value="12"/>
<property name="sl" ref="mysl"/>
</bean>
<bean id="mysl" class="com.bjpowernode.ba01.School">
<property name="name" value="yc"/>
<property name="age" value="32"/>
</bean>
</beans>
构造注入:Spring 调用类中的有参构造方法,在创建对象的同时,给属性赋值
<beans>
<bean id="myst" class="com.bjpowernode.ba01.Student">
<constructor-arg name="name" value="pl"/>
<constructor-arg name="age" value="234"/>
<constructor-arg name="sl" ref="mysl"/>
</bean>
<bean id="myst" class="com.bjpowernode.ba01.Student">
<constructor-arg index="0" value="pl"/>
<constructor-arg index="1" value="234"/>
<constructor-arg index="2" ref="mysl"/>
</bean>
<bean id="mysl" class="com.bjpowernode.ba01.School">
<property name="name" value="yc"/>
<property name="age" value="32"/>
</bean>
</beans>
引用类型自动注入:Spring 可以根据某些规则给引用类型完成赋值,只对引用类型有效,规则byName 和byType
byName :按名称注入,Java 类中引用类型属性名称和Spring 容器中bean 的id 一样,且数据类型也一样,这样的bean 能够赋值给引用类型。byType :按类型注入,Java 类中引用类型的数据类型和Spring 容器中bean 的class 同源关系,则可以赋值给引用类型。
byName 规则
<beans>
<bean id="st" class="com.bjpowernode.ba01.Student" autowire="byName">
<property name="name" value="lh"/>
<property name="age" value="123"/>
</bean>
<bean id="sl" class="com.bjpowernode.ba01.School">
<property name="name" value="yc"/>
<property name="age" value="231"/>
</bean>
</beans>
byType 规则(只能有一个,具有唯一性)
同源关系
java 中引用类型的数据类型和bean 的class 值是一样的。java 中引用类型的数据类型(父)和bean 的class (子)值是父子类关系的。java 中引用类型的数据类型和bean 的class 值是接口和实现类关系的。
<beans>
<bean id="st" class="com.bjpowernode.ba01.Student" autowire="byType">
<property name="name" value="lh"/>
<property name="age" value="123"/>
</bean>
<bean id="mysl" class="com.bjpowernode.ba01.School">
<property name="name" value="yc"/>
<property name="age" value="231"/>
</bean>
</beans>
多个配置文件:在实际应用里,随着应用规模的增加,系统中Bean 数量也大量增加口,导致配置文件变得非常庞大、臃肿。为了避免这种情况的产生,提高配置文件的可读性与可维护性,可以将Spring 配置文件分解成多个配置文件。
- 按功能模块分,-个模块一个配置文件。
- 按类的功能分,数据库操作相关的类在一个文件,配置
redis , 事务等等的一个配置文件。
Spring 管理多个配置文件:常用的是包含关系的配置文件,项目中有一个总的文件,里面是有import 标签包含其他的配置文件
<import reource="classpath:其他文件路径1"/>
<import reource="classpath:其他文件路径2"/>
使用通配符*
<import reource="classpath:其他文件路径_*"/>
基于注解的DI
概念:使用Spring 提供的注解,完成Java 对象创建,属性赋值
Component :需要在类上使用注解@Component ,该注解的value 属性用于指定该bean 的id 值
@Component(value="myTest")
class Test {
}
<beans>
<context:component-scan base-package="com.bjpowernode.ba01"/>
</beans>
利@Component 功能相同的创建对象的注解。
@Repository :放在dao接口的实现类上面,表示创建dao对象,持久层对象,能访问数据库@Service :放在业务层接口的实现类上面,表示创建业务层对象,业务层对象有事务的功能@Controller :放在控制器类的上面,表示创建控制器对象。属于表示层对象。控制器对象能接受请求,把请求的处理结果显示给用户。
以上四个注解都能创建对象,但是@Repository @Service @Controller 有角色说明,表示对象是分层的。对象是属于不能层的,具有额外的功能。
扫描多个包的三种方式
<beans>
<context:component-scan base-package="com.bjpowernode.ba01"/>
<context:component-scan base-package="com.bjpowernode.ba02"/>
<context:component-scan base-package="com.bjpowernode.ba01;com.bjpowernode.ba02"/>
<context:component-scan base-package="com.bjpowernode"/>
</beans>
注解指定属性值的方式
简单类型value
放置位置:
- 在属性定义的上面,无需
set 方法,推荐使用 - 在
set 方法的上面
|