目录
概述
spring是什么
Spring 是于 2003 年兴起的一个轻量级、非侵入式、IOC 和、AOP 、一站式、的 Java 开发框架,它是为了简化企业级应用开发而生的
spring优点
轻量级
Spring 框架使用的 jar 都比较小,一般在 1M 以下或者几百 kb。Spring 核心功能的所需的 jar 总共在 3M 左右。 Spring 框架运行占用的资源少,运行效率高
非侵入式
编写一些业务类(用户管理、servlet、service、dao)的时候不需要继承 spring 特定的类,通过配置完成依赖注入后就可以使用,此时,spring 就没有侵入到我业务类的代码里。
像UserServlet extend HttpServlet就属于侵入式
一站式框架
它是一个后端管理架构框架,集基础容器,数据访问(jdbc,事物管理),web(Servlet),AOP为一身的一站式框架
核心模块
- Core:核心类库,提供IOC服务
- Context:上下文对象,提供框架式的Bean访问
- AOP:AOP服务
- ORM:对ORM框架的支持
- MVC:MVC的实现
IOC
就是控制反转思想,把什么的控制权 反转 给谁
以前写代码,在哪需要对象就就地 new() 一个,spring的理念是将生成对象的控制权 反转给spring框架 ,由spring框架通过反射机制 生成并管理对象;
如果在程序运行期间创建一个对象需要依赖其他的对象,就会通过名称或者类型在SpringIOC容器中查找并注入,这也就是依赖注入。
AOP
我们在增强方法的时候,需要在每个方法中显示调用这些非业务代码,比如说保存日志这些,非常麻烦,扩展性不强
就是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,不需要修改原有代码
- 利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
- OOP是整体设计,AOP是针对业务代码中的公共部分进行提取
- 可以实现在不修改代码的情况下为程序添加功能,前提抽取的代码与业务逻辑没有直接关系
基本概念
连接点(Joinpoint): 类中可以被增强的方法
切入点(Pointcut): 实际被增强的方法
通知(Advice): 通知是指一个切面在特定的连接点要做的事情 (增强的功能)(saveLog())
切面(Aspect): 把通知添加到切入点的过程叫切面
目标(Target): 代理的目标对象(要增强的类)
代理(Proxy): 向目标对象应用通知之后创建的代理对象
spring搭建
导入jar包
<!-- spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
创建spring.xml
在resources目录下创建一个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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--beans:配置需要spring管理的类
配置进来后spring就会对其进行管理(生成对象,存储)
由spring框架生成的对象称之为一个bean(特指spring框架创建的对象,它会添加额外的功能)
-->
<!--
id:生成的对象名
class:对象全类名
name:对象别名,可为多个
scope:
singleton(默认值):单例模式 在Spring中只存在一个bean实例
prototype:原型 getBean()的时候都会new Bean()
-->
<bean id="user" class="com.ff.spring.model.User" scope="prototype"/>
</beans>
使用ClassPathXmlApplicationContext创建并管理对象
import com.ff.spring.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
public static void main(String[] args) {
/*
ApplicationContext是spring的一个底层定义的接口,定义了一些规范
ClassPathXmlApplicationContext()是spring中一个具体落地实现的类(创建并管理对象)
spring思想:IOC 把生成对象的控制权 反转给 spring框架
在程序中需要对象的时候,直接从spring容器中获取即可(依赖注入)
*/
//获取spring创建的bean对象 创建spring容器
ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
//生成对象
User user1 = app.getBean("user", User.class);
User user2 = app.getBean("user", User.class);
System.out.println(user1);
System.out.println(user2);
}
}
spring bean管理
依赖注入 Dependency Injection 为创建好的对象的属性注入值
xml 配置方式
构造方法
<bean id="user" class="com.ff.spring.model.User">
<constructor-arg type="java.lang.String" name="name" value="张三"/>
<constructor-arg type="java.lang.Integer" name="age" value="20"/>
<constructor-arg name="list">
<list>
<value>1</value>
<value>2</value>
<value>3</value>
</list>
</constructor-arg>
</bean>
set方法
<!--set方法注入-->
<bean name="user" class="com.ff.spring.model.User">
<property name="name" value="李四"/>
<property name="age" value="20"/>
<property name="list">
<list>
<value>4</value>
<value>5</value>
<value>6</value>
</list>
</property>
</bean>
注解方式
开启注解扫描
<context:component-scan base-package="com.ff.spring"> </context:component-scan>
标记不同层的类
- @Component(value=“user”) (model)
- @Service (service)
- @Repository (数据访问层dao)
@Scope
/*指定生成对象策略
@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例
*/
@Scope(value = "singleton")
注解方式注入属性
- @Autowired是spring自身提供的注解,直接在属性上添加注解来注入
- @Autowired是根据属性的类型自动注入(根据属性的类型在spring容器中进行查找)(byType)
@Service(value = "userService")
public class UserService {
@Autowired
private UserDao userDao;
public void saveUser()