什么是Spring?
Spring开发方向:分布式,微服务,网站
Spring技术(全家桶):Spring Framework、Spring boot、Spring Cloud
Spring的好处:
·不是一个J2EE容器。它并不与J2EE应用服务器竞争,而是提供了一些替代方案。
·基于POJO的非侵入式框架,允许按需使用其组件。促进解耦和重用。
·通过提供隐式模式实现(例如单例、工厂、服务定位器等),减少编码工作量并强制执行设计规范。
·消除常见的代码问题,如连接泄漏等。
·支持声明式事务管理。
·与第三方工具和技术的轻松集成。
Spring Framework(4.x)
是spring体系中最基础的项目,是其他项目的根基
core container(核心容器)
目的:管理对象的模块,充分解耦
使用时,不主动使用new产生对象,转为由外部提供对象
IoC/DI
IoC(inversion of control)控制翻转:由主动new产生对象转换为由外部提供对象
IOC与大家熟知的依赖注入同理,。这是一个通过依赖注入对象的过程 也就是说,它们所使用的对象,是通过构造函数参数,工厂方法的参数或者是从工厂方法的构造函数或返回值的对象实例设置的属性,然后容器在创建bean时注入这些需要的依赖。这个过程相对普通创建对象的过程是反向的(因此称之为IoC),bean本身通过直接构造类来控制依赖关系的实例化或位置,或提供诸如服务定位器模式之类的机制。
DI(dependency injection)依赖注入:在容器中建立bean与bean之间的依赖关系的整个过程
IoC容器
spring将IoC容器当作外部,来控制提供对象
IoC容器负责:对象创建,初始化……
Bean
Bean是在IoC容器被创建或被管理的对象
为什么bean默认是单例?
限制bean的数量,减少运行压力
适合交给容器管理的bean:表现层对象、业务层对象、数据层对象、工具对象
不适合交给容器管理的bean:封装实例的域对象
bean的实例化
1.用构造方法实例化对象(构造方法要无参)
2.通过静态工厂
package org.example.factory;
import org.example.dao.OrderDao;
import org.example.dao.impl.OrderDaoimpl;
public class OrderDaoFactory {
public static OrderDao getOrderDao(){
return new OrderDaoimpl();
}
}
#applicationContext.xml
<bean id="orderDao" class="org.example.factory.OrderDaoFactory" factory-method="getOrderDao"/>
3.通过实例工厂
package org.example.factory;
import org.example.dao.UserDao;
import org.example.dao.impl.UserDaoimpl;
public class UserDaoFactory {
public UserDao getUserDao() {
return new UserDaoimpl();
}
}
#applicationContext.xml
<bean id="userFactory" class="org.example.factory.UserDaoFactory"/>
<bean id="userDao" factory-bean="userFactory" factory-method="getUserDao"/>
IoC使用(入门)
1.在pom.xml中依赖模块
2.在resource中创建spring config文件
3.配置bean
bean标签:id(名字),class(定义类型),name(取别名),scope(是否为单例)
4.写main方法
public class App2 {
public static void main(String[] args) {
//获取IoC容器
ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
//获取bean
BookDao bookDao=(BookDao) ctx.getBean("bookDao");
bookDao.save();
}
}
多种方法导入容器,获取bean
package org.example;
import org.example.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class AppForDIAtuoware {
public static void main(String[] args) {
//加载类路径下的配置文件
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
//加载类路径下的多个配置文件
ApplicationContext ctx3 = new ClassPathXmlApplicationContext("applicationContext.xml,applicationContext1.xml");
// 加载文件系统下的配置文件
ApplicationContext ctx2 =new FileSystemXmlApplicationContext("E:\\learnMaven\\learnspring\\src\\main\\resources\\applicationContext.xml");
//加载bean方法一:强转
BookDao bookDao=(BookDao) ctx.getBean("bookDao");
// 加载bean方法二:强转
BookDao bookDao1=ctx.getBean("bookDao",BookDao.class);
// 加载bean方法三:通过类型去寻找
BookDao bookDao2=ctx.getBean(BookDao.class);
bookDao.save();
bookDao1.save();
}
}
DI操作(入门)
1.不能出现new对象,要写set方法
public class BookServiceimpl implements BookService {
private BookDao bookDao;
public void save(){
System.out.println("book service save");
bookDao.save();
}
public void setBookDao(BookDao bookDao){
this.bookDao=bookDao;
}
}
2.写property
name表示配置哪个具体的属性
ref表示参照哪一个bean(投入bean的id)
<bean id="bookDao" class="org.example.dao.impl.BookDaoimpl"/>
<bean id="bookService" class="org.example.service.impl.BookServiceimpl">
<property name="bookDao" ref="bookDao"/>
</bean>
Aop(面向切面编程)
Aspect Oriented Programming:一种编程范式,指导开发者如何组织程序结构
作用:在不惊动原始设计的基础上为其进行功能增强
spring理念:无切入与入侵
核心内容
目标对象( Target ):原始功能去掉共性功能对应的类产生的对象,这种对象是无法直接完成最终工作的
代理( Proxy ):目标对象无法直接完成工作,需要对其进行功能回填,通过原始对象的代理对象实现
连接点( JoinPoint ):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等,在 SpringAOP 中,理解为方法的执行
切入点( Pointcut ):匹配连接点的式子,在 SpringAOP 中,一个切入点可以只描述一个具体方法,也可以匹配多个方法
通知( Advice ):在切入点处执行的操作,也就是共性功能,在 SpringAOP 中,功能最终以方法的形式呈现
通知类:定义通知的类
切面( Aspect ):描述通知与切入点的对应关系
工作流程
Spring容器启动->读取所有配置的切入点->初始化bean,并判断是否可以插入->失败创建对象,成功创建代理对象
基础操作
实用开发
Aspect(Aop思想实现)
data access/data integration(数据访问与集成)
MyBatis
持久层框架,用于简化jdbc的开发
与spring结合所需依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>