文章目录
什么是Spring
Spring是一个轻量级的,非侵入式的IOC和AOP的一站式java后端开发框架,简化企业级开发。
什么是耦合
两个或两个以上对象存在依赖,当一方修改之后会影响另一方,那么就说这些对象间存在耦合。
Spring优点和缺点
优点:Spring是一个容器,可以将对象管理起来,让创建对象和使用对象分离,降低耦合度,使用AOP的思想使程序扩展功能更加方便,可以轻松集成其他框架,比如mybatis。
缺点:配置量比较大,有很多模板化配置,依赖的jar比较多,使用了大量反射机制,反射机制非常占用内存。
IOC和AOP
IOC(Inversion of Control):控制反转,如果要使用某个对象,直接从IOC容器中获取,不再由自己创建和配置。
AOP(Aspect Oriented Programming),面向切面编程,AOP将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。
DI
DI(Dependency Injection),依赖注入,不是一种设计实现,而是一种具体的技术,在IOC容器运行期间,动态地将某个依赖对象注入到当前对象的技术就叫做依赖注入。
IOC VS DI
IOC是一种设计思想,而DI是一种具体的实现技术。但本质上都是为了降低耦合度。
Spring中注入对象的方式
- 变量注入
@Autowired
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
// ...
}
优点:注入方式简洁,没有多余的代码
缺点:注入的对象不能用final对象修饰。可能导致循环依赖问题,并且在启动的时候不会报错,只有在真正使用bean时候才会报错。
- 构造器注入:
@Service
public class UserServiceImpl implements UserService{
private final UserMapper userMapper;
@Autowired
public UserServiceIml(UserMapper userMapper){
this.userMapper = userMapper
}
}
优点:显示注明必须强制注入,防止发生空指针异常。注入的对象可以使用final修饰。可以避免循环依赖问题,如果存在循环依赖,项目启动就会报错,好找问题。
缺点:多个时,构造函数代码臃肿。
- set方法注入:
@Service
public class UserServiceImpl implements UserService{
private final UserMapper userMapper;
@Autowired
public void setUserMapper(UserMapper userMapper){
this.userMapper = userMapper
}
}
优点:依赖注入中使用的依赖对象是可选的,可以为NULL。可以在类构造完成后重新注入。
缺点:注入对象不能用final修饰。
自动注入的注解有哪些注解
@Autowired
:可以为属性自动注入值,可以写在属性上或setter方法上,写在字段上的话就不写在setter方法上。默认值不能为空,如果允许为空@Autowired(required = false)
没啥意义,下面业务也会报错。
可以通过属性类型去Spring容器中查找值
byType 按类型UserDao自动注入,该注解默认使用按类型自动装配 Bean 的方式。
byName@Qualifier(value='' userDao")
按名字去找
@Repository(value = "userDao") // 可以不写value DAO层建议Repository
public class UserDao{
public void insertUser(User user) {
}
}
@Service(value = "userService")
public class UserService {
/*
@Qualifier(value = "userDao")
@Resource(name = "userDao")*/
@Autowired
UserDao userDao;
public void saveUser(User user){
userDao.insertUser(user);
}
}
@Resource
:@Resource(name = "userDao")
jdk提供的,可以按名字和类型,默认名字,没有找到再按类型
Spring 中的 bean 和 new 的对象有什么区别
首先new对象,创建对象,需要初始化,先加载类文件,其次是对象所需要的内存,然后静态代码块会被调用,最后是构造方法。
Spring框架负责bean的生命周期管理,当bean不再需要时,spring会自动进行垃圾回收。
AOP 中的术语有哪些,通知有哪些
- 连接点:类中可以被增强的方法,称为连接点
- 切入点:实际被增强了的方法
- 通知:方法中被增强的功能。
- 切面:把通知添加到切入点的过程称为切面
- 目标:代理的目标对象(连接点,切入点所在的类),真正做这件事的类
- 代理:向目标对象应用通知时创建的代理对象。
通知分为
- 前置通知:在目标方法执行前的通知。
- 后置通知:在方法执行后的通知,无论方法是否抛出异常。
- 异常通知:在目标方法抛出异常时执行的通知。
- 最终通知:在目标方法成功执行并返回结果之后执行的通知。
- 环绕通知:可以在目标方法前后自定义逻辑,可以控制目标方法的执行流程。
Spring 实现 AOP 有哪几种方式
- 基于xml配置
- 注解实现
谈谈 Spring 事务管理,实现方式有几种,原理是什么?
事务是对数据库若干操作组成的一个单元。由于数据操作在顺序执行的时候,任何一步都有可能发生异常,后面的操作无法完成,之前的操作数据并不可靠,所以要进行回退。
事务的作用就是为了保证用户的每一个操作都是可靠的,只要发生异常就回到开始未操作的状态。这些操作要么都完成,要么都取消,从而保证数据一致性的要求。
- 基于xml配置实现
<!--配置spring 事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
- 注解实现
<!-- 开启注解事务管理器 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
声明式事务哪些场景下会失效
- @Transactional作用在非public权限方法上
- 异常被trycatch处理了
- 默认情况下出现编译异常是失效的 修改配置 @Transactional(rollbackFor = Exception.class)
- 数据库引擎不支持事务
- 同一个类中,使用非代理对象调用一个有事务的方法,导致事务错误
SpringWEB(springMVC)运行流程
spring 和 springboot 的关系区别
关系:SpringBoot是Spring的一个扩展,基于Spring的框架,旨在简化Spring程序的应用开发和部署。
区别:
- Spring配置过程相对复杂,需要手动配置servlet,映射等。SpringBoot的配置更为简单,采用约定大于配置的原则,提供了Spring运行的默认配置,大大简化了配置过程
- Spring的应用程序部署相对复杂。SpringBoot更简单,将很多模板化配置省略,简化应用的初始搭建及开发过程。