1.Spring入门
什么是Spring?
Spring
是一个从实际开发中抽取出来的框架,企业级应用开发的
“
一站式
”
选择,贯穿表现层、业务
层和持久层。具有高开放性,并能与其他框架无缝整合,俗称
“
架构粘合剂
”
。
Spring
有两大核心功能:控制反转
/
依赖注入
(
IOC/DI
)
和
面向切面编程
(
AOP
)
对于开发者来说,开发者使用
Spring
框架主要是做两件事:①开发
Bean
;②配置
Bean
Spring
容器作为超级大工厂,负责创建、管理所有的
Java
对象,这些
Java
对象被称为
Bean
。
为什么要使用Spring?
spring
的优点:
低侵入式设计,代码的污染极低。
独立于各种应用服务器,基于
Spring
框架的应用,可以真正实现
Write Once
,
Run Anywhere
的承
诺。
Spring
的
IoC
容器降低了业务对象替换的复杂性,提高了组件之间的解耦。
Spring
的
AOP
支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的
复用。
Spring
的
ORM
和
DAO
提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
Spring
的高度开放性,并不强制应用完全依赖于
Spring
,开发者可自由选用
Spring
框架的部分或全
部。
2.使用maven搭建Spring
步骤一、添加依赖 此处依赖可去官网 https://mvnrepository.com/ 查询
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.22</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.22</version>
</dependency>
步骤二、编写spring的配置文件 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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
</beans>
步骤三、HelloSpring
1.编写HelloSpring
package niit.com;
import javax.swing.*;
public class HelloSpring {
public String who=null;
public String getWho() {
return who;
}
public void setWho(String who) {
this.who = who;
}
public void hello() {
System.out.println("hello"+this.who+"!");
}
}
2. 使用Spring创建HelloSpring的对象并未属性赋值(此过程发生在
ApplicationContext.xml
中
)
<bean id="helloSpring" class="com.niit.springtest.HelloSpring">
<property name="who" value="SpringTwo"/>
</bean>
3.编写测试类调用Spring创建的bean
@Test
public void testThree(){
//初始化Spring上下文对象 context
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
//从上下文中获取业务层对象
UserService service = (UserService) context.getBean("userService");
service.addUser();
service.trasfer();
}
3.IOC/DI控制反转/依赖注入
3.1 概念
控制反转
IOC
:(
Inversion of Control
)
把创建依赖对象的
“
控制权
”
由
“
谁用谁创建
”
,反转后, 统一交给
Spring
来完成的过程。
调用者获取被依赖对象的方式由原来的
主动获取
,变成了
被动接受
依赖注入
DI
:
(
Dependency Injection
)通过
spring
容器,来为对象的属性
注入
相关依赖的值。
依赖
:一般指通过局部变量、方法参数、返回值等建立的对于其他对象的
调用关系
。例如,在
A
类的方法中,实例化了
B
类的对象并调用其方法来完成特定功能,我们就说
A
类依赖
B
类。
IOC 与 DI 的区别与联系控制反转与依赖注入说得是一回事,只不是两个角度来阐述 Spring 框架的这一技术实现。相对于控制反转来说,依赖注入更好理解,即由容器( Spring )负责把组件所依赖的具体对象注入(赋值)给组件,从而避免组件之间硬编码的方式耦合在一起。
依赖注入的方式
:
设值注入:
IoC
容器通过成员变量的
setter
方法来注入被依赖对象
构造注入:利用构造器来设置依赖关系的方式,被称为构造注入
P
命名空间注入
:
使用
p
命名空间注入
Spring
提供以下注解
@component
通用注解,表示创建一个
bean
@Repository
表示创建的
dao
层的
bean
@Service
表示创建的是
service
层的
bean
@Controller
表示创建的
Controller
层的
bean
@Autowired
用来进行依赖注入。默认按照类型来查找
@Qualifier
("bean
的
id")
补充
@Autowired
,添加按照名称查找
bean
的方法
@Resource
与
@Autowired
作用一样,但这个是
JAVA
提供的注解, 默认按照名称来查找
bean
如果指定名称的
bean
不存在, 会自动转换为按照类型去找
4.AOP面向切面编程
4.1什么是AOP?
AOP:
:(
Aspect oriented programming
)面向切面编程。
这是一种思想:通过动态代理技术,实现在不修改原生代码的同时,完成增强处理。
4.2
、
AOP
的使用场景
日志处理、
访问控制、
事务管理、
性能检测
等等。
4.3
、
AOP
的相关术语
切面(
Aspect
)
:一个模块的横切逻辑
连接点(
JoinPoint
)
:程序在执行中的某个具体的执行点。一般定义在代理类上
增强处理(
Advice
)
:切面在某个特点连接点上执行的增强代码前置增强、后置增强、环绕增
强、最终增强、异常抛出增强
切入点(
PointCut
)
:与连接点对应的具体的描述,特征的描述,比如在哪个类中?那个方法?
什么样的参数啊?一般是定义在切面中的。切入点的表达式
execution(* com.service..
.
(..))
这个表达式的含义为:匹配
com.service
包及其子包下所有类的
所有方法。
目标对象(
Target Object
)
:被增强对象,有可能是一个甚至多个切面来为此增强
AOP
代理(
AOP Proxy
)
:
负责定义增强处理的类。
织入(
Weaving
)
.
将代理和目标对象连接起来的过程就是织入。
4.4
、
AOP
增强处理类型
前置增强:
befor
方法调用前增强
后置增强:
afterReturning
方法调用后增强
环绕增强:
around
威力最大,功能最全。可以同时完成前后增强、异常增强、最终增强处理
最终增强:
after
相当于
try-catch
中的
finally
块。无论是否发生异常都会执行,通常用于关闭资
源
异常增强:
afterThrowing
对于应用中可能会出现异常的地方统一提供异常处理的解决方案