Spring 框架概念
Spring 是众多开源java项目中的一员,基于分层的javaEE应用一站式轻量级开源框架,主要核心是 IOC(控制反转/依赖注入)与 AOP(面向切面)两大技术,实现项目在开发过程中的轻松解耦,提高项 目的开发效率。
在项目中引入 Spring 立即可以带来下面的好处 降低组件之间的耦合度,实现软件各层之间的解耦。可 以使用容器提供的众多服务,如:事务管理服务、消息服务等等。当我们使用容器管理事务时,开发人 员就不再需要手工控制事务.也不需处理复杂的事务传播。 容器提供单例模式支持,开发人员不再需要自 己编写实现代码。 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等功能。
IOC 控制反转Inversion Of Control
概念:
控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
添加 Spring 框架的依赖坐标
<!-- 添加Spring框架的核心依赖 -->
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.14.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.annotation/javax.annotation-api -->
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
添加Spring 配置文件
1. 在项目的src下创建文件夹 resources(Alt+insert)
2. 将 resources 标记为资源目录
3. 在 src\main\resources 目录下新建 spring.xml 文件,并拷贝官网文档提供的模板内容到 xml 中。
4. 在 spring.xml 中配置 Bean 对象
id:对象的名称
class:类的全路径名称
scope:singleton,单例(默认的),prototype 原型的,非单例的
<bean id="user" class="com.yjxxt.bean.User" scope="prototype">
实力对象的三种方式:
构造器实例化
通过默认构造器创建 空构造方法必须存在 否则创建失败
设置配置文件 spring.xml
<!--构造器初始化-->
<bean id="stu" class="com.yjxxt.bean.Student">
<!--构造器
name="参数名"
value="实际参数"
<constructor-arg name="sid" value="100"></constructor-arg>
<constructor-arg name="sname" value="小黑"></constructor-arg>
-->
静态工厂实例化
要有该工厂类及工厂方法
工厂方法为静态的
设置配置文件 spring.xml
<!--静态工厂实例化对象-->
<bean id="car" class="com.yjxxt.factory.CarFactory" factory-method="getCar">
<!--给工厂方法传入实际参数-->
<constructor-arg value="QQ"></constructor-arg>
</bean>
实例化工厂实例化
工厂方法为非静态方法
需要配置工厂bean,并在业务bean中配置factory-bean,factory-method属性
设置配置文件 spring.xm
<!--实例化工厂实例化对象-->
<!--实例化工厂-->
<bean id="carFactory" class="com.yjxxt.factory.CarFactory2"></bean>
<bean id="car1" factory-bean="carFactory" factory-method="getCar">
<!--给工厂方法传入实际参数-->
<constructor-arg value="BMW"></constructor-arg>
</bean>
依赖注入方式
set注入
构造器注入
单个Bean对象作为参数
多个Bean对象作为参数
Bean对象和常用对象作为参数
静态工厂注入
实例化工厂注入
p标签注入
自动装配
概念:
注解方式注入 Bean 对于 bean 的注入,除了使用 xml 配置以外,可以使用注解配置。注解的配置,可以简化配置文件, 提高开发的速度,使程序看上去更简洁。对于注解的解释,Spring对于注解有专门的解释器,对定义的 注解进行解析,实现对应bean对象的注入。通过反射技术实现。
注解:
@Autowired 注解 byName
默认通过类型(Class类型)查找bean对象 与属性字段的名称无关
可以添加@Qualifier结合使用,通过value属性值查找bean对象(value属性值必须要设置,且值要 与bean标签的id属性值对应)
@Resource 注解 byName
名称查找对应的bean对象 (属性字段的名称与bean标签的id属性值相等)
如果属性字段名称未找到,则会通过类型(Class类型)查找
推荐使用@Resource 注解是属于J2EE的,减少了与Spring的耦合。
核心配置文件spring.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启自动装配-->
<context:annotation-config/>
<!--实例化对象-->
<bean id="roleDao" class="com.yjxxt.dao.RoleDao"></bean>
<bean id="roleService" class="com.yjxxt.service.RoleService"></bean>
</beans>
Spring IOC 扫描器
实际的开发中,bean的数量非常多,采用手动配置bean的方式已无法满足生产需要,Spring这时候 同样提供了扫描的方式,对扫描到的bean对象统一进行管理,简化开发配置,提高开发效率。
注解开发IOC
1:开启注解扫描
<!--开启扫描-->
<context:component-scan base-package="com.yjxxt"/>
2:在目标类上添加注解
@Repository (Dao层) 查询用户记录
@Service (Service层) 业务逻辑处理
@Controller (Controller层) 接收请求
@Component (任意类)
bean对象的id属性默认是 类的首字母小写
3.添加自动装配注解
如果bean对象未在指定包范围,即使声明了注解,也无法实例化
@Autowired vs @Resource
1:@Autowired 来至于spring框架,@Resource javax...
2:@Autowired根据类型装配,而@Resource跟据名称装配
3:一般@Autowired若遇到同一类型的数据不唯一,可以使用 @Qualifier(value = "roleDao")指定具体的对象名称
4:@Resource根据名称装配,若跟据名称找不到,则可以根据类型去寻找;
作用域
scope
singleton单例模式 --有缓存
prototype原型的,非单例的 --缓存
request
表示每个请求需要容器创建一个全新Bean。比如提交表单的数据必须是对每次请求新建一个Bean 来保持这些表单数据,请求结束释放这些数据。
session
表示每个会话需要容器创建一个全新Bean。比如对于每个用户一般会有一个会话,该用户的用户 信息需要存储到会话中,此时可以将该Bean作用域配置为session级别。
globleSession
类似于session作用域,其用于portlet(Portlet是基于Java的Web组件,由Portlet容器管理,并由容 器处理请求,生产动态内容)环境的web应用。如果在非portlet环境将视为session作用域。
lazy-init属性(懒加载)
如果为false,则在IOC容器启动时会实例化bean对象,默认false
如果为true,则IOC容器启动时不会实例化Bean对象,在使用bean对象时才会实例化
lazy-init设置为false有什么好处
1)可以提前发现潜在的配置问题
2)Bean 对象存在于缓存中,使用时不用再去实例化bean,加快程序运行效率
生命周期
默认在IOC容器加载时,实例化对象。
init 初始化有两种方式:
在配置文档中通过指定 init-method 属性来完成。
destory
实现销毁方式(Spring容器会维护bean对象的管理,可以指定bean对象的销毁所要执行的方法)。
分层调用图
DI 依赖注入 Dependency Injection
工厂实例化