跳至主要內容

Java基础复习-Spring

Unisky大约 3 分钟学习面试Java

Java基础复习-Spring

这一部分主要是Spring和Bean相关概念的复习

1.Spring的两大特性

分别是AOP(面向切面编程)和IOC(依赖反转)

其中AOP是基于面向对象开发思想的一种补充,将业务代码中重复的部分封装为切面,实现这部分内容与业务代码的分离,降低代码的重复性和耦合度。

IOC是原本由我们去创建、管理的对象交由Spring容器进行管理,由Spring借助反射机制对Bean进行管理,使得对象的生命周期(从创建到销毁)不需要我们手动去管理。

2.Spring中AOP的实现方式

动态代理实现,包括JDK动态代理和CGLib动态代理

JDK动态代理要求相应的方法实现了某个接口,会自动生成相应的代理类,并借助反射机制去调用方法,类似于方法的拦截器,我们可以在执行方法之前或者之后作出相应功能的补充,所以我们就可以对其进行进一步的功能增强。

CGLib是继承方法对应的类,要求类不被final关键词修饰,通过继承的方式在子类去增加我们需要的功能。

Spring切面的工作称为Advise通知,包括五种类型,Spring中有相应的注解:

  • @Before,在目标方法调用之前调用通知功能
  • @After,在目标方法调用完毕以后调用通知
  • @AfterReturning, 目标方法执行成功后执行通知
  • @AfterThrowing,目标方法抛出异常后调用通知
  • @Around,即Before+After

3.Bean的生命周期

Bean的生命周期大致可以分为五个阶段:

  • 实例化:通过new方法或者反射机制创建Bean对象,并分配内存空间
  • 设置属性:Bean的依赖注入和装配
  • 初始化:Bean被创建后执行初始化操作,比如设置属性值等。
  • 使用:Bean对象可以在程序中被使用
  • 销毁:Bean对象不再使用以后,将其销毁并释放内存,可以通过配置文件指定

4.Spring的自动装配

Spring自动装配有三种模式,byType的根据类型装配,byName根据名称装配,以及constructor根据构造函数装配

byType,寻找依赖类型相同的Bean注入,需要借助setter方法注入,需要在XML文件中指定要注入的Bean类型

<bean id="userDao"  class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />

<!-- autowire-candidate="false" 过滤该类型 -->
<bean id="userDao2" autowire-candidate="false" class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />

<!-- byType 根据类型自动装配userDao-->
<bean id="userService" autowire="byType" class="com.zejian.spring.springIoc.service.impl.UserServiceImpl" />

byName,将属性名与bean名称匹配,若找到则注入依赖

<bean id="userDao"  class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />
<bean id="userDao2" class="com.zejian.spring.springIoc.dao.impl.UserDaoImpl" />

<!-- byName 根据名称自动装配,找到UserServiceImpl名为 userDao属性并注入-->
<bean id="userService" autowire="byName" class="com.zejian.spring.springIoc.service.impl.UserServiceImpl" />

constructor,优先进行参数匹配,再进行名称优先匹配

5.Spring注入方式

Spring常见的注入方式包括构造器注入、setter方法,注解注入等

构造器注入通过@Autowired注解指定使用的构造方法,是最适用的注入方法

@Service
public class AService {
    BService bService;
    @Autowired
    public AService(BService bService) {
        this.bService = bService;
    }
}

setter方法注入,需要严格为成员对象提供set方法

@Service
public class BService {
    AService aService;

    @Autowired
    public void setaService(AService aService) {
        this.aService = aService;
    }
}

注解方式注入

适用于我们自己写的对象实例,使用@Autowired或者@Resource注解,前者默认优先按照类型装配,后者默认优先按照名称装配

6.Spring事务

编程式事务:通过编程的方式管理事务,这种方式带来了很大的灵活性,但很难维护。

声明式事务:将事务管理代码从业务方法中分离出来,通过aop进行封装。Spring声明式事务使得我们无需要去处理获得连接、关闭连接、事务提交和回滚等这些操作。使用 @Transactional 注解开启声明式事务